Cette page est en lecture seule. Vous pouvez afficher le texte source, mais ne pourrez pas le modifier. Contactez votre administrateur si vous pensez qu'il s'agit d'une erreur. ====== Manipulation de certificats SSL ====== ===== Générer un CSR ===== ==== Version simple ==== <code bash>openssl req -newkey rsa:2048 -subj /CN=example.com -nodes -keyout example.com.key -out example.com.csr</code> ou <code bash>CN="domain.tld" FILE=cert-domain.tld openssl req -newkey rsa:2048 -subj /CN=$CN -nodes -keyout $FILE.key -out $FILE.csr</code> ==== Version complète ==== <code bash> 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"</code> <note>Pour un certificat wildcard, utiliser en //CN// //*.domain.tld//.</note> <note tip>Pour voir les informations dans un fichier CSR, utiliser la commande suivante : <code bash>openssl req -noout -text -in example.com.csr</code></note> ==== 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// : <code>cp /etc/ssl/openssl.cnf /etc/ssl/private/openssl-domaine.tld.cnf</code> * Modifier la copie : * Dans ''%%[req]%%'' ajouter : <code ini>req_extensions = v3_req</code> * Dans ''%%[v3_req]%%'' ajouter : <code ini>subjectAltName = @alt_names</code> * Ajouter la section suivante : <code ini>[alt_names] DNS.1 = alt1.domain.tld DNS.2 = alt2.domain.tld DNS.3 = alt3.domain.tld</code> * 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// : <code>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 [...]</code> ==== Vérifier la concordance d'une clé, d'un CSR et d'un certificat ==== * clé privée : <code bash>openssl rsa -noout -modulus -in server.key |openssl md5</code> * CSR : <code bash>openssl req -noout -modulus -in server.csr |openssl md5</code> * certificat : <code bash>openssl x509 -noout -modulus -in server.crt |openssl md5</code> ===== Génération d'un certificat SSL auto-signé ===== <note important>Privilégiez lorsque possible l'utilisation d'un certificat valide, par exemple via [[informatique:securite:letsencrypt|Let's Encrypt]].</note> Pour faciliter la suite, déclarons une variable d'environnement pour le nom de domaine pour lequel nous devons générer ce certificat : <code bash>export FQDN=test.example.com</code> Générerons ensuite la clé //RSA// : <code bash>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</code> Générons ensuite le certificat autosigné : <code bash>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</code> 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 : <code bash>openssl x509 -noout -text -in server.pem</code> Pour un CSR : <code bash>openssl req -noout -text -in server.csr</code> Pour un P12 : le convertir en PEM d'abord (cf. plus bas) ===== Convertir un P12 en PEM ===== <code bash>openssl pkcs12 -out file-out.pem -in file-in.p12</code> ===== Extraire les certificats d'un fichier PFX ===== * clé privée : <code bash>openssl pkcs12 -in server.pfx -nocerts -nodes -out server.key</code> * certificat : <code bash>openssl pkcs12 -in server.pfx -clcerts -nokeys -out server.crt</code> <note tip>Si vous rencontrez une erreur du type de celle ci-dessous, ajouter le paramètre ''-legacy'' aux commandes openssl: <code>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 ()</code></note> ===== 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// : <code apache> <IfModule mod_ssl.c> SSLCertificateFile /etc/ssl/certs/server.crt SSLCertificateKeyFile /etc/ssl/private/server.key </IfModule> </code> ou avec un seul fichier contenant la clé et le certificat : <code apache> <IfModule mod_ssl.c> SSLCertificateKeyFile /etc/ssl/private/server.pem </IfModule> </code> <note tip>Pour créé le fichier //PEM//, concaténez la clef privée et le certificat : <code bash>cat /etc/ssl/private/server.key /etc/ssl/certs/server.crt > /etc/ssl/private/server.pem </code></note> Puis activer ce fichier de configuration : <code bash>a2enconf ssl service apache2 restart</code> <note tip>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//) : <code bash>SSLCertificateChainFile cachaine.txt</code></note> ==== Activation du module SSL ==== <code bash>a2enmod ssl</code> ==== Activation du SSL sur un VirtualHost ==== Dans le fichier de définition du //VirtualHost// : <code apache> <VirtualHost *:443> ... SSLEngine On ... </VirtualHost> </code> ===== Utilisation d'un certificat SSL par OpenSSL ===== * Ajouter l'utilisateur ''openldap'' au groupe ''ssl-cert'' : <code bash>adduser openldap ssl-cert</code> * Redémarrer OpenLDAP : <code bash>service openldap restart</code> * Créer une version //fullchain// du certificat : <code bash>cat /etc/ssl/private/ldap.crt /etc/ssl/private/ldap-chain.crt > /etc/ssl/private/ldap-fullchain.crt</code> * Ajuster les droits du certificat et de la clé : <code bash>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 </code> * Configurer le certificat et la clé via les attributs ''olcTLSCertificateFile'' & ''olcTLSCertificateKeyFile'' de l'objet ''cn=config'' de la configuration d'OpenLDAP : <code bash> 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 : <code bash>service openldap restart</code> ===== Lister les ciphers supporté par un serveur ===== **Script :** <code bash>#!/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</code> **Usage :** <code># Usage : list_cipher [server:port]</code>