OpenSSL - Commandes utiles : Différence entre versions

De PedroWiki
(Liens utiles)
(Générer un CSR)
 
(12 révisions intermédiaires par le même utilisateur non affichées)
Ligne 7 : Ligne 7 :
 
* [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://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 30 : 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

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

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.csr

Vérifier le contenu d'un certificat SSL au format PEM

openssl x509 -in <nom_fichier_certif> -text -noout

Convertir DER (.crt .cer .der) au format PEM

openssl x509 -outform der -in certificate.cer -out certificate.der
openssl x509 -inform der -in certificate.der -out certificate.pem

Supprimer la passphrase d'une clé privée

openssl rsa -in /path/to/ssl/032019/withPassPhrase.key -out /path/to/ssl/withoutPassPhrase.key

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).