[FEATURE] Support des certificats SSL auto-signés pour l'authentification LDAP/AD
Problème
L'authentification LDAP avec STARTTLS échoue systématiquement avec les certificats auto-signés (erreur "start TLS KO"). Cela rend impossible l'utilisation de Jeedom avec Samba4 AD qui utilise par défaut des certificats auto-signés.
Solution proposée
Ajout d'une checkbox "Autoriser certificats auto-signés" dans la configuration LDAP qui désactive la vérification des certificats SSL lorsqu'elle est cochée. Par défaut décochée (comportement actuel conservé).
Implémentation
1. Fichier core/class/user.class.php
Modification des fonctions connect() et connectToLDAP() pour configurer les options SSL selon la checkbox :
Avant ldap_connect() :
if (config::byKey('ldap:allow_selfsigned')) {
putenv('LDAPTLS_REQCERT=never');
ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_NEVER);
} else {
putenv('LDAPTLS_REQCERT=demand');
ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_DEMAND);
}
Après ldap_connect() et avant ldap_start_tls() :
if (config::byKey('ldap:allow_selfsigned')) {
ldap_set_option($ad, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_NEVER);
} else {
ldap_set_option($ad, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_DEMAND);
}
2. Fichier desktop/php/administration.php
Ajout après la checkbox TLS (ligne ~1649) :
<div class="form-group">
<label class="col-md-3 col-sm-4 col-xs-12 control-label">{{Autoriser certificats auto-signés}}
<sup><i class="fas fa-question-circle" tooltip="{{Désactiver la vérification des certificats SSL pour les certificats auto-signés (requis pour Samba AD)}}"></i></sup>
</label>
<div class="col-md-3 col-sm-4 col-xs-12">
<input type="checkbox" class="configKey form-control" data-l1key="ldap:allow_selfsigned">
</div>
</div>
Patch complet
core/class/user.class.php - Fonction connect() (ligne ~56)
public static function connect(string $_login, string $_mdp) {
$sMdp = (!is_sha512($_mdp)) ? sha512($_mdp) : $_mdp;
if (config::byKey('ldap:enable') == '1' && function_exists('ldap_connect')) {
log::add("connection", "info", __('LDAP Authentification', __FILE__));
+ if (config::byKey('ldap:allow_selfsigned')) {
+ putenv('LDAPTLS_REQCERT=never');
+ ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_NEVER);
+ } else {
+ putenv('LDAPTLS_REQCERT=demand');
+ ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_DEMAND);
+ }
$ad = ldap_connect(config::byKey('ldap:host'), config::byKey('ldap:port'));
if (!$ad) {
log::add("connection", "info", __('Connection LDAP Error', __FILE__));
return false;
}
log::add("connection", "info", __('LDAP Connection OK', __FILE__));
ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ad, LDAP_OPT_REFERRALS, 0);
+ if (config::byKey('ldap:allow_selfsigned')) {
+ ldap_set_option($ad, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_NEVER);
+ } else {
+ ldap_set_option($ad, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_DEMAND);
+ }
if (config::byKey('ldap:tls')) {
if (!ldap_start_tls($ad)) {
log::add("connection", "debug", __('start TLS KO', __FILE__));
return false;
+ } else {
+ log::add("connection", "debug", __('start TLS OK', __FILE__));
}
}
core/class/user.class.php - Fonction connectToLDAP() (ligne ~155)
public static function connectToLDAP() {
+ if (config::byKey('ldap:allow_selfsigned')) {
+ putenv('LDAPTLS_REQCERT=never');
+ ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_NEVER);
+ } else {
+ putenv('LDAPTLS_REQCERT=demand');
+ ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_DEMAND);
+ }
$ad = ldap_connect(config::byKey('ldap:host'), config::byKey('ldap:port'));
ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ad, LDAP_OPT_REFERRALS, 0);
+ if (config::byKey('ldap:allow_selfsigned')) {
+ ldap_set_option($ad, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_NEVER);
+ } else {
+ ldap_set_option($ad, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_DEMAND);
+ }
if (config::byKey('ldap:tls') && !ldap_start_tls($ad)) {
return false;
}
desktop/php/administration.php (ligne ~1649)
+ <div class="form-group">
+ <label class="col-md-3 col-sm-4 col-xs-12 control-label">{{Autoriser certificats auto-signés}}
+ <sup><i class="fas fa-question-circle" tooltip="{{Désactiver la vérification des certificats SSL pour les certificats auto-signés (requis pour Samba AD)}}"></i></sup>
+ </label>
+ <div class="col-md-3 col-sm-4 col-xs-12">
+ <input type="checkbox" class="configKey form-control" data-l1key="ldap:allow_selfsigned">
+ </div>
+ </div>
Tests
Testé en production avec Samba4 AD (certificats auto-signés) :
- STARTTLS sur port 389
- Checkbox décochée : STARTTLS échoue (comportement actuel)
- Checkbox cochée : STARTTLS fonctionne
- Aucun impact sur les installations existantes
Compatibilité
- Rétrocompatible (comportement par défaut inchangé)
- PHP 7.4, 8.0, 8.1, 8.2, 8.3
- Tous serveurs LDAP (OpenLDAP, Samba4 AD, Microsoft AD)
[FEATURE] Support des certificats SSL auto-signés pour l'authentification LDAP/AD
Problème
L'authentification LDAP avec STARTTLS échoue systématiquement avec les certificats auto-signés (erreur "start TLS KO"). Cela rend impossible l'utilisation de Jeedom avec Samba4 AD qui utilise par défaut des certificats auto-signés.
Solution proposée
Ajout d'une checkbox "Autoriser certificats auto-signés" dans la configuration LDAP qui désactive la vérification des certificats SSL lorsqu'elle est cochée. Par défaut décochée (comportement actuel conservé).
Implémentation
1. Fichier
core/class/user.class.phpModification des fonctions
connect()etconnectToLDAP()pour configurer les options SSL selon la checkbox :Avant
ldap_connect():Après
ldap_connect()et avantldap_start_tls():2. Fichier
desktop/php/administration.phpAjout après la checkbox TLS (ligne ~1649) :
Patch complet
core/class/user.class.php- Fonctionconnect()(ligne ~56)public static function connect(string $_login, string $_mdp) { $sMdp = (!is_sha512($_mdp)) ? sha512($_mdp) : $_mdp; if (config::byKey('ldap:enable') == '1' && function_exists('ldap_connect')) { log::add("connection", "info", __('LDAP Authentification', __FILE__)); + if (config::byKey('ldap:allow_selfsigned')) { + putenv('LDAPTLS_REQCERT=never'); + ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_NEVER); + } else { + putenv('LDAPTLS_REQCERT=demand'); + ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_DEMAND); + } $ad = ldap_connect(config::byKey('ldap:host'), config::byKey('ldap:port')); if (!$ad) { log::add("connection", "info", __('Connection LDAP Error', __FILE__)); return false; } log::add("connection", "info", __('LDAP Connection OK', __FILE__)); ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ad, LDAP_OPT_REFERRALS, 0); + if (config::byKey('ldap:allow_selfsigned')) { + ldap_set_option($ad, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_NEVER); + } else { + ldap_set_option($ad, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_DEMAND); + } if (config::byKey('ldap:tls')) { if (!ldap_start_tls($ad)) { log::add("connection", "debug", __('start TLS KO', __FILE__)); return false; + } else { + log::add("connection", "debug", __('start TLS OK', __FILE__)); } }core/class/user.class.php- FonctionconnectToLDAP()(ligne ~155)public static function connectToLDAP() { + if (config::byKey('ldap:allow_selfsigned')) { + putenv('LDAPTLS_REQCERT=never'); + ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_NEVER); + } else { + putenv('LDAPTLS_REQCERT=demand'); + ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_DEMAND); + } $ad = ldap_connect(config::byKey('ldap:host'), config::byKey('ldap:port')); ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ad, LDAP_OPT_REFERRALS, 0); + if (config::byKey('ldap:allow_selfsigned')) { + ldap_set_option($ad, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_NEVER); + } else { + ldap_set_option($ad, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_DEMAND); + } if (config::byKey('ldap:tls') && !ldap_start_tls($ad)) { return false; }desktop/php/administration.php(ligne ~1649)Tests
Testé en production avec Samba4 AD (certificats auto-signés) :
Compatibilité