Ceci est une ancienne révision du document !
Manipulation de certificats SSL
Générer un CSR
Version simple
openssl req -newkey rsa:2048 -subj /CN=example.com -nodes -keyout example.com.key -out example.com.csr
ou
CN="domain.tld" FILE=cert-domain.tld openssl req -newkey rsa:2048 -subj /CN=$CN -nodes -keyout $FILE.key -out $FILE.csr
Version complète
CN="domain.tld" FILE=cert-domain.tld STATE=My State VILLE=My City PAYS=FR ORGA=My Company ORGA_UNIT=My Unit openssl req -new -newkey rsa:2048 -nodes -out $FILE.csr -keyout $FILE.key -subj "/C=$PAYS/ST=$STATE/L=$VILLE/O=$ORGA/OU=$ORGA_UNIT/CN=$CN"
Génération d'un CSR multi-domaine
Pour un certificat multi-domaine, c'est à dire incluant l’extension subjectAltName permetant la validité du certificat pour un nom de domaine principale ainsi que un ou plusieurs nom de domaine alternatif, voilà comment procéder :
- Copier le fichier de configuration openssl.cnf :
cp /etc/ssl/openssl.cnf /etc/ssl/private/openssl-domaine.tld.cnf
- Modifier la copie :
- Dans [req]] ajouter :
req_extensions = v3_req
- Dans [v3_req] ajouter :
subjectAltName = @alt_names
- Ajouter la section suivante :
[alt_names] DNS.1 = alt1.domain.tld DNS.2 = alt2.domain.tld DNS.3 = alt3.domain.tld
- Générer ensuite la CSR normalement (commande openssl req -new ~~~) en ajoutant le paramètre -config /etc/ssl/private/openssl-domaine.tld.cnf
- Une fois généré, vous pourrez constater en affichant le contenu de la CSR, l'utilisation de l'extention X509v3 Subject Alternative Name :
Certificate Request: Data: Version: 0 (0x0) Subject: C=FR, CN=domain.tld Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: [...] Exponent: 65537 (0x10001) Attributes: Requested Extensions: X509v3 Basic Constraints: CA:FALSE X509v3 Key Usage: Digital Signature, Non Repudiation, Key Encipherment X509v3 Subject Alternative Name: DNS:alt1.domain.tld, DNS:alt3.domain.tld, DNS:alt3.domain.tld Signature Algorithm: sha1WithRSAEncryption [...]
Vérifier la concordance d'une clé et d'un CSR
~# openssl rsa -noout -modulus -in server.key |openssl md5 XXXXXXXXXXXXXXXXXXXXXcfbf186e13f ~# openssl req -noout -modulus -in server.csr |openssl md5 XXXXXXXXXXXXXXXXXXXXXcfbf186e13f
Génération d'un certificat SSL auto-signé
Nous commençons par générer la bi-clé RSA, qui peut être protégée par une passphrase. Pour se faciliter la vie, on peut ne rien mettre pour la phrase de passe. Ceci nous évite de devoir la retaper à chaque redémarrage du serveur.
openssl genrsa -out server.key 1024
Nous générons ensuite le certificat autosigné
openssl req -new -x509 -days 365 -key server.key -out server.crt
Dans les questions posées, il faut faire attention au champ Common Name (eg, YOUR name) : Il faut mettre le nom du serveur (FQDN). Sinon, nous aurons un message comme quoi le nom du propriétaire du certificat et du site ne correspond pas.
- -x509 : génération d'un certificat autosigné, et non d'une simple requête
- -days 365 : le certificat est valable 365 jours
- -key server.key : la clé publique est extraite de la bi-clé précédente
- -out server.crt : le certificat est copié
Le certificat n'est pas signé par une autorité de certification (type verisign). Ainsi, lors de son utilisation, le browser affichera une anomalie. Pour information, sur verisign.fr, un certificat 40 bits coûte 450€ par an et un certificat pro de 128 bits coûte 1150€ par an.
Pour vérifier le bon usage du certificat :
openssl x509 -in server.crt -text -noout
Voir les informations contenues dans un certificat SSL
Pour un CRT :
openssl x509 -noout -text -in server.pem
Pour un CSR :
openssl req -noout -text -in server.csr
Pour un P12 : le convertir en PEM d'abord (cf. plus bas)
Convertir un P12 en PEM
openssl pkcs12 -out file-out.pem -in file-in.p12
Utilisation d'un certificat SSL par Apache
Après avoir généré un certificat SSL (cf. methode) :
Configuration générale du module SSL d'Apache
Créer le fichier /etc/apache2/conf.d/ssl :
<IfModule mod_ssl.c> SSLCertificateFile /etc/ssl/certs/server.crt SSLCertificateKeyFile /etc/ssl/private/server.key </IfModule>
ou
<IfModule mod_ssl.c> SSLCertificateKeyFile /etc/apache2/ssl/server.pem </IfModule>
NB : un fichier .pem est la concaténation de la clef privée et du certificat :
cat server.key > apache.pem cat server.crt >> apache.pem
NB2 : dans le cas de l'utilisation d'une clef certifié par une autorité fille d'une Autorité de certification connue des navigateurs, il faut ajouté une directive pour indiqué la ligné des certificats :
SSLCertificateChainFile cachaine.txt
Activation du module SSL
a2enmod ssl
Activation du SSL sur un VirtualHost
Dans le fichier de définition du VirtualHost :
<VirtualHost *:443> ... SSLEngine On ... </VirtualHost>
Lister les ciphers supporté par un serveur
Script :
#!/bin/bash # OpenSSL requires the port number. SERVER=$1 [ -z "$SERVER" -o "$SERVER" == "-h" ] && echo "Usage : $0 [server:port]" && exit 0 echo -n "Obtaining cipher list from local $(openssl version)..." ciphers=$(openssl ciphers 'ALL:eNULL' | sed -e 's/:/ /g') echo "Check cipher support on server $SERVER :" for cipher in ${ciphers[@]} do echo -n Testing $cipher... result=$(echo -n | openssl s_client -cipher "$cipher" -connect $SERVER 2>&1) if [[ "$result" =~ ":error:" ]] ; then error=$(echo -n $result | cut -d':' -f6) echo NO \($error\) else if [[ "$result" =~ "Cipher is ${cipher}" || "$result" =~ "Cipher :" ]] ; then echo YES else echo UNKNOWN RESPONSE echo $result fi fi done
Usage :
# Usage : list_cipher [server:port]