Table des matières

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"
Pour un certificat wildcard, utiliser en CN *.domain.tld.
Pour voir les informations dans un fichier CSR, utiliser la commande suivante :
openssl req -noout -text -in example.com.csr

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 :

Vérifier la concordance d'une clé, d'un CSR et d'un certificat

Génération d'un certificat SSL auto-signé

Privilégiez lorsque possible l'utilisation d'un certificat valide, par exemple via Let's Encrypt.

Pour faciliter la suite, déclarons une variable d'environnement pour le nom de domaine pour lequel nous devons générer ce certificat :

export FQDN=test.example.com

Générerons ensuite la clé RSA :

openssl genrsa -out /etc/ssl/private/${FQDN}.key 4096
chown root:ssl-cert /etc/ssl/private/${FQDN}.key
chmod 640 /etc/ssl/private/${FQDN}.key

Générons ensuite le certificat autosigné :

openssl req -new -x509 -days 3650 -key /etc/ssl/private/${FQDN}.key -out /etc/ssl/certs/${FQDN}.crt
chmod 644 /etc/ssl/certs/${FQDN}.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).

Paramètres :

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

Extraire les certificats d'un fichier PFX

Si vous rencontrez une erreur du type de celle ci-dessous, ajouter le paramètre -legacy aux commandes openssl:
4037E9E48B7F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:../crypto/evp/evp_fetch.c:373:Global default library context, Algorithm (RC2-40-CBC : 0), Properties ()

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-available/ssl.conf :

<IfModule mod_ssl.c>
  SSLCertificateFile    /etc/ssl/certs/server.crt
  SSLCertificateKeyFile /etc/ssl/private/server.key
</IfModule>

ou avec un seul fichier contenant la clé et le certificat :

<IfModule mod_ssl.c>
  SSLCertificateKeyFile /etc/ssl/private/server.pem
</IfModule>
Pour créé le fichier PEM, concaténez la clef privée et le certificat :
cat /etc/ssl/private/server.key /etc/ssl/certs/server.crt > /etc/ssl/private/server.pem

Puis activer ce fichier de configuration :

a2enconf ssl
service apache2 restart
Dans le cas de l'utilisation d'une clef certifiée par une autorité fille d'une autorité de certification connue des navigateurs, il faut ajouter une directive pour indiqué la ligné des certificats (appelée chaîne de certification) :
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]