Migration HowtoSSL from Trac (not yet completed, ~75%)
This commit is contained in:
parent
3a4caa7bda
commit
1457d92ab9
299
HowtoSSL.md
Normal file
299
HowtoSSL.md
Normal file
|
@ -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).
|
||||
|
||||
<https://www.openssl.org/docs/>
|
||||
|
||||
## 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 <http://security.ncsa.illinois.edu/research/grid-howtos/usefulopenssl.html>
|
||||
|
||||
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 <http://trac.evolix.net/infogerance/wiki/HowtoLetsEncrypt>
|
||||
|
||||
## 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 <path>
|
||||
~~~
|
||||
|
||||
### 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 : <https://github.com/drwetter/testssl.sh>
|
||||
|
||||
### Vérifier la conformité d'un certificat via des services externes
|
||||
|
||||
Nous conseillons d'utiliser l'outil complet SSL LABS : <https://www.ssllabs.com/ssltest/analyze.html>
|
||||
|
||||
D'autres outils également utiles :
|
||||
|
||||
* Pour une vérification simple (conforme ou non): <https://ssltools.thawte.com/checker/views/certCheck.jsp>
|
||||
|
||||
* Pour une vérification de la châine de certification : <https://whatsmychaincert.com/>
|
||||
|
||||
* Pour une vérification avancée : <https://ssldecoder.org/>
|
||||
|
||||
* Pour une vérification SSL/TLS orientée SMTP : <https://tls.imirhil.fr>
|
||||
|
||||
## Louer un certificat auprès d'une autorité de certificat
|
||||
|
||||
État du marche en 2015 : <http://www.netcraft.com/internet-data-mining/ssl-survey/>
|
||||
|
||||
Pour louer un certificat lié à **UN** nom de domaine :
|
||||
|
||||
* 0 EUR/ an : Let's Encrypt <http://XXXX>
|
||||
* 0 EUR/ an : StartSSL Free : <http://www.startssl.com/?app=1>
|
||||
* 6 EUR/ an : Comodo PositiveSSL : <http://www.namecheap.com/ssl-certificates/comodo/positivessl-certificate.aspx>
|
||||
* 12 EUR/ an : Gandi SSL standard : <http://www.gandi.net/ssl/standard>
|
||||
* 99 EUR/ an : Thawte SSL123 : <http://www.thawte.fr/ssl/ssl123-ssl-certificates/>
|
||||
|
||||
* 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 <http://trac.evolix.net/infogerance/wiki/HowtoLetsEncrypt>
|
||||
|
||||
## 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 <https://bugzilla.mozilla.org/show_bug.cgi?id=1037080> et une solution temporaire : <https://forum.startcom.org/viewtopic.php?p=8204#p8204>
|
||||
|
||||
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).
|
||||
<https://lut.im/EPSYOXoy/ckEgJEwU
|
||||
|
||||
Une autre "astuce" est d'utiliser un autre navigateur…
|
Loading…
Reference in a new issue