Installation d'openssl

 apt-get install openssl



Préparation de l'arborescence et du fichier de configuration d'openssl

La premiere chose à faire est de créer une arborescence pour les fichiers de l'authorité de certification, ici /root/CA/ :

 mkdir -p /root/CA/queret.net/{certs,crl,newcerts,private}
 touch /root/CA/queret.net/index.txt
 echo "01" > /root/CA/queret.net/serial
 echo "01" > /root/CA/queret.net/crlnumber

Il nous faut maintenant configurer OpenSSL pour qu'il connaisse notre arboresence comme celle d'une AC. Nous allons copier le fichier openssl.cnf présent dans /etc/ssl/ dans notre arboresence avant de le modifier.

 cp /etc/ssl/openssl.cnf /root/CA/queret.net/

Vous devez changer :

 * dir             = /root/CA/queret.net

Le fichier de configuration est divisé en sections, qui commencent par [ nom_de_la_section ]

Une AC est définie dans une section, le nom de l'AC dans le contexte d'OpenSSL est défini par le nom de cette section. La section particulière [ ca ] permet de définir l'AC par défault.

Le fichier de configuration contient un exemple ([ CA_default ]) qu'on va utiliser comme base pour l'exemple :



Création de l'authorité de certification (CA)

Il nous faut créer la bi-clé auto-signé pour l'AC :

 cd /root/CA/queret.net
 openssl req -config /root/CA/queret.net/openssl.cnf -x509 -newkey rsa:1024 -days 3650 -keyout private/cakey.pem -out cacert.pem
 Generating a 1024 bit RSA private key
 ..........................++
 ...........++
 writing new private key to 'private/cakey.pem'
 Enter PEM pass phrase: xxxxxxx
 Verifying - Enter PEM pass phrase: xxxxxxx
 -
 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) FR:
 State or Province Name (full name) Ile-de-France:
 Locality Name (eg, city) Paris:
 Organization Name (eg, company) Queret dot Net:
 Organizational Unit Name (eg, section) :
 Common Name (eg, YOUR name) :Queret dot Net AC
 Email Address :yoann@queret.net

Pour assurer la sécurité de la clé privée de l'AC, on restreint les permissions :

 chmod -R 600 /root/CA/queret.net/private

L'AC est maintenant configurée, on peut commencer à signer des demandes de certificats.



Génération d'un certificat serveur

On commence par générer une demande de certificat (un certificat non-signé).

 openssl req -config /root/CA/queret.net/openssl.cnf -newkey rsa:1024 -keyout queret.net.key -out queret.net.req
 Generating a 1024 bit RSA private key
 .........++
 ...........................................................++
 writing new private key to 'queret.net.key'
 Enter PEM pass phrase:
 Verifying - Enter PEM pass phrase:
 phrase is too short, needs to be at least 4 chars
 Enter PEM pass phrase: xxxxx
 Verifying - Enter PEM pass phrase: xxxxx
 -
 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) FR:
 State or Province Name (full name) Ile-de-France:
 Locality Name (eg, city) Paris:
 Organization Name (eg, company) Queret dot Net:
 Organizational Unit Name (eg, section) :
 Common Name (eg, YOUR name) :*.queret.net
 Email Address :yoann@queret.net
 
 Please enter the following 'extra' attributes
 to be sent with your certificate request
 A challenge password :
 An optional company name :

il faut émettre, et signer le certificat à partir de la demande précédente :

 openssl ca -config /root/CA/queret.net/openssl.cnf -in queret.net.req -out queret.net.pem
 Using configuration from /root/CA/queret.net/openssl.cnf
 Enter pass phrase for /root/CA/queret.net/private/cakey.pem:
 Check that the request matches the signature
 Signature ok
 Certificate Details:
         Serial Number: 1 (0x1)
         Validity
             Not Before: Aug 17 19:17:10 2009 GMT
             Not After : Aug 17 19:17:10 2010 GMT
         Subject:
             countryName               = FR
             stateOrProvinceName       = Ile-de-France
             organizationName          = Queret dot Net
             commonName                = *.queret.net
             emailAddress              = yoann@queret.net
         X509v3 extensions:
             X509v3 Basic Constraints: 
                 CA:FALSE
             Netscape Comment: 
                 OpenSSL Generated Certificate
             X509v3 Subject Key Identifier: 
                 B4:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:BD
             X509v3 Authority Key Identifier: 
                 keyid:BB:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:7C
 
 Certificate is to be certified until Aug 17 19:17:10 2010 GMT (365 days)
 Sign the certificate? y/n:y
 
 
 1 out of 1 certificate requests certified, commit? y/ny
 Write out database with 1 new entries
 Data Base Updated

Pour eviter que vos services (apache, postfix, courier, ..) nous demande de saisir la passphrase a chaque lancement (penser au logrotate qui reload apache), il faut supprimer la passphrase de la clef :

 mv queret.net.key queret.net-secret.key
 openssl rsa -in queret.net-secret.key -out queret.net.key

Utilisation du certificat avec apache

Je vous conseil de placer les fichiers dans /etc/apache2/ssl/

 mkdir /etc/apache2/ssl/
 cp queret.net.pem /etc/apache2/ssl/
 cp queret.net.key /etc/apache2/ssl/
 cp cacert.pem /etc/apache2/ssl/

Ainsi vous pourrez utiliser dans la config. de apache :

 SSLEngine on
 SSLCertificateFile    /etc/apache2/ssl/queret.net.crt
 SSLCertificateKeyFile    /etc/apache2/ssl/queret.net.key
 SSLCertificateChainFile /etc/apache2/ssl/ca.crt
 SSLCACertificateFile    /etc/apache2/ssl/ca.crt
 SSLVerifyClient None

Vous pouvez egalement fournir à vos visiteurs le fichier /root/CA/queret.net/cacert.pem en le renommant en ca.crt. En ouvrant ce fichier avec un navigateur le visiteur ce verrant demander si il souhaite ajouter cette authorité aux authorité de confiance. Ansi il n'aura plus de message d'avertissement.

Utilisation du certificat avec postfix (serveur SMTP)

On ne va pas rentrer ici dans les details sur le comment configurer postfix pour utiliser les certificats, juste les directives appelant les fichiers :

 smtpd_tls_cert_file=/etc/postfix/ssl/queret.net.crt
 smtpd_tls_key_file=/etc/postfix/ssl/queret.net.key
 smtpd_tls_CAfile = /etc/postfix/ssl/ca.crt
 
 smtp_tls_cert_file = /etc/postfix/ssl/queret.net.crt
 smtp_tls_key_file = /etc/postfix/ssl/queret.net.key
 smtp_tls_CAfile = /etc/postfix/ssl/ca.ctr

Utilisation du certificat avec courier (serveur POP/IMAP)

Courrier (imapd ou pop3d) necessite d'avoir le certificat et la clef dans un seul fichier PEM que vous devrez construire comme suit :

 -BEGIN CERTIFICATE-
 <ici le contenu du fichier queret.net.crt>
 -END CERTIFICATE-
 -BEGIN RSA PRIVATE KEY-
 <ici le contenu du fichier queret.net.key>
 -END RSA PRIVATE KEY-

Pour pour la configuration de courier pop3d-ssl & imapd-ssl dans les fichiers /etc/courier/imapd-ssl & /etc/courier/pop3d-ssl

 TLS_CERTFILE=/etc/courier/ssl/queret.net.pem
 TLS_TRUSTCERTS=/etc/courier/ssl/ca.pem

Utilisation du certificat avec proftpd (serveur FTP)

 TLSRSACertificateFile                   /etc/proftpd/ssl/queret.net.crt
 TLSRSACertificateKeyFile                /etc/proftpd/ssl/queret.net.key
 TLSCACertificateFile                     /etc/proftpd/ssl/ca.pem



Générer une clef client

Il faut générer un bi-clé :

 openssl req -config /root/CA/queret.net/openssl.cnf -newkey rsa:1024 -keyout yoann.key -out yoann.req
 Generating a 1024 bit RSA private key
 .++
 ...++
 writing new private key to 'yoann.key'
 Enter PEM pass phrase: xxxxxx
 Verifying - Enter PEM pass phrase: xxxxxx
 -
 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) FR:
 State or Province Name (full name) Ile-de-France:
 Locality Name (eg, city) Paris:
 Organization Name (eg, company) Queret dot Net:
 Organizational Unit Name (eg, section) :
 Common Name (eg, YOUR name) :Yoann QUERET
 Email Address :yoann@queret.net
 
 Please enter the following 'extra' attributes
 to be sent with your certificate request
 A challenge password :
 An optional company name :

Puis signer la demande de certificat par notre AC :

 openssl ca -config /root/CA/queret.net/openssl.cnf -in yoann.req -out yoann.pem
 Using configuration from /root/CA/queret.net/openssl.cnf
 Enter pass phrase for /root/CA/queret.net/private/cakey.pem:
 Check that the request matches the signature
 Signature ok
 Certificate Details:
         Serial Number: 2 (0x2)
         Validity
             Not Before: Aug 17 19:27:23 2009 GMT
             Not After : Aug 17 19:27:23 2010 GMT
         Subject:
             countryName               = FR
             stateOrProvinceName       = Ile-de-France
             organizationName          = Queret dot Net
             commonName                = Yoann QUERET
             emailAddress              = yoann@queret.net
         X509v3 extensions:
             X509v3 Basic Constraints: 
                 CA:FALSE
             Netscape Comment: 
                 OpenSSL Generated Certificate
             X509v3 Subject Key Identifier: 
                 DE:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:C8
             X509v3 Authority Key Identifier: 
                 keyid:BB:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:7C
 
 Certificate is to be certified until Aug 17 19:27:23 2010 GMT (365 days)
 Sign the certificate? y/n:y
 
 
 1 out of 1 certificate requests certified, commit? y/ny
 Write out database with 1 new entries
 Data Base Updated

Pour pouvoir importer la clé de l'utilisateur dans un navigateur web, il faut qu'elle soit au format PKCS#12:

 openssl pkcs12 -export -in yoann.pem -inkey yoann.key -out yoann.p12 -name "Yoann QUERET"
 Enter pass phrase for yoann.key:
 Enter Export Password:
 Verifying - Enter Export Password:

Utilisation de la clef client avec apache

Si vous voulez restreindre l'acces a votre site https au seul visiteurs possedant une clé PKCS#12, vous devez juste modifier la variable SSLVerifyClient à Yes dans votre configuration de apache.

 SSLVerifyClient Yes



Revoker un certificat

Pour révoquer un certificat, il est utile de connaître son numéro de série, car les certificats émis par l'AC sont stockés dans le répertoire /root/CA/queret.net/newcerts sous la forme <numéro>.pem. La correspondance entre les informations nominatives du certificat et le numéro de série est possible grâce à la base de donnée sauvée dans le fichier /root/CA/queret.net/index.txt.

 openssl ca -config /root/CA/queret.net/openssl.cnf -revoke ./newcerts/02.pem

Il faut également générer la CRL qui va permettre au serveur Apache d'être au courant de la revocation, par exemple :

 openssl ca -config /root/CA/queret.net/openssl.cnf -gencrl -out crl.pem

Il faut penser aussi a rejouter dans la configuration de apache :

 SSLCARevocationFile /etc/apache2/ssl/crl.pem

et de copier le fichier de la CRL a cette endroit :

 cp crl.pem /etc/apache2/ssl/crl.pem



Ressources

  • http://rtfm.asia/rubriques/systeme/98-apache-ssltls-mini-howto
  • http://www.andesi.org/reseau:gestion-de-certificats-avec-openssl