-
Notifications
You must be signed in to change notification settings - Fork 321
Open
Description
[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)
Metadata
Metadata
Assignees
Labels
No labels