OpenSSL - Commandes utiles : Différence entre versions
De PedroWiki
(→Générer un CSR) |
|||
(13 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 5 : | Ligne 5 : | ||
= Liens utiles = | = Liens utiles = | ||
− | [https://www.sslshopper.com/article-most-common-openssl-commands.html Page sur SSLShopper] | + | * [https://www.sslshopper.com/article-most-common-openssl-commands.html Page sur SSLShopper] |
+ | * [https://www.tbs-certificats.com/FAQ/fr/192.html Génération de CSR (TBS)] | ||
+ | * [https://en.wikipedia.org/wiki/Self-signed_certificate Wikipedia - Certifs autosignés] | ||
+ | * [https://www.ibm.com/docs/en/api-connect/2018.x?topic=overview-generating-self-signed-certificate-using-openssl Générer un certificat auto signé] | ||
+ | * [https://romain.therrat.fr/posts/2020/04/openssl-tester-la-compatibilit%C3%A9-d-une-version-de-tls/ Blog de Romain Therrat, post sur la compatibilité TLS d'openssl] | ||
= Commandes les plus utiles = | = Commandes les plus utiles = | ||
+ | |||
+ | == Vérifier les versions TLS supportées par un openssl == | ||
+ | |||
+ | openssl ciphers -v| awk '{ print $2 }'|sort|uniq | ||
+ | |||
+ | Exemple sur un vieux openssl: | ||
+ | |||
+ | <pre> | ||
+ | [root@hostname ~]# openssl ciphers -v| awk '{ print $2 }'|sort|uniq | ||
+ | SSLv3 | ||
+ | [root@hostname ~]# openssl version | ||
+ | OpenSSL 1.0.0-fips 29 Mar 2010 | ||
+ | </pre> | ||
+ | |||
+ | Exemple sur un openssl récent: | ||
+ | |||
+ | <pre> | ||
+ | user@hostname:~$ openssl ciphers -v| awk '{ print $2 }'|sort|uniq | ||
+ | SSLv3 | ||
+ | TLSv1 | ||
+ | TLSv1.2 | ||
+ | TLSv1.3 | ||
+ | user@hostname:~$ openssl version | ||
+ | OpenSSL 1.1.1d 10 Sep 2019 | ||
+ | </pre> | ||
+ | |||
+ | == Tester la compatibilité d'un service distant avec une version de TLS == | ||
+ | |||
+ | openssl s_client -connect google.com:443 -brief -<version_tls> | ||
+ | |||
+ | Exemple: | ||
+ | |||
+ | <pre> | ||
+ | user@hotname:~$ echo "Q" | openssl s_client -connect google.com:443 -brief -tls1_3 | ||
+ | CONNECTION ESTABLISHED | ||
+ | Protocol version: TLSv1.3 | ||
+ | Ciphersuite: TLS_AES_256_GCM_SHA384 | ||
+ | Peer certificate: CN = *.google.com | ||
+ | Hash used: SHA256 | ||
+ | Signature type: ECDSA | ||
+ | Verification: OK | ||
+ | Server Temp Key: X25519, 253 bits | ||
+ | DONE | ||
+ | user@hotname:~$ echo "Q" | openssl s_client -connect google.com:443 -brief -tls1_2 | ||
+ | CONNECTION ESTABLISHED | ||
+ | Protocol version: TLSv1.2 | ||
+ | Ciphersuite: ECDHE-ECDSA-CHACHA20-POLY1305 | ||
+ | Peer certificate: CN = *.google.com | ||
+ | Hash used: SHA256 | ||
+ | Signature type: ECDSA | ||
+ | Verification: OK | ||
+ | Supported Elliptic Curve Point Formats: uncompressed | ||
+ | Server Temp Key: X25519, 253 bits | ||
+ | DONE | ||
+ | </pre> | ||
+ | |||
+ | == Identifier les protos SSL dispos sur un service web == | ||
+ | |||
+ | for v in ssl2 ssl3 tls1 tls1_1 tls1_2 tls1_3; do \ | ||
+ | for c in $(openssl ciphers 'ALL:eNULL' | tr ':' ' '); do \ | ||
+ | openssl s_client -connect <URL>:443 -cipher $c -$v < /dev/null > /dev/null 2>&1 && echo -e "$v:\t$c"; \ | ||
+ | done; \ | ||
+ | done | ||
== Tester un port SSL == | == Tester un port SSL == | ||
openssl s_client -connect <host>:<port> | openssl s_client -connect <host>:<port> | ||
+ | |||
+ | == Générer un CSR == | ||
+ | |||
+ | openssl req -sha256 -nodes -newkey rsa:2048 -keyout www.monsite.com.key -out www.monsite.com.csr | ||
+ | |||
+ | A partir d'un fichier de détails: | ||
+ | |||
+ | openssl req -nodes -newkey rsa:2048 -sha256 -keyout monsite.key -out monsite.csr -config <(cat csr_details.txt) | ||
+ | |||
+ | Format du fichier de détails: | ||
+ | |||
+ | <pre> | ||
+ | [req] | ||
+ | default_bits = 2048 | ||
+ | prompt = no | ||
+ | default_md = sha256 | ||
+ | req_extensions = req_ext | ||
+ | distinguished_name = dn | ||
+ | |||
+ | [ dn ] | ||
+ | C=FR | ||
+ | ST=<Une région> | ||
+ | L=<Une ville> | ||
+ | O=<Une organisation> | ||
+ | OU=<Une OU> | ||
+ | emailAddress=<Un email de contact> | ||
+ | CN = <le CN souhaité, i.e. le nom à couvrir> | ||
+ | |||
+ | [ req_ext ] | ||
+ | subjectAltName = @alt_names | ||
+ | |||
+ | [ alt_names ] | ||
+ | DNS.1 = <alt_name_1> | ||
+ | DNS.2 = <alt_name_2> | ||
+ | IP.1 = <IP> | ||
+ | |||
+ | == Lire le contenu d'un CSR == | ||
+ | |||
+ | openssl req -noout -text -verify -in mon.domaine.com.csr | ||
== Vérifier le contenu d'un certificat SSL au format PEM == | == Vérifier le contenu d'un certificat SSL au format PEM == | ||
Ligne 29 : | Ligne 135 : | ||
Puis en interactif, renseigner la passphrase. Vous pouvez ensuite utiliser la clé sans passphrase pour vos configurations. | Puis en interactif, renseigner la passphrase. Vous pouvez ensuite utiliser la clé sans passphrase pour vos configurations. | ||
+ | == Vérifier la correspondance CSR/clé privée/clé publique == | ||
+ | |||
+ | Obtenir le hash md5 du modulus de chaque fichier et les comparer (ils doivent tous être identiques): | ||
+ | |||
+ | openssl x509 -in <clépublique> -noout -modulus | openssl md5 | ||
+ | openssl rsa -in <cléprivée> -noout -modulus | openssl md5 | ||
+ | openssl req -in <csr> -noout -modulus | openssl md5 | ||
+ | |||
+ | == Vérifier le bon ordre des clés publiques dans une chaîne == | ||
+ | |||
+ | Logique: | ||
+ | * partir de la clé publique de son certificat. | ||
+ | * avoir 1 fichier par clé publique faisant partie de la chaîne. | ||
+ | * si on considère que la clé publique est tout en haut, il faut en déterminer l'Issuer, et la clé à l'étage du dessous doit avoir un Subject strictement identique. | ||
+ | |||
+ | openssl x509 -in <clépublique> -text -noout | grep Issuer | ||
+ | |||
+ | Puis | ||
+ | |||
+ | openssl x509 -in <unedesclésdelachaine> -text -noout | grep Subject | ||
+ | |||
+ | La clé de la chaine ayant un Subject égal à l'issuer de la clé précédente vient à la suite. | ||
+ | |||
+ | Ensuite concaténer toutes ces clés dans un seul et même fichier: | ||
+ | |||
+ | cat <clépublique> > fullchain.pem | ||
+ | cat <cléAC1> >> fullchain.pem | ||
+ | ... | ||
+ | cat <cléACn> >> fullchain.pem | ||
+ | cat <cléRootCA> >> fullchain.pem | ||
+ | |||
+ | Vérifier qu'il n'y ait pas de mélange des BEGIN et END CERTIFICATE (ex: manque de retour à la ligne dans les fichiers). | ||
[[Category:Commande]] | [[Category:Commande]] | ||
[[Category:Howto]] | [[Category:Howto]] | ||
[[Category:SSL]] | [[Category:SSL]] |
Version actuelle datée du 29 janvier 2024 à 13:33
Sommaire
- 1 Introduction
- 2 Liens utiles
- 3 Commandes les plus utiles
- 3.1 Vérifier les versions TLS supportées par un openssl
- 3.2 Tester la compatibilité d'un service distant avec une version de TLS
- 3.3 Identifier les protos SSL dispos sur un service web
- 3.4 Tester un port SSL
- 3.5 Générer un CSR
- 3.6 Lire le contenu d'un CSR
- 3.7 Vérifier le contenu d'un certificat SSL au format PEM
- 3.8 Convertir DER (.crt .cer .der) au format PEM
- 3.9 Supprimer la passphrase d'une clé privée
- 3.10 Vérifier la correspondance CSR/clé privée/clé publique
- 3.11 Vérifier le bon ordre des clés publiques dans une chaîne
Introduction
Cet article liste les commandes openssl les plus couramment utilisées. Il y a déjà des 100aines de pages sur internet, l'idée de cet article est de capitaliser dans le temps à titre personnel.
Liens utiles
- Page sur SSLShopper
- Génération de CSR (TBS)
- Wikipedia - Certifs autosignés
- Générer un certificat auto signé
- Blog de Romain Therrat, post sur la compatibilité TLS d'openssl
Commandes les plus utiles
Vérifier les versions TLS supportées par un openssl
openssl ciphers -v| awk '{ print $2 }'|sort|uniq
Exemple sur un vieux openssl:
[root@hostname ~]# openssl ciphers -v| awk '{ print $2 }'|sort|uniq SSLv3 [root@hostname ~]# openssl version OpenSSL 1.0.0-fips 29 Mar 2010
Exemple sur un openssl récent:
user@hostname:~$ openssl ciphers -v| awk '{ print $2 }'|sort|uniq SSLv3 TLSv1 TLSv1.2 TLSv1.3 user@hostname:~$ openssl version OpenSSL 1.1.1d 10 Sep 2019
Tester la compatibilité d'un service distant avec une version de TLS
openssl s_client -connect google.com:443 -brief -<version_tls>
Exemple:
user@hotname:~$ echo "Q" | openssl s_client -connect google.com:443 -brief -tls1_3 CONNECTION ESTABLISHED Protocol version: TLSv1.3 Ciphersuite: TLS_AES_256_GCM_SHA384 Peer certificate: CN = *.google.com Hash used: SHA256 Signature type: ECDSA Verification: OK Server Temp Key: X25519, 253 bits DONE user@hotname:~$ echo "Q" | openssl s_client -connect google.com:443 -brief -tls1_2 CONNECTION ESTABLISHED Protocol version: TLSv1.2 Ciphersuite: ECDHE-ECDSA-CHACHA20-POLY1305 Peer certificate: CN = *.google.com Hash used: SHA256 Signature type: ECDSA Verification: OK Supported Elliptic Curve Point Formats: uncompressed Server Temp Key: X25519, 253 bits DONE
Identifier les protos SSL dispos sur un service web
for v in ssl2 ssl3 tls1 tls1_1 tls1_2 tls1_3; do \ for c in $(openssl ciphers 'ALL:eNULL' | tr ':' ' '); do \ openssl s_client -connect <URL>:443 -cipher $c -$v < /dev/null > /dev/null 2>&1 && echo -e "$v:\t$c"; \ done; \ done
Tester un port SSL
openssl s_client -connect <host>:<port>
Générer un CSR
openssl req -sha256 -nodes -newkey rsa:2048 -keyout www.monsite.com.key -out www.monsite.com.csr
A partir d'un fichier de détails:
openssl req -nodes -newkey rsa:2048 -sha256 -keyout monsite.key -out monsite.csr -config <(cat csr_details.txt)
Format du fichier de détails:
[req] default_bits = 2048 prompt = no default_md = sha256 req_extensions = req_ext distinguished_name = dn [ dn ] C=FR ST=<Une région> L=<Une ville> O=<Une organisation> OU=<Une OU> emailAddress=<Un email de contact> CN = <le CN souhaité, i.e. le nom à couvrir> [ req_ext ] subjectAltName = @alt_names [ alt_names ] DNS.1 = <alt_name_1> DNS.2 = <alt_name_2> IP.1 = <IP>Lire le contenu d'un CSR
openssl req -noout -text -verify -in mon.domaine.com.csrVérifier le contenu d'un certificat SSL au format PEM
openssl x509 -in <nom_fichier_certif> -text -nooutConvertir DER (.crt .cer .der) au format PEM
openssl x509 -outform der -in certificate.cer -out certificate.deropenssl x509 -inform der -in certificate.der -out certificate.pemSupprimer la passphrase d'une clé privée
openssl rsa -in /path/to/ssl/032019/withPassPhrase.key -out /path/to/ssl/withoutPassPhrase.keyPuis en interactif, renseigner la passphrase. Vous pouvez ensuite utiliser la clé sans passphrase pour vos configurations.
Vérifier la correspondance CSR/clé privée/clé publique
Obtenir le hash md5 du modulus de chaque fichier et les comparer (ils doivent tous être identiques):
openssl x509 -in <clépublique> -noout -modulus | openssl md5 openssl rsa -in <cléprivée> -noout -modulus | openssl md5 openssl req -in <csr> -noout -modulus | openssl md5Vérifier le bon ordre des clés publiques dans une chaîne
Logique:
- partir de la clé publique de son certificat.
- avoir 1 fichier par clé publique faisant partie de la chaîne.
- si on considère que la clé publique est tout en haut, il faut en déterminer l'Issuer, et la clé à l'étage du dessous doit avoir un Subject strictement identique.
openssl x509 -in <clépublique> -text -noout | grep Issuer
Puis
openssl x509 -in <unedesclésdelachaine> -text -noout | grep Subject
La clé de la chaine ayant un Subject égal à l'issuer de la clé précédente vient à la suite.
Ensuite concaténer toutes ces clés dans un seul et même fichier:
cat <clépublique> > fullchain.pem cat <cléAC1> >> fullchain.pem ... cat <cléACn> >> fullchain.pem cat <cléRootCA> >> fullchain.pemVérifier qu'il n'y ait pas de mélange des BEGIN et END CERTIFICATE (ex: manque de retour à la ligne dans les fichiers).