Gérer une authorité de certification (CA) complète avec OpenSSL (SSL/TLS)
Par Yoann le mercredi, 2 septembre 2009, 23:50 - L1nuX and c0 - Lien permanent
Quand vous allez sur un site e-commerce celui-ci se doit d'être sécurisé (HTTPS).
Cette sécurisation s'effectue grace à TLS (ou SSL - Par abus de langage, on parle de SSL pour désigner indifféremment SSL ou TLS.) qui a pour objectifs :
- l'authentification du serveur
- la confidentialité des données échangées
- l'intégrité des données échangées
Cela peut s'appliquer a des services aussi diverses que variés (POP, SMTP, IMAP, Jabber, FTP, VPN, ...) et ne se limite en aucun cas à HTTP. Sur le model OSI, ces services sont sur la couche 7 - applicative, tandis que SSL/TLS est sur la couche 5 - session.
Transport Layer Security (TLS), anciennement nommé Secure Socket Layer (SSL), est un protocole de sécurisation des échanges sur Internet, développé à l'origine par Netscape (SSL version 2 et SSL version 3). Il a été renommé en Transport Layer Security (TLS) par l'IETF suite au rachat du brevet de Netscape par l'IETF en 2001.
Je vous explique dans la suite de ce billet la mise en place d'une authorité de certification complete, qui va vous permettre de générer des certificats serveurs (http, ftp, pop, .., vpn, ..) & clients, de les signés, mais également de les revoquer.
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 :
- Voir le fichier openssl.cnf complet.
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
Commentaires
je suis une étudiante j'ai choisit ce thème et je besoin d'aide