====== 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 :
* 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é, d'un CSR et d'un certificat ====
* clé privée : openssl rsa -noout -modulus -in server.key |openssl md5
* CSR : openssl req -noout -modulus -in server.csr |openssl md5
* certificat : openssl x509 -noout -modulus -in server.crt |openssl md5
===== Génération d'un certificat SSL auto-signé =====
Privilégiez lorsque possible l'utilisation d'un certificat valide, par exemple via [[informatique:securite:letsencrypt|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 :**
* **''-x509'' :** génération d'un certificat auto-signé, et non d'une //CSR//
* **''-days 3650'' :** le certificat sera valable 3650 jours
===== 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 =====
* clé privée : openssl pkcs12 -in server.pfx -nocerts -nodes -out server.key
* certificat : openssl pkcs12 -in server.pfx -clcerts -nokeys -out server.crt
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// :
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
ou avec un seul fichier contenant la clé et le certificat :
SSLCertificateKeyFile /etc/ssl/private/server.pem
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// :
...
SSLEngine On
...
===== Utilisation d'un certificat SSL par OpenSSL =====
* Ajouter l'utilisateur ''openldap'' au groupe ''ssl-cert'' : adduser openldap ssl-cert
* Redémarrer OpenLDAP : service openldap restart
* Créer une version //fullchain// du certificat : cat /etc/ssl/private/ldap.crt /etc/ssl/private/ldap-chain.crt > /etc/ssl/private/ldap-fullchain.crt
* Ajuster les droits du certificat et de la clé : chown root:ssl-cert /etc/ssl/private/ldap-fullchain.crt /etc/ssl/private/ldap.key
chmod 644 /etc/ssl/private/ldap-fullchain.crt /etc/ssl/private/ldap-chain.crt /etc/ssl/private/ldap.crt
chmod 640 /etc/ssl/private/ldap.key
* Configurer le certificat et la clé via les attributs ''olcTLSCertificateFile'' & ''olcTLSCertificateKeyFile'' de l'objet ''cn=config'' de la configuration d'OpenLDAP :
ldapmodify -Y EXTERNAL -H ldapi:/// << EOF
dn: cn=config
changetype: modify
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/private/ldap-fullchain.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap.key
EOF
* Ajouter ''ldaps:///'' à la variable ''SLAPD_SERVICES'' dans le fichier ''/etc/default/slapd''
* Redémarrer OpenLDAP : service openldap restart
===== 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]