OpenSSL - Commandes utiles

De PedroWiki

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