Table of Contents

SSL

Authentification Utilisateurs Mot-de-passe

Présentation

LL::NG utilise le module SSL d'Apache, comme n'importe quel module d'authentification d'Apache avec quelques fonctionnalités supplémentaires :

Configuration

Activer SSL dans Apache

Installer mod_ssl pour Apache.

Pour CentOS/RHEL :

yum install mod_ssl

Dans Debian/Ubuntu mod_ssl est installé avec le paquet apache2.2-common.

Pour CentOS/RHEL, il est recommandé de désactiver l'hôte virtuel SSL par défaut configuré dans /etc/httpd/conf.d/ssl.conf.

Configuration globale de ssl dans Apache

Il est possible d'utiliser cette configuration SSL par défaut, par exemple en tête de /etc/lemonldap-ng/portal-apache2.conf :

SSLProtocol all -SSLv2
SSLCipherSuite HIGH:MEDIUM
SSLCertificateFile /etc/httpd/certs/ow2.cert
SSLCertificateKeyFile /etc/httpd/certs/ow2.key
SSLCACertificateFile /etc/httpd/certs/ow2-ca.cert
Placer vos propres fichiers au lieu de ow2.cert, ow2.key, ow2-ca.cert:
  • SSLCertificateFile : certificat serveur
  • SSLCertificateKeyFile : clef privée du serveur
  • SSLCACertificateFile : certificat d'autorité pour valider les certificats clients

SI le port est spécifié, déclarer le port SSL :

NameVirtualHost *:80
NameVirtualHost *:443

Configuration SSL du portail dans Apache

Éditer l'hôte virtuel du portail pour activer la double authentification SSL :

SSLEngine On
SSLVerifyClient optional
SSLVerifyDepth 10
SSLOptions +StdEnvVars
SSLUserName SSL_CLIENT_S_DN_CN

Toutes les options SSL sont documentées dans la page mod_ssl d'Apache.

Ci-dessous les principales options utilisées par LL::NG :

Configuration de LemonLDAP::NG

Dans le manager, aller dans Paramètres généraux > Modules d'authentification et choisir SSL pour l'authentification.

Vous pouvez ensuite choisir vos modules d'utilisateurs et de mots-de-passe.

Aller ensuite dans Paramètres SSL :

Rechargement automatique des certificats SSL

Problème connu : de nombreux navigateurs (Firefox, Chrome) enregistrent le fait qu'un certificat n'est pas disponible un certain temps. C'est particulièrement important pour les cartes à puce : lorsqu'elle n'est pas insérée avant que le navigateur ne démarre, l'utilisateur doit redémarrer ce dernier, ou au moins recharger la page (F5).

Il est possible d'éviter ceci avec un code AJAX et 3 "locations" Apache.

1. Modifier l'hôte virtuel du portail comme suit :

    SSLEngine On
    SSLCACertificateFile /etc/apache2/ssl/ca.crt
    SSLCertificateKeyFile /etc/apache2/ssl/lemonldap.key
    SSLCertificateFile /etc/apache2/ssl/lemonldap.crt
 
    SSLVerifyDepth 10
    SSLOptions +StdEnvVars
    SSLUserName SSL_CLIENT_S_DN_CN
 
    # DocumentRoot
    DocumentRoot /var/lib/lemonldap-ng/portal/
    <Directory /var/lib/lemonldap-ng/portal/>
        Order Deny,Allow
        Allow from all
        Options +ExecCGI +FollowSymLinks
        SSLVerifyClient none
    </Directory>
 
    <Location /index>
        Order Deny,Allow
        Allow from all
        SSLVerifyClient none
    </Location>
 
    <Location /testssl>
        Order Deny,Allow
        Allow from all
        SSLVerifyClient require
    </Location>
 
    Alias /sslok /var/lib/lemonldap-ng/portal
    <Location /sslok>
        Order Deny,Allow
        Allow from all
        SSLVerifyClient require
    </Location>

2. Il faut ensuite construire la page Ajax, par exemple dans /index/bouton.html. Ça ressemble à :

<body>
<script src="./jquery-2.1.4.min.js"             type="text/javascript"> </script>
<!--<script src="./jquery-ui-1.8-rass.js"   type="text/javascript">  </script>-->
 
 
<a href="http://www.google.fr" class="enteteBouton" id="continuerButton"><img src=authent.png></a>
<script>
$('.enteteBouton').click( function (e) {
  var b=navigator.userAgent.toLowerCase();
  if(b.indexOf("msie")!==-1){
    document.execCommand("ClearAuthenticationCache")
  }
  e.preventDefault();
  $.ajax({
        url:"https://auth.example.com/testssl",
        beforeSend:function(){},
        type:"GET",
        dataType:"html",
        success:function(c,a){ 
          if (c !== "") {
                alert("Carte OK");
                window.location.href = "https://auth.example.com/sslok/";
          }
          else {
              alert('Carte KO');
          }
        },
        error:function (xhr, ajaxOptions, thrownError){
          if(xhr.status==404) {
                alert("Carte OK");
                window.location.href = "https://auth.example.com/sslok/";
          }
          else {
              alert('Carte KO');
          }
        },
        complete:function(c,a){}
  });
});
</script>
</body>
Ce n'est pas compatible avec une chaîne d'authentification (voir Empiler plusieurs backends), en raison du paramètre Apache “SSLVerifyClient”, qui doit être mis à la valeur “require”