diff --git a/HowtoSSL.md b/HowtoSSL.md new file mode 100644 index 00000000..dbfd259a --- /dev/null +++ b/HowtoSSL.md @@ -0,0 +1,299 @@ +--- +title: Howto SSL +categories: security web +... + +SSL (Secure Sockets Layer) est un protocole de sécurisation des échanges réseau. +Cela se base sur un principe de clé privée et clé publique (certificat) signée par une autorité. +On parle désormais de SSL/TLS car les normes récentes ont renommé SSL en TLS (Transport Layer Security). + + + +## Gestion clé privée / certificat + +### Générer un .csr + +Pour générer une clée privée non chiffrée (private.key) et sa demande de certificat associé (demande.csr) à transmettre à une autorité de certification : +~~~ +$ openssl req -newkey rsa:2048 -sha256 -nodes -keyout private.key -out demande.csr +~~~ + +À des fins "pédagogiques", on peut découper en 2 étapes, à savoir la génération de la clé privée (non chiffrée) et la demande de certificat : + +~~~ +$ 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 (certificate.crt) : + +~~~ +$ openssl x509 -x509toreq -sha256 -in certificate.crt -out demande.csr -signkey private.key +~~~ + +### Générer un certificat auto-signé + +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 : + +~~~ +$ openssl x509 -req -sha256 -days 1000 -in demande.csr -signkey private.key -out certificat.crt +~~~ + +Note : sous Debian, pour regénérer le certificat *snakeoil* (certificat autogénéré à l'installation) : + +~~~ +# make-ssl-cert generate-default-snakeoil --force-overwrite +~~~ + +### Générer un certificat multi-domaines avec subjectAltName + +Un certificat avec **subjectAltName** permet d'ajouter des noms de domaine secondaires (*subjectAltName*) en plus du nom de domaine principal (*Common Name*), ce qui est supporté par 99.9% des navigateurs récents. + +Modifier une copie du fichier `/etc/ssl/openssl.cnf` avant de générer le certificat pour : + +* Décommenter *req_extensions = v3_req* +* Dans la *section v3_req* mettre *subjectAltName = DNS:test1.example.com,DNS:test2.example.com,DNS:example.com* + +Puis générer la clé privée et le certificat associé (avec expiration dans 1000 jours) : + +~~~ +$ 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) : + +~~~ +$ openssl req -newkey rsa:2048 -nodes -sha256 -days 1000 -config openssl.cnf -extensions v3_req -keyout private.key -out demande.csr +~~~ + +### "Déprotéger" une clé privée + +Si une clé privée a été chiffrée (private.pem), on peut générer une version non chiffrée (private.key) ainsi : + +~~~ +$ openssl rsa -in private.pem -out private.key +$ rm private.pem +~~~ + +### Ajouter un mot de passe à une clé privée + +~~~ + $ openssl rsa -in private.pem -des3 -out private.key +writing RSA key +Enter PEM pass phrase: +Verifying - Enter PEM pass phrase: +~~~ + +### Changer le mot de passe d'une clé privée + +Il suffit de répéter les 2 étapes ci-dessus : +~~~ +$ openssl rsa -in private.pem -out private.key +$ openssl rsa -in private.key -des3 -out private-new.pem +$ rm private.pem private.key +$ mv private-new.pem private.pem +~~~ + +### Convertir un certificat PEM vers d'autres formats + + Voir + +Notamment pour PKCS 12 (ou PFX) vers PEM : + +~~~ +$ openssl pkcs12 -in private.pfx -out private.pem +~~~ + +S'il s'agit de la clé : + +~~~ +$ openssl pkcs12 -in private.pfx -nocerts -out private.pem +~~~ + +### Utilisation de Let's Encrypt + +Voir + +## Vérifications + +### Voir le contenu d'un certificat + +Pour voir le contenu d'un certificat (certificat.crt) : + +~~~ +$ openssl x509 -text -in certificat.crt +~~~ + +Pour voir le contenu d'un certificat d'un service réseau : + +~~~ +$ openssl s_client -connect ssl.example.com:443 +~~~ + +Pour voir le contenu d'une demande de certificat (demande.csr) : + +~~~ +$ openssl req -text -in demande.csr +~~~ + +Pour lire le format PFX : + +~~~ +$ openssl pkcs12 -info -in +~~~ + +### Vérifier la correspondance entre clé privée / certificat / .csr + +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 : + +~~~ +$ 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 +~~~ + +Si toutes les empreintes MD5 sont identiques, on est sûr que c'est issu de la clée privée. + +Pour vérifier en une seule commande : + +~~~ +$ diff <(openssl rsa -in private.key -modulus | grep Modulus) <(openssl x509 -in certificate.crt -modulus | grep Modulus) +~~~ + +### Vérifier qu'un certificat n'est pas révoqué + +Il faut d'abord trouver quel serveur OCSP est déclaré : + +~~~ +$ openssl x509 -noout -ocsp_uri -in certificate.crt +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 : + +~~~ +$ openssl ocsp -issuer chainfile.pem -cert certificat.crt -text -url http://ocsp.example.com -header "HOST" "www.example.com" +~~~ + +Dans le cas d'un certificat révoqué on verra les lignes suivantes : + +~~~ +Cert Status: revoked +Revocation Time: Nov 2 09:30:00 2014 GMT +~~~ + +### Vérifier la conformité d'un certificat en ligne de commande + +*La vérification en ligne de commande nécessite une machine GNU/Linux.* + +Pour vérifier un fichier de certificat en ligne de commande : + +~~~ +$ 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 : + +~~~ +$ 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) : + +~~~ +$ 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) : + +~~~ +$ openssl s_client -CApath /etc/ssl/certs -servername ssl.example.com -connect 192.0.2.42:443 +~~~ + +**Le certificat est conforme avec votre base locale de certificats CA si l'on obtient Verify return code: 0 (ok)** + +Si le code de retour est différent de 0, le certificat n'est pas conforme pour différentes raisons : + +* *Verify return code: 21 (unable to verify the first certificate)* : le certificat distant est signé par un certificat CA qui n'est pas dans votre base locale *ou* utilise un certificat intermédiaire inconnu (Note: il peut y avoir toute une chaîne de certification avec plusieurs certificats intermédiaires) + +Un script Bash permet également d'effectuer des vérifications : + +### Vérifier la conformité d'un certificat via des services externes + +Nous conseillons d'utiliser l'outil complet SSL LABS : + +D'autres outils également utiles : + +* Pour une vérification simple (conforme ou non): + +* Pour une vérification de la châine de certification : + +* Pour une vérification avancée : + +* Pour une vérification SSL/TLS orientée SMTP : + +## Louer un certificat auprès d'une autorité de certificat + +État du marche en 2015 : + +Pour louer un certificat lié à **UN** nom de domaine : + +* 0 EUR/ an : Let's Encrypt +* 0 EUR/ an : StartSSL Free : +* 6 EUR/ an : Comodo PositiveSSL : +* 12 EUR/ an : Gandi SSL standard : +* 99 EUR/ an : Thawte SSL123 : + +* 65 EUR/ an : Comodo PositiveSSL : http://www.namecheap.com/ssl-certificates/comodo/positivessl-wildcard-certificate.aspx +* 120 EUR/ an : Gandi SSL standard : http://www.gandi.net/ssl/standard +* 449 eur/ an : Thawte SSL Wildcard : http://www.thawte.fr/ssl/wildcard-ssl-certificates/ + +Pour louer un certificat multi-domaines : + +* Thawte + +Pour louer un certificat EV : + +* Gandi +* Thawte + +### À propos de StartSSL + +Il faut noter que *StartSSL Free* est bien gratuit mais a plusieurs inconvénients : + +* suite à des problèmes (TODO: mettre liens) Firefox envisage de supprimer les certificats CA de StartSSL en XXXX (TODO: mettre date et liens de référence) +* les certificats gratuits mentionnent les informations personnelles de la personne physique qui a créé le compte +* la gestion du renouvellement est lourde (votre compte expire tous les ans, et vous ne pouvez le renouveler que quelques jours avant...) +* vous pouvez créer uniquement des certificats liés à la personne physique qui a créé le compte (nom de domaine qui vous appartient personnellement ou appartient à votre société) : si vous créez plusieurs certificats pour le compte d'autres sociétés (vos clients par exemple) StartSSL finira pas rejeter vos demandes et vous devrez créer un compte pour chaque société +* la révocation d'un certificat est payante (environ 20 EUR) +* différents problèmes et bugs, voir FAQ + +### À propos de Let's Encrypt + + Let's Encrypt est un jeune projet qui a pour but de démocratiser l'usage de SSL/TLS pour le web en fournissant facilement des certificats gratuits. + Pour plus de détails voir + +## Sécurité et qualité des certificats + +Faille +Apache +Nginx +A+ sur SSL LABS + +## FAQ + +### Erreur "The OCSP server has no status for the certificate" avec nouveau certificat StartSSL + +Suite à la mise en place d'un certificat délivré par StartSSL, vous obtenez une erreur du type "An error occurred during a connection to ssl.example.com. The OCSP server has no status for the certificate. (Error code: sec_error_ocsp_unknown_cert) ? + +StartSSL semble mettre entre 6 et 12h à propager ses nouveaux certificats sur son serveur OCSP. Il faut donc patienter… + +### Bug avec Firefox et l'interface d'administration de StartSSL + +Il y a un bug avec l'interface d'administration StartSSL avec Firefox (Firefox embarque un mauvais certificat). Voir le bug report et une solution temporaire : + +Il faut supprimer le certificat "StartCom? Certification Authority" de l'autorité StartCom de type "Securité personne" (Software Security Device) dans les préférences de Firefox (Avancée --> Certificat). +