informatique:securite:manip_certificat_ssl

Différences

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

Lien vers cette vue comparative

Prochaine révision
Révision précédente
informatique:securite:manip_certificat_ssl [2014/04/22 09:07] – créée bn8informatique:securite:manip_certificat_ssl [2024/03/01 17:12] (Version actuelle) – [Extraire les certificats d'un fichier PFX] bn8
Ligne 1: Ligne 1:
 ====== Manipulation de certificats SSL ====== ====== Manipulation de certificats SSL ======
  
-===== Génération d'un certificat SSL auto-signé =====+===== Générer un CSR =====
  
 +==== Version simple ====
  
-Nous commençons par générer la bi-clé RSA, qui peut être protégée par une passphrasePour se faciliter la vie, on peut ne rien mettre pour la phrase de passeCeci nous évite de devoir la retaper à chaque redémarrage du serveur.+<code bash>openssl req -newkey rsa:2048 -subj /CN=example.com -nodes -keyout example.com.key -out example.com.csr</code>
  
-<code>openssl genrsa -out server.key 1024</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>
  
-Nous générons ensuite le certificat autosigné+==== Version complète ====
  
-  openssl req -new -x509 -days 365 -key server.key -out server.crt+<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>
  
-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 +<note>Pour un certificat wildcardutiliser en //CN// //*.domain.tld//.</note>
-  -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 informationsur verisign.fr, un certificat 40 bits coûte 450€ par an et un certificat pro de 128 bits coûte 1150€ par an.+<note tip>Pour voir les informations dans un fichier CSRutiliser la commande suivante : <code bash>openssl req -noout -text -in example.com.csr</code></note>
  
-**Pour vérifier le bon usage du certificat :**+==== Génération d'un CSR multi-domaine ====
  
-  openssl x509 -in server.crt -text -noout+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 ===== ===== 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 35: 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 45: 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 78: 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.1398157637.txt.gz
  • Dernière modification : 2014/04/22 09:07
  • de bn8