Skip to content

[FEATURE] Support des certificats SSL auto-signés pour l'authentification LDAP/AD #3136

@SSHNuke0

Description

@SSHNuke0

[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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions