From a8ef8bedef88f1a3ac6eee6a0e92640c5cc586ef Mon Sep 17 00:00:00 2001 From: gcolpart Date: Thu, 27 Oct 2016 02:46:43 +0200 Subject: [PATCH] =?UTF-8?q?petites=20am=C3=A9liorations/corrections?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HowtoSSL.md | 51 +++++++++++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/HowtoSSL.md b/HowtoSSL.md index 97ed7184..839c7ce8 100644 --- a/HowtoSSL.md +++ b/HowtoSSL.md @@ -16,20 +16,20 @@ On parle désormais de **SSL/TLS** car les normes récentes ont renommé SSL en Pour générer une clé privée non chiffrée (private.key) et sa demande de certificat associé (demande.csr) à transmettre à une autorité de certification : -~~~ +~~~{.bash} $ openssl req -newkey rsa:2048 -sha256 -nodes -keyout private.key -out demande.csr ~~~ À des fins pédagogiques, on peut découper la cette génération en 2 étapes, à savoir la génération de la clé privée et la demande de certificat : -~~~ +~~~{.bash} $ openssl genrsa -out private.key 2048 $ openssl req -new -sha256 -key private.key -out demande.csr ~~~ Pour générer une demande de certificat à partir d'un certificat existant (certificat.crt) : -~~~ +~~~{.bash} $ openssl x509 -x509toreq -sha256 -in certificat.crt -out demande.csr -signkey private.key ~~~ @@ -38,7 +38,7 @@ $ openssl x509 -x509toreq -sha256 -in certificat.crt -out demande.csr -signkey p 1. Prérequis : avoir généré une clé et une demande de certificat (voir ci dessus) 2. Génération du certificat avec expiration dans 1000 jours : -~~~ +~~~{.bash} $ openssl x509 -req -sha256 -days 1000 -in demande.csr -signkey private.key -out certificat.crt ~~~ @@ -59,13 +59,13 @@ Modifier une copie du fichier `/etc/ssl/openssl.cnf` avant de générer le certi Puis générer la clé privée et le certificat associé (avec expiration dans 1000 jours) : -~~~ +~~~{.bash} $ openssl req -newkey rsa:2048 -nodes -x509 -sha256 -days 1000 -config openssl.cnf -extensions v3_req -keyout private.key -out certificat.crt ~~~ Si l'on veut plutôt une demande de certificat (pour transmettre à une autorité de certification) : -~~~ +~~~{.bash} $ openssl req -newkey rsa:2048 -nodes -sha256 -days 1000 -config openssl.cnf -extensions v3_req -keyout private.key -out demande.csr ~~~ @@ -73,7 +73,7 @@ $ openssl req -newkey rsa:2048 -nodes -sha256 -days 1000 -config openssl.cnf -ex Si une clé privée a été chiffrée (private.pem), on peut générer une version non chiffrée (private.key) ainsi : -~~~ +~~~{.bash} $ openssl rsa -in private.pem -out private.key $ rm private.pem ~~~ @@ -81,7 +81,7 @@ $ rm private.pem ### Ajouter un mot de passe à une clé privée ~~~ - $ openssl rsa -in private.pem -des3 -out private.key +$ openssl rsa -in private.pem -des3 -out private.key writing RSA key Enter PEM pass phrase: Verifying - Enter PEM pass phrase: @@ -91,7 +91,7 @@ Verifying - Enter PEM pass phrase: Il suffit de répéter les 2 étapes ci-dessus : -~~~ +~~~{.bash} $ openssl rsa -in private.pem -out private.key $ openssl rsa -in private.key -des3 -out private-new.pem $ rm private.pem private.key @@ -100,17 +100,17 @@ $ mv private-new.pem private.pem ### Convertir un certificat PEM vers d'autres formats - Voir +Voir Notamment pour PKCS 12 (ou PFX) vers PEM : -~~~ +~~~{.bash} $ openssl pkcs12 -in private.pfx -out private.pem ~~~ S'il s'agit de la clé : -~~~ +~~~{.bash} $ openssl pkcs12 -in private.pfx -nocerts -out private.pem ~~~ @@ -124,25 +124,25 @@ Voir Pour voir le contenu d'un certificat (certificat.crt) : -~~~ +~~~{.bash} $ openssl x509 -text -in certificat.crt ~~~ Pour voir le contenu d'un certificat d'un service réseau : -~~~ +~~~{.bash} $ openssl s_client -connect ssl.example.com:443 ~~~ Pour voir le contenu d'une demande de certificat (demande.csr) : -~~~ +~~~{.bash} $ openssl req -text -in demande.csr ~~~ Pour lire le format PFX : -~~~ +~~~{.bash} $ openssl pkcs12 -info -in certificat.pfx ~~~ @@ -150,7 +150,7 @@ $ openssl pkcs12 -info -in certificat.pfx Pour s'assurer qu'un certificat est bien issu d'un clé privée, ou d'une demande de certificat (.csr), on peut vérifier la correspondance grâce au *modulus* que l'on peut extraire et comparer : -~~~ +~~~{.bash} $ openssl x509 -noout -modulus -in certificat.crt | openssl md5 $ openssl rsa -noout -modulus -in private.key | openssl md5 $ openssl req -noout -modulus -in demande.csr | openssl md5 @@ -160,7 +160,7 @@ Si toutes les empreintes MD5 sont identiques, on est sûr que c'est issu de la c Pour vérifier en une seule commande : -~~~ +~~~{.bash} $ diff <(openssl rsa -in private.key -modulus | grep Modulus) <(openssl x509 -in certificate.crt -modulus | grep Modulus) ~~~ @@ -175,7 +175,7 @@ http://ocsp.example.com Puis, interroger le serveur OCSP obtenu (ici http://ocsp.example.com) avec la chaine de certification (chainfile.pem) et le certificat (certificat.crt) à vérifier : -~~~ +~~~{.bash} $ openssl ocsp -issuer chainfile.pem -cert certificat.crt -text -url http://ocsp.example.com -header "HOST" "www.example.com" ~~~ @@ -192,25 +192,25 @@ Revocation Time: Nov 2 09:30:00 2014 GMT Pour vérifier un fichier de certificat en ligne de commande : -~~~ +~~~{.bash} $ openssl verify -CApath /etc/ssl/certs certificat.crt ~~~ Pour vérifier la conformité d'un certificat d'un service réseau en ligne de commande : -~~~ +~~~{.bash} $ openssl s_client -CApath /etc/ssl/certs -connect ssl.example.com:443 ~~~ Pour un service réseau en STARTTLS (exemple avec SMTP, valable aussi pour POP3/IMAP/FTP) : -~~~ +~~~{.bash} $ openssl s_client -CApath /etc/ssl/certs -connect mail.site.com:25 -crlf -starttls smtp ~~~ Pour un service en HTTPS avec l'option SNI qui permet d'envoyer un nom de domaine au sein du protocole SSL/TLS (supporté par 99.9% des navigateurs récents) : -~~~ +~~~{.bash} $ openssl s_client -CApath /etc/ssl/certs -servername ssl.example.com -connect 192.0.2.42:443 ~~~ @@ -340,7 +340,7 @@ SSLProtocol All -SSLv2 -SSLv3 SSLCipherSuite AES128+EECDH:AES128+EDH SSLHonorCipherOrder On SSLCompression off -SSLSessionTickets off +#SSLSessionTickets off SSLSessionCache shmcb:/var/log/apache2/ssl_sessioncache(10240000) SSLUseStapling yes SSLStaplingReturnResponderErrors off @@ -350,14 +350,13 @@ Header always set Strict-Transport-Security "max-age=2592000" #### Configuration Nginx - En pratique avec Nginx (sous Debian 8), voici une configuration SSL avancée : ~~~ ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "AES128+EECDH:AES128+EDH"; ssl_prefer_server_ciphers on; -ssl_session_tickets off; +#ssl_session_tickets off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_stapling on;