informatique:securite:manip_certificat_ssl

Ceci est une ancienne révision du document !


Manipulation de certificats SSL

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
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.

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
        [...]
~# openssl rsa -noout -modulus -in server.key |openssl md5
XXXXXXXXXXXXXXXXXXXXXcfbf186e13f
~# openssl req -noout -modulus -in server.csr |openssl md5
XXXXXXXXXXXXXXXXXXXXXcfbf186e13f
~# openssl x509 -noout -modulus -in server.crt |openssl md5
XXXXXXXXXXXXXXXXXXXXXcfbf186e13f
Privilégiez lorsque possible l'utilisation d'un certificat valide, par exemple via Let's Encrypt.

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

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)

openssl pkcs12 -out file-out.pem -in file-in.p12
openssl pkcs12 -in file.pfx -clcerts -nokeys -out domain.crt
openssl pkcs12 -in file.pfx -nocerts -nodes  -out domain.key

Après avoir généré un certificat SSL (cf. methode) :

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
a2enmod ssl

Dans le fichier de définition du VirtualHost :

  <VirtualHost *:443>
     ...
     SSLEngine On
     ...
  </VirtualHost>

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]
  • informatique/securite/manip_certificat_ssl.1549304070.txt.gz
  • Dernière modification : 2019/02/04 18:14
  • de bn8