informatique:securite:manip_certificat_ssl

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
informatique:securite:manip_certificat_ssl [2014/04/22 09:11] – [Manipulation de certificats SSL] bn8informatique:securite:manip_certificat_ssl [2024/03/01 17:12] (Version actuelle) – [Extraire les certificats d'un fichier PFX] bn8
Ligne 5: Ligne 5:
 ==== Version simple ==== ==== Version simple ====
  
-  openssl req -newkey rsa:2048 -subj /CN=example.com -nodes -keyout example.com.key -out example.com.csr+<code bash>openssl req -newkey rsa:2048 -subj /CN=example.com -nodes -keyout example.com.key -out example.com.csr</code>
  
 ou ou
- +<code bash>CN="domain.tld" 
-  CN="domain.tld" +FILE=cert-domain.tld 
-  FILE=cert-domain.tld +openssl req -newkey rsa:2048 -subj /CN=$CN -nodes -keyout $FILE.key -out $FILE.csr</code>
-  openssl req -newkey rsa:2048 -subj /CN=$CN -nodes -keyout $FILE.key -out $FILE.csr+
  
 ==== Version complète ==== ==== Version complète ====
  
-  CN="domain.tld" +<code bash> 
-  FILE=cert-domain.tld +CN="domain.tld" 
-  STATE=My State +FILE=cert-domain.tld 
-  VILLE=My City +STATE=My State 
-  PAYS=FR +VILLE=My City 
-  ORGA=My Company +PAYS=FR 
-  ORGA_UNIT=My Unit +ORGA=My Company 
-  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"+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>
  
  
-==== Visualiser les infos contenues dans un CSR ====+<note>Pour un certificat wildcard, utiliser en //CN// //*.domain.tld//.</note>
  
-<code>openssl req -noout -text -in server.csr</code>+<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>
  
-==== Vérifier la concordance d'une clé et d'un CSR ====+==== Génération d'un CSR multi-domaine ====
  
-<code> +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 :
-~# openssl rsa -noout -modulus -in server.key |openssl md5 +
-XXXXXXXXXXXXXXXXXXXXXcfbf186e13f +
-~# openssl req -noout -modulus -in server.csr |openssl md5 +
-XXXXXXXXXXXXXXXXXXXXXcfbf186e13f +
-</code>+
  
-===== Génération d'un certificat SSL auto-signé =====+  * 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>
  
-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.+===== Génération d'un certificat SSL auto-signé =====
  
-<code>openssl genrsa -out server.key 1024</code>+<note important>Privilégiez lorsque possible l'utilisation d'un certificat valide, par exemple via [[informatique:securite:letsencrypt|Let's Encrypt]].</note>
  
-Nous générons ensuite le certificat autosigné+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> 
  
-  openssl req -new -x509 -days 365 -key server.key -out server.crt+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>
  
-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.+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>
  
-  * -x509 : génération d'un certificat autosignéet non d'une simple requête +Dans les questions poséesil faut faire attention au champ Common Name (eg, YOUR name) Il faut mettre le nom du serveur (FQDN).
-  * -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+
  
 +**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 ===== ===== Voir les informations contenues dans un certificat SSL =====
  
-Pour un CRT : <code>openssl x509 -noout -text -in server.pem</code>+Pour un CRT : <code bash>openssl x509 -noout -text -in server.pem</code>
  
-Pour un CSR : <code>openssl req -noout -text -in server.csr</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) Pour un P12 : le convertir en PEM d'abord (cf. plus bas)
Ligne 72: Ligne 96:
 ===== Convertir un P12 en PEM ===== ===== Convertir un P12 en PEM =====
  
-<code>openssl pkcs12 -out file-out.pem -in file-in.p12</code>+<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 ===== ===== Utilisation d'un certificat SSL par Apache =====
  
Ligne 82: Ligne 110:
 ==== Configuration générale du module SSL d'Apache ==== ==== Configuration générale du module SSL d'Apache ====
  
-Créer le fichier /etc/apache2/conf.d/ssl :+Créer le fichier ///etc/apache2/conf-available/ssl.conf// :
  
-  <IfModule mod_ssl.c> +<code apache> 
-    SSLCertificateFile    /etc/apache2/ssl/server.crt +<IfModule mod_ssl.c> 
-    SSLCertificateKeyFile /etc/apache2/ssl/server.key +  SSLCertificateFile    /etc/ssl/certs/server.crt 
-  </IfModule>+  SSLCertificateKeyFile /etc/ssl/private/server.key 
 +</IfModule
 +</code>
  
-ou +ou avec un seul fichier contenant la clé et le certificat :
  
-  <IfModule mod_ssl.c> +<code apache> 
-    SSLCertificateKeyFile /etc/apache2/ssl/server.pem +<IfModule mod_ssl.c> 
-  </IfModule>+  SSLCertificateKeyFile /etc/ssl/private/server.pem 
 +</IfModule
 +</code>
  
-**NB :** un fichier .pem est la concaténation de la clef privée et du certificat :+<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>
  
-  cat server.key apache.pem +Puis activer ce fichier de configuration : <code bash>a2enconf ssl 
-  cat server.crt >> apache.pem+service apache2 restart</code>
  
-**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 : +<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>
- +
-  SSLCertificateChainFile cachaine.txt+
  
 ==== Activation du module SSL ==== ==== Activation du module SSL ====
-  a2enmod ssl+<code bash>a2enmod ssl</code>
  
 ==== Activation du SSL sur un VirtualHost ==== ==== Activation du SSL sur un VirtualHost ====
 Dans le fichier de définition du //VirtualHost// : Dans le fichier de définition du //VirtualHost// :
  
 +<code apache>
   <VirtualHost *:443>   <VirtualHost *:443>
      ...      ...
Ligne 115: Ligne 148:
      ...      ...
   </VirtualHost>   </VirtualHost>
 +</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>
  • informatique/securite/manip_certificat_ssl.1398157896.txt.gz
  • Dernière modification : 2014/04/22 09:11
  • de bn8