vendredi 21 septembre 2012

Apache et SSL


Introduction

Trois possibilités :
  • si vous n'avez pas encore Apache installé sur le système : installer alors directement la version d'Apache avec le module SSL
  • si vous avez déjà Apache installé mais sans le module SSL : installer alors le module SSL et l'intégrer dans Apache
  • si vous avez déjà Apache installé avec le module SSL : tout est installé vous pouvez aller directement à la section suivante

Installation de Apache avec module SSL

Téléchargement

Sur Windows, pour télécharger le serveur HTTP "Apache" compilé avec le module SSL aller sur : http://httpd.apache.org/download.cgi

Sélectionner le lien "Win32 Binary including OpenSSL" de la version souhaitée.
Les deux versions du serveur HTTP "Apache" utilisées ici seront 2.0.63 et 2.2.10.
Les copies d'écrans ont été effectuées à partir de l'installation de la version 2.2.10.

Installation

Une fois le fichier téléchargé, le lancer pour débuter l'installation du produit.

Certaines étapes de l'installation sont importantes car elles vont permettre de configurer le serveur HTTP par défaut :
  • Page "Serveur Information" :
    • Network domain: sqli.com
    • Server Name: www.sqli.com
    • Administrator's Email Address: vfinet@sqli.com
    • Install for: Current user, port 8080, manually
  • Page "Setup type" : 
    • Type: Custom
    • Remarque : Pratique pour connaitre les éléments réellement installés.
  • Page "Custom Setup" :
    • Remarque : Tous les éléments sont sélectionnés, en particulier les binaires minimales de SSL.
Après l'installation, vous remarquez un nouvel icône qui donne le statut du service Apache.
Comme nous l'avons installé en mode manuel, pas étonnant de le trouver stopper.

Un nouveau menu est apparu dans le menu "Démarrer".
Il contient notamment un raccourci pour démarrer le serveur HTTP.

Pour Apache 2.0, on obtient le même résultat en lançant en ligne de commande :
$ C:
$ cd "C:\Program Files\Apache Group\Apache2"
$ .\bin\Apache -w -f .\conf\httpd.conf -d .
Pour Apache 2.2, on obtient le même résultat en lançant en ligne de commande :
$ C:
$ cd "C:\Program Files\Apache Software Foundation\Apache2.2"
$ .\bin\httpd -w -f .\conf\httpd.conf -d .
En ouvrant un Navigateur Internet, l'url "http://localhost:8080/" affiche la page d'accueil du serveur HTTP que vous venez d'installer.

Ceci permet de conclure que l'installation s'est bien déroulée et que la syntaxe du fichier de configuration d'Apache 2.2 est correcte.
Pour Apache 2.0, la page est différente : "Si vous lisez cette page, c'est que les propriétaires de ce domaine viennent d'installer le serveur web Apache avec succès...".


Installation du module SSL sur Apache (sans module SSL)

Téléchargement

[todo...]

Installation

[todo...]

Remarques suite à l'installation d'Apache

Le fichier de configuration

En éditant le fichier de configuration par défaut d'Apache (C:\Program Files\Apache Software Foundation\Apache2\conf\httpd.conf) on retrouve les informations que nous avions taper lors de l'installation à différents endroits du fichier :
[...]
ServerAdmin vfinet@sqli.com
[...]
ServerName www.sqli.com:8080
[...]

Le nom de domaine

Jusqu'ici nous n'avons pas encore tapé dans le navigateur Internet le nom de domaine que nous avions renseigné lors de l'installation, à savoir "www.sqli.com".
Hors si on essaye "http://www.sqli.com:8080" la requête ne va pas être interceptée par notre instance d'Apache (en local) mais par le serveur réellement appelé "www.sqli.com".
Tout se joue lors de la résolution de l'adresse www.sqli.com en adresse IP.
L'ordinateur local n'a pas été paramétré pour pouvoir résoudre l'adresse IP. Il relaie donc cette tache au serveur DNS du réseau...

Dans le cadre de nos tests, nous allons paramétrer l'ordinateur local pour qu'il reconnaisse "www.sqli.com" et redirige toutes les requêtes vers "127.0.0.1" (localhost).
Pour se faire, nous ajoutons dans le fichier "C:\WINDOWS\system32\drivers\etc\hosts" la ligne suivante:
127.0.0.1    www.sqli.com
Voici un exemple du fichier hosts par défaut de Windows :

A partir de ce moment, on peut adresser directement le nom du serveur avec l'url "http://www.sqli.com:8080".
L'ordinateur transfert alors toutes les requêtes faites à "www.sqli.com" vers l'adresse IP "127.0.0.1" qui n'est autre que l'adresse IP locale de la machine sans passer par un serveur DNS.


Activation du module SSL dans Apache

Première modification des fichiers de configuration (version 2.0 et 2.2)

Dans le fichier de configuration httpd.conf, enlever le '#' de la ligne "LoadModule ssl_module modules/mod_ssl.so" (que ce soit pour la version 2.0 ou 2.2 d'Apache).

Deuxième modification des fichiers de configuration (version 2.0)

Dans la version 2.0 d'Apache, le bloc suivant permet de charger le fichier conf/ssl.conf si le module SSL est chargé.
Ainsi nous n'avons pas de modification supplémentaire à apporter dans le fichier conf/httpd.conf puisque le simple fait d'activer le module va inclure la configuration SSL décrite dans le fichier indiqué.

Le fichier conf/ssl.conf sera donc parsé lors du lancement d'Apache puisque le module SSL a été activé.

Le fichier conf/ssl.conf contient par défaut les lignes principales suivantes (nous avons enlevé les lignes de commentaires et ajouté l'indentation pour une meilleure compréhension des informations contenues dans ce fichier) :
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
#SSLRandomSeed startup file:/dev/random  512
#SSLRandomSeed startup file:/dev/urandom 512
#SSLRandomSeed connect file:/dev/random  512
#SSLRandomSeed connect file:/dev/urandom 512
<IfDefine SSL>
    Listen 8443
    AddType application/x-x509-ca-cert .crt
    AddType application/x-pkcs7-crl .crl
    SSLPassPhraseDialog  builtin
#   SSLSessionCache none
#   SSLSessionCache shmht:logs/ssl_scache(512000)
#   SSLSessionCache shmcb:logs/ssl_scache(512000)
    SSLSessionCache dbm:logs/ssl_scache
    SSLSessionCacheTimeout 300
    SSLMutex default
    <VirtualHost _default_:8443>
        DocumentRoot "C:/Program Files/Apache Group/Apache2/htdocs"
        ServerName www.mydomain.com:8443
        ServerAdmin vfinet@sqli.com
        ErrorLog logs/error_log
        TransferLog logs/access_log
        SSLEngine on
        SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
        SSLCertificateFile conf/ssl.crt/server.crt
#       SSLCertificateFile conf/ssl.crt/server-dsa.crt
        SSLCertificateKeyFile conf/ssl.key/server.key
#       SSLCertificateKeyFile conf/ssl.key/server-dsa.key
#       SSLCertificateChainFile conf/ssl.crt/ca.crt
#       SSLCACertificatePath conf/ssl.crt
#       SSLCACertificateFile conf/ssl.crt/ca-bundle.crt
#       SSLCARevocationPath conf/ssl.crl
#       SSLCARevocationFile conf/ssl.crl/ca-bundle.crl
#       SSLVerifyClient require
#       SSLVerifyDepth 10
#       <Location />
#           SSLRequire (    %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
#               and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
#               and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \
#               and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \
#               and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20       ) \
#               or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/
#       </Location>
#       SSLOptions +FakeBasicAuth +ExportCertData +CompatEnvVars +StrictRequire
        <FilesMatch "\.(cgi|shtml|phtml|php3?)$">
            SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory "C:/Program Files/Apache Group/Apache2/cgi">
            SSLOptions +StdEnvVars
        </Directory>
        SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
        CustomLog logs/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
    </VirtualHost>
</IfDefine>

Deuxième modification des fichiers de configuration (version 2.2)

Dans la version 2.2 d'Apache, il faut enlever le '#' de la ligne "Include conf/extra/httpd-ssl.conf".
Le fichier conf/extra/httpd-ssl.conf sera donc parsé lors du lancement d'Apache.
On remarquera le bloc IfModule suivant définissant la propriété SSLRandomSeed. Cette définition était inclue dans le fichier de configuration SSL dans la version Apache 2.0.

Le fichier conf/extra/httpd-ssl.conf contient par défaut les lignes principales suivantes (nous avons enlevé les lignes de commentaires et ajouté l'indentation pour une meilleure compréhension des informations contenues dans ce fichier) :
#SSLRandomSeed startup file:/dev/random  512
#SSLRandomSeed startup file:/dev/urandom 512
#SSLRandomSeed connect file:/dev/random  512
#SSLRandomSeed connect file:/dev/urandom 512
Listen 443
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
SSLPassPhraseDialog  builtin
#SSLSessionCache "dbm:C:/Program Files/Apache Software Foundation/Apache2.2/logs/ssl_scache"
SSLSessionCache "shmcb:C:/Program Files/Apache Software Foundation/Apache2.2/logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300
SSLMutex default
<VirtualHost _default_:443>
    DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs"
    ServerName www.mydomain.com:443
    ServerAdmin vfinet@sqli.com
    ErrorLog "C:/Program Files/Apache Software Foundation/Apache2.2/logs/error.log"
    TransferLog "C:/Program Files/Apache Software Foundation/Apache2.2/logs/access.log"
    SSLEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile "C:/Program Files/Apache Software Foundation/Apache2.2/conf/server.crt"
#   SSLCertificateFile "C:/Program Files/Apache Software Foundation/Apache2.2/conf/server-dsa.crt"
    SSLCertificateKeyFile "C:/Program Files/Apache Software Foundation/Apache2.2/conf/server.key"
#   SSLCertificateKeyFile "C:/Program Files/Apache Software Foundation/Apache2.2/conf/server-dsa.key"
#   SSLCertificateChainFile "C:/Program Files/Apache Software Foundation/Apache2.2/conf/server-ca.crt"
#   SSLCACertificatePath "C:/Program Files/Apache Software Foundation/Apache2.2/conf/ssl.crt"
#   SSLCACertificateFile "C:/Program Files/Apache Software Foundation/Apache2.2/conf/ssl.crt/ca-bundle.crt"
#   SSLCARevocationPath "C:/Program Files/Apache Software Foundation/Apache2.2/conf/ssl.crl"
#   SSLCARevocationFile "C:/Program Files/Apache Software Foundation/Apache2.2/conf/ssl.crl/ca-bundle.crl"
#   SSLVerifyClient require
#   SSLVerifyDepth  10
#   <Location />
#       SSLRequire (    %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
#           and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
#           and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \
#           and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \
#           and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20       ) \
#           or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/
#   </Location>
#   SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
    <FilesMatch "\.(cgi|shtml|phtml|php)$">
        SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory "C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin">
        SSLOptions +StdEnvVars
    </Directory>
    BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
    CustomLog "C:/Program Files/Apache Software Foundation/Apache2.2/logs/ssl_request.log" "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

Avant d'aller plus loin...

Pour la suite des opération il convient (si ce n'est pas déjà fait) d'installer l'outil OpenSSL qui va nous permettre de générer des éléments de sécurité tel que des clef privée, des certificats et autres...

Se rendre à la page http://www.openssl.org/related/binaries.html pour télécharger l'outil pour Windows.

Et se laisser guider pour son installation sur le poste de travail.

Toujours sur Windows, si vous avez CygWin, il est possible d'avoir OpenSSL depuis cet environnement.
C'est cette dernière version que nous utiliserons dans la suite du document.

Création des éléments de sécurité SSL

Etape 1 : Création d'une clef privée pour le certificat serveur dans un fichier key

$ openssl genrsa -des -out mydomaincom.key 2048
Generating RSA private key, 2048 bit long modulus
......+++
................+++
e is 65537 (0x10001)
Enter pass phrase for mydomaincom.key:
Verifying - Enter pass phrase for mydomaincom.key:

Etape 2 : Exportation de la clef privée du serveur dans un fichier key sans passphrase

$ openssl rsa -in mydomaincom.key -out mydomaincom.nopassphrase.key
Enter pass phrase for mydomaincom.key:
writing RSA key

Etape 3 : Création d'un certificat auto-signé pour le serveur

$ openssl req -new -x509 -days 365 -key mydomaincom.key -out mydomaincom-autosigne.pem
Enter pass phrase for mydomaincom.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Gironde
Locality Name (eg, city) []:Bordeaux
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MY COMPANY
Organizational Unit Name (eg, section) []:MY UNIT
Common Name (eg, YOUR name) []:www.mydomain.com
Email Address []:myemail@mydomain.com

Etape 4 : Création d'une demande de certification pour le certificat serveur par une AC

$ openssl req -new -key mydomaincom.key -out mydomaincom.csr
Enter pass phrase for mydomaincom.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Gironde
Locality Name (eg, city) []:Bordeaux
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MY COMPANY
Organizational Unit Name (eg, section) []:MY UNIT
Common Name (eg, YOUR name) []:www.mydomain.com
Email Address []:myemail@mydomain.com
Please enter the following 'extra' attributes to be sent with your certificate request
A challenge password []:
An optional company name []:

Etape 5 : Création d'une clef privée pour le certificat client dans un fichier key

$ openssl genrsa -des -out myclient.key 2048Generating RSA private key, 2048 bit long modulus
.........................................................................................................+++
......................................................+++
e is 65537 (0x10001)
Enter pass phrase for myclient.key:
Verifying - Enter pass phrase for myclient.key:

Etape 6 : Création d'un certificat auto-signé pour le client

$ openssl req -new -x509 -days 365 -key myclient.key -out myclient-autosigne.pem
Enter pass phrase for myclient.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Gironde
Locality Name (eg, city) []:Bordeaux
Organization Name (eg, company) [Internet Widgits Pty Ltd]:SQLI
Organizational Unit Name (eg, section) []:SQLI
Common Name (eg, YOUR name) []:Vincent FINET
Email Address []:vfinet@sqli.com

$ openssl x509 -in myclient-autosigne.pem -out myclient-autosigne.crt

Etape 7 : Création d'une demande de certification pour le certificat client par une AC

$ openssl req -new -key myclient.key -out myclient.csr
Enter pass phrase for myclient.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Gironde
Locality Name (eg, city) []:Bordeaux
Organization Name (eg, company) [Internet Widgits Pty Ltd]:SQLI
Organizational Unit Name (eg, section) []:SQLI
Common Name (eg, YOUR name) []:Vincent FINET
Email Address []:vfinet@sqli.com
Please enter the following 'extra' attributes to be sent with your certificate request
A challenge password []:
An optional company name []:

Etape 8 : Création d'une clef privée pour l'AC #1

$ openssl genrsa -des -out AC1.key 2048
Generating RSA private key, 2048 bit long modulus
....................+++
............................................................................+++
e is 65537 (0x10001)
Enter pass phrase for AC1.key:
Verifying - Enter pass phrase for AC1.key:

Etape 9 : Création du certificat (auto-signé) de l'AC #1

$ openssl req -new -x509 -days 365 -key AC1.key -out AC1.pem
Enter pass phrase for AC1.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Gironde
Locality Name (eg, city) []:Bordeaux
Organization Name (eg, company) [Internet Widgits Pty Ltd]:AUTORITE CERT 1
Organizational Unit Name (eg, section) []:AUTORITE CERT 1
Common Name (eg, YOUR name) []:AUTORITE CERT 1
Email Address []:authoritycertificate@cert.com

$ openssl x509 -in AC1.pem -out AC1.crt

Etape 10 : Création d'une clef privée pour l'AC #2

$ openssl genrsa -des -out AC2.key 2048
Generating RSA private key, 2048 bit long modulus
....................+++
............................................................................+++
e is 65537 (0x10001)
Enter pass phrase for AC1.key:
Verifying - Enter pass phrase for AC1.key:

Etape 11 : Création du certificat (auto-signé) de l'AC #2

$ openssl req -new -x509 -days 365 -key AC2.key -out AC2.pem
Enter pass phrase for AC2.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Gironde
Locality Name (eg, city) []:Bordeaux
Organization Name (eg, company) [Internet Widgits Pty Ltd]:AUTORITE CERT 2
Organizational Unit Name (eg, section) []:AUTORITE CERT 2
Common Name (eg, YOUR name) []:AUTORITE CERT 2
Email Address []:authoritycertificate@cert.com

$ openssl x509 -in AC2.pem -out AC2.crt

Etape 12 : Création du certificat serveur signé par l'AC #1

$ openssl x509 -req -in mydomaincom.csr -out mydomaincom-signeAC1.pem -CA AC1.pem -CAkey AC1.key -CAcreateserial -days 365
Signature ok
subject=/C=FR/ST=Gironde/L=Bordeaux/O=MY COMPANY/OU=MY UNIT/CN=MY NAME/emailAddress=myemail@mycompany.fr
Getting CA Private Key
Enter pass phrase for AC1.key:

$ openssl x509 -in mydomaincom-signeAC1.pem -out mydomaincom-signeAC1.crt

Etape 13 : Création du certificat client signé par l'AC #1

$ openssl x509 -req -in myclient.csr -out myclient-signeAC1.pem -CA AC1.pem -CAkey AC1.key -CAcreateserial -days 365
Signature ok
subject=/C=FR/ST=Gironde/L=Bordeaux/O=SQLI/OU=SQLI/CN=Vincent FINET/emailAddress=vfinet@sqli.com
Getting CA Private Key
Enter pass phrase for AC1.key:

$ openssl x509 -in myclient-signeAC1.pem -out myclient-signeAC1.crt

Etape 14 : Création du certificat client signé par l'AC #2

$ openssl x509 -req -in myclient.csr -out myclient-signeAC2.pem -CA AC2.pem -CAkey AC2.key -CAcreateserial -days 365
Signature ok
subject=/C=FR/ST=Gironde/L=Bordeaux/O=SQLI/OU=SQLI/CN=Vincent FINET/emailAddress=vfinet@sqli.com
Getting CA Private Key
Enter pass phrase for AC2.key:

$ openssl x509 -in myclient-signeAC2.pem -out myclient-signeAC2.crt

Etape 15 : Création du trousseau PKCS#12 pour le client (auto-signe)

$ openssl pkcs12 -export -in myclient-autosigne.pem -inkey myclient.key -name "Certificat Vincent FINET auto-signe" -certfile myclient-autosigne.crt -out myclient-autosigne.p12Enter pass phrase for myclient.key:
Enter Export Password:
Verifying - Enter Export Password:

Etape 16 : Création du trousseau PKCS#12 pour le client (avec signature de l'AC #1)

$ openssl pkcs12 -export -in myclient-signeAC1.pem -inkey myclient.key -name "Certificat Vincent FINET signe par l'AC 1" -certfile myclient-signeAC1.crt -out myclient-signeAC1.p12Enter pass phrase for myclient.key:
Enter Export Password:
Verifying - Enter Export Password:

Etape 17 : Création du trousseau PKCS#12 pour le client (avec signature de l'AC #2)

$ openssl pkcs12 -export -in myclient-signeAC2.pem -inkey myclient.key -name "Certificat Vincent FINET signe par l'AC 2" -certfile myclient-signeAC2.crt -out myclient-signeAC2.p12Enter pass phrase for myclient.key:
Enter Export Password:
Verifying - Enter Export Password:

Premier paramétrage SSL : certificat serveur auto-signé

Dans cette section nous allons paramétrer Apache avec SSL pour que notre serveur HTTP expose un port d'écoute en SSL avec un certificat serveur auto-signé.

Modification du fichier de configuration SSL

Dans le fichier de configuration SSL d'Apache (version 2.0 et 2.2), il maintenant faut indiquer les certificats serveurs à utiliser.
SSLCertificateFile "C:/mydomaincom/security/mydomaincom-autosigne.crt"
SSLCertificateKeyFile "C:/mydomaincom/security/mydomaincom.nopassphrase.key"
#SSLCACertificateFile....
#SSLVerifyClient....
#SSLVerifyDepth....

Test

Après redémarrage d'Apache, le serveur HTTP présente bien le certificat auto-signé.
Une alerte va apparaître car le certificat est signé avec une AC non connue (c'est-à-dire lui même puisqu'il est auto-signé !).

Deuxième paramétrage SSL : certificat serveur signé par une autorité de certification

Dans cette section nous allons paramétrer Apache avec SSL pour que notre serveur HTTP expose un port d'écoute en SSL avec un certificat serveur signé par une autorité de certification.
L'autorité de certification est dans notre exemple une autorité "maison" que nous avons créé précédemment. Mais il s'agit de la même chose lorsque l'on manipule un certificat serveur signé par une autorité officielle (type Verisign)

Modification du fichier de configuration SSL

Dans le fichier de configuration SSL d'Apache (version 2.0 et 2.2), il maintenant faut indiquer les certificats serveurs à utiliser.
SSLCertificateFile "C:/mydomaincom/security/mydomaincom-signeAC1.crt
SSLCertificateKeyFile "C:/mydomaincom/security/mydomaincom.nopassphrase.key"
#SSLCACertificateFile....
#SSLVerifyClient....
#SSLVerifyDepth....

Test

Après redémarrage d'Apache, le serveur HTTP présente bien le certificat signé par une AC (la numéro 1).
Dans notre exemple, il s'agit d'une AC auto-signée. Vous aurez donc une alerte comme vu dans la section précédente. En effet, l'AC n'est pas connue de votre navigateur. Si on l'ajoute alors il n'y a plus d'alerte sécurité.
Si l'AC utilisée était officielle (type Verisign), alors vous n'auriez eu aucune alerte de sécurité !

Troisième paramétrage SSL : authentification mutuelle

Dans cette section nous allons paramétrer Apache avec SSL pour que notre serveur HTTP expose un port d'écoute en SSL avec activation de l'authentification mutuelle. Le serveur et le client doivent présenter des certificats signés par des ACs connues de part et d'autre. Les ACs utilisées peuvent être différentes.

Création du fichier contenant les certificats des ACs reconnues pour les clients

Ce fichier contient la concaténation des fichiers crt des ACs utilisables par les clients :
  • Si on veut authentifier des certificats client auto-signés il faut ajouter le fichier crt  auto-signé directement.
$ cat "C:/mydomaincom/security/myclient-autosigne.crt" > "C:/mydomaincom/security/myclient-all-ACs.crt"
  • Si on veut authentifier des certificats client signés par l'AC #1 on ajoute uniquement le crt correspondant (idem pour l'AC#2).
$ cat "C:/mydomaincom/security/AC1.crt" > "C:/mydomaincom/security/myclient-all-ACs.crt"
  • Si on veut authentifier des certificats client signés par l'AC#1 et l'AC#2 on ajoute les deux crt correspondants
$ cat "C:/mydomaincom/security/AC[1-2].crt" > "C:/mydomaincom/security/myclient-all-ACs.crt"

Modification du fichier de configuration SSL

Dans le fichier de configuration SSL d'Apache (version 2.0 et 2.2), il maintenant faut indiquer les certificats serveurs à utiliser.
SSLCertificateFile "C:/mydomaincom/security/mydomaincom-signeAC1.crt
SSLCertificateKeyFile "C:/mydomaincom/security/mydomaincom.nopassphrase.key"
SSLCACertificateFile "C:/mydomaincom/security/myclient-all-ACs.crt"
SSLVerifyClient require
SSLVerifyDepth 10
A la place de SSLCACertificateFile on peut utiliser la directive SSLCACertificatePath. On y indique un repertoire contenant des "hash symlinks" pointant vers les fichiers crt souhaités.
TODO : comment créer ces fichier symlinks ?

On peut ajouter des contrôles supplémentaires :
  • l'algorithme de chiffrement ne doit pas etre EXP ou NULL
  • dans le DN du certificat, l'organisation (O) doit etre exactement "CLIENT",
  • dans le DN du certificat, l'unité d'organisation (OU) peut être soit "DEV" soit "PROD" soit "COUNT",
  • les demandes ne sont permises que du lundi (WDAY=1) au vendredi (WDAY=5),
  • les demandes ne sont permises que de 8h00 à 20h00.
<Location />
    SSLRequire %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
        and %{SSL_CLIENT_S_DN_O} eq "CLIENT" \
        and %{SSL_CLIENT_S_DN_OU} in {"DEV", "PROD", "COUNT"} \
        and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \
        and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20
</Location>

Installation sur poste client

Sur le poste client installer les fichiers p12 créé plus haut.
Sous IE, on double clic sur le fichier.
Sous FF, il faut aller dans les options et importer le fichier p12.

Test

Après redémarrage d'Apache, le serveur HTTP présente bien le bon certificat et vous demande de spécifier un certificat présent dans votre magasin IE ou FF.
Remarquez que la liste de certificats proposée par votre navigateur correspond à la liste des certificats signés par les AC contenu dans le fichier myclient-all-ACs.crt (renvoyé par le serveur au client).
Ce test marche à la fois avec un certificat serveur auto-signé, un certificat serveur signé par l'AC1 ou l'AC2, un certificat client auto-signé, un certificat client signé par l'AC1 ou l'AC2.


WebAnalytics

Aucun commentaire:

Enregistrer un commentaire