GNU/Linux >> Tutoriels Linux >  >> Linux

6 options de commande OpenSSL que chaque administrateur système devrait connaître

La sécurité de la couche de transport (TLS) est un élément important de toute stratégie de sécurité, et les applications au-delà des serveurs Web tirent de plus en plus parti des protections offertes par la cryptographie à clé publique. La boîte à outils OpenSSL est l'utilitaire fondamental que tout administrateur système doit connaître s'il est responsable de la maintenance des applications protégées par TLS. Dans cet article, je présente certaines des commandes les plus courantes que j'utilise quotidiennement. Alors que de nombreux articles se concentrent sur la génération de demandes de signature de certificat (CSR) ou de certificats auto-signés, cet article passera un peu de temps à passer en revue les commandes OpenSSL et les lignes simples au-delà du processus de génération de certificat.

[ Vous pourriez également apprécier : Mettre les certificats CA à la disposition des outils de ligne de commande Linux ]

Vérification de la validité du certificat

L'une des étapes de dépannage les plus courantes consiste à vérifier la validité de base d'une chaîne de certificats envoyée par un serveur, ce qui peut être accompli par le openssl s_client commande. L'exemple ci-dessous montre une chaîne de certificats vérifiée avec succès envoyée par un serveur (redhat.com) après une connexion sur le port 443. Le -brief L'indicateur exclut certaines des sorties les plus détaillées qu'OpenSSL afficherait normalement. Notez que la "Vérification" est sortie comme "OK".

Par défaut, openssl s_client lira à partir de l'entrée standard les données à envoyer au serveur distant. Ajout d'un echo au one-liner envoie une nouvelle ligne et met immédiatement fin à la connexion. Sans cela, vous devrez appuyer sur Ctrl+C pour quitter la connexion.

$ echo | openssl s_client -connect redhat.com:443 -brief
CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-RSA-AES128-GCM-SHA256
Peer certificate: C = US, ST = North Carolina, L = Raleigh, O = "Red Hat, Inc.", OU = Information Technology, CN = *.redhat.com
Hash used: SHA256
Signature type: RSA
Verification: OK
Supported Elliptic Curve Point Formats: uncompressed
Server Temp Key: ECDH, P-256, 256 bits
DONE

Comparez la sortie ci-dessus avec l'exemple ci-dessous. Dans cette sortie, vous pouvez clairement voir que la vérification a échoué avec une erreur :"certificat auto-signé".

$ echo | openssl s_client -connect self-signed.badssl.com:443 -brief
depth=0 C = US, ST = California, L = San Francisco, O = BadSSL, CN = *.badssl.com
verify error:num=18:self signed certificate
CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-RSA-AES128-GCM-SHA256
Peer certificate: C = US, ST = California, L = San Francisco, O = BadSSL, CN = *.badssl.com
Hash used: SHA512
Signature type: RSA
Verification error: self signed certificate
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Server Temp Key: ECDH, P-256, 256 bits
DONE

Déterminer la date d'expiration d'un certificat

Chaque administrateur système a connu l'embarras qui découle de l'expiration d'un certificat pour un site Web destiné au public. Il existe de nombreux outils de surveillance pour garder un œil sur cela et s'assurer que cela ne vous arrive pas, mais que se passe-t-il si vous voulez simplement vérifier rapidement la date d'expiration d'un certificat à partir de la ligne de commande ? OpenSSL vous couvre.

La vérification de la date d'expiration d'un certificat implique une ligne composée de deux commandes OpenSSL :s_client et x509 . Vous avez déjà vu comment s_client établit une connexion à un serveur dans l'exemple précédent. En redirigeant la sortie vers x509 , vous pouvez obtenir la période de validité du certificat en utilisant les -dates drapeau. Vous trouverez ci-dessous des exemples de certificat valide et expiré.

# A valid certificate that hasn’t expired yet
$ echo | openssl s_client -connect redhat.com:443 2>/dev/null | openssl x509 -noout -dates
notBefore=Jul  9 00:00:00 2019 GMT
notAfter=Aug  2 12:00:00 2021 GMT

# A certificate that expired in 2015
$ echo | openssl s_client -connect expired.badssl.com:443 2>/dev/null | openssl x509 -noout -dates
notBefore=Apr  9 00:00:00 2015 GMT
notAfter=Apr 12 23:59:59 2015 GMT

Remarque  :Si vous recevez un certificat SSL par défaut à la place du certificat de serveur, consultez cette explication de SNI (Server Name Indication).

Vérification des extensions de certificat

Les extensions X509 permettent d'ajouter des champs supplémentaires à un certificat. L'un des plus courants est le nom alternatif du sujet (SAN). Le SAN d'un certificat permet d'associer plusieurs valeurs (par exemple, plusieurs FQDN) à un seul certificat. Le SAN est même utilisé lorsqu'il n'y a pas plusieurs valeurs, car l'utilisation du nom commun d'un certificat pour la vérification est obsolète.

Semblable à la précédente ligne unique, la sortie de canalisation entre plusieurs commandes OpenSSL facilite l'inspection d'extensions de certificat spécifiques et vous permet d'afficher les SAN associés à un certificat :

$  echo | openssl s_client -connect redhat.com:443 2>/dev/null | openssl x509 -noout -ext subjectAltName
X509v3 Subject Alternative Name:
    DNS:*.redhat.com, DNS:redhat.com

Un autre ensemble commun d'extensions comprend les contraintes de base et l'utilisation de la clé d'un certificat. Plus précisément, vous souhaiterez peut-être vérifier si un certificat est autorisé à être utilisé comme autorité de certification. Encore une fois, cela peut être fait de la même manière que vous pouvez rechercher un SAN :

$  openssl x509 -ext basicConstraints,keyUsage -noout -in /usr/share/ca-certificates/mozilla/VeriSign_Universal_Root_Certification_Authority.crt
X509v3 Basic Constraints: critical
    CA:TRUE
X509v3 Key Usage: critical
    Certificate Sign, CRL Sign

Vérification des chiffrements ou versions TLS obsolètes

D'excellents outils Web, tels que Qualys SSL Lab, existent pour vous fournir un rapport complet sur la sécurité de votre configuration TLS. Cela inclut de vous alerter de l'utilisation de suites de chiffrement non sécurisées et d'autres paramètres de configuration susceptibles d'affaiblir la posture de sécurité d'une ressource protégée par TLS. Cependant, vous voudrez peut-être simplement exécuter un test rapide à partir de la ligne de commande, et OpenSSL vous facilite la tâche.

Tout d'abord, vous pouvez répertorier les chiffrements pris en charge pour une version SSL/TLS particulière à l'aide des openssl ciphers commande. Ci-dessous, vous pouvez voir que j'ai répertorié les chiffrements pris en charge pour TLS 1.3. Le -s flag indique à la commande ciphers de n'imprimer que les chiffrements pris en charge par la version TLS spécifiée (-tls1_3 ):

$ openssl ciphers -s -tls1_3
TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256

Le s_client La commande peut ensuite être utilisée pour tester différentes versions de TLS et suites de chiffrement. Le site Web Ciphersuites.info est un référentiel utile d'informations sur la force de diverses suites de chiffrement. Par exemple, tenter d'utiliser la suite faible TLS_PSK_WITH_AES_128_CBC_SHA sur un serveur qui ne la prend pas en charge entraînera une erreur :

openssl s_client -connect redhat.com:443 -cipher PSK-AES128-CBC-SHA -quiet -no_tls1_3
139963477378368:error:141A90B5:SSL routines:ssl_cipher_list_to_bytes:no ciphers available:../ssl/statem/statem_clnt.c:3794:No ciphers enabled for max supported SSL/TLS version

De même, vous pouvez spécifier la version du protocole TLS utilisée dans la connexion. L'exemple ci-dessous montre que TLS 1.1 n'est pas pris en charge par le serveur. Assurez-vous de consulter la page de manuel pour voir une liste complète des options.

$ openssl s_client -connect redhat.com:443 -tls1_1 -quiet
139890998576448:error:141E70BF:SSL routines:tls_construct_client_hello:no protocols available:../ssl/statem/statem_clnt.c:1112:

Inspecter un certificat

J'ai couvert l'examen de parties particulières d'un certificat, telles que les dates de validité ou les extensions X509. Parfois, vous voulez simplement tout voir sur un certificat spécifique. L'utilitaire X509 peut être utilisé avec le -noout (pour supprimer l'impression du certificat encodé), -text (pour imprimer des informations textuelles sur le certificat), et le -in (pour spécifier le fichier d'entrée) drapeaux pour imprimer tout ce que vous voudriez savoir sur un certificat particulier. L'exemple ci-dessous utilise un fichier de certificat sur mon système local, mais vous pouvez tout aussi facilement rediriger la sortie de openssl s_client , comme dans les exemples précédents.

$ openssl x509 -text -noout -in /usr/share/ca-certificates/mozilla/VeriSign_Universal_Root_Certification_Authority.crt
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            40:1a:c4:64:21:b3:13:21:03:0e:bb:e4:12:1a:c5:1d
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = "VeriSign, Inc.", OU = VeriSign Trust Network, OU = "(c) 2008 VeriSign, Inc. - For authorized use only", CN = VeriSign Universal Root Certification Authority
        Validity
            Not Before: Apr  2 00:00:00 2008 GMT
            Not After : Dec  1 23:59:59 2037 GMT
        Subject: C = US, O = "VeriSign, Inc.", OU = VeriSign Trust Network, OU = "(c) 2008 VeriSign, Inc. - For authorized use only", CN = VeriSign Universal Root Certification Authority
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:c7:61:37:5e:b1:01:34:db:62:d7:15:9b:ff:58:
                    5a:8c:23:23:d6:60:8e:91:d7:90:98:83:7a:e6:58:
                    19:38:8c:c5:f6:e5:64:85:b4:a2:71:fb:ed:bd:b9:
                    da:cd:4d:00:b4:c8:2d:73:a5:c7:69:71:95:1f:39:
                    3c:b2:44:07:9c:e8:0e:fa:4d:4a:c4:21:df:29:61:
                    8f:32:22:61:82:c5:87:1f:6e:8c:7c:5f:16:20:51:
                    44:d1:70:4f:57:ea:e3:1c:e3:cc:79:ee:58:d8:0e:
                    c2:b3:45:93:c0:2c:e7:9a:17:2b:7b:00:37:7a:41:
                    33:78:e1:33:e2:f3:10:1a:7f:87:2c:be:f6:f5:f7:
                    42:e2:e5:bf:87:62:89:5f:00:4b:df:c5:dd:e4:75:
                    44:32:41:3a:1e:71:6e:69:cb:0b:75:46:08:d1:ca:
                    d2:2b:95:d0:cf:fb:b9:40:6b:64:8c:57:4d:fc:13:
                    11:79:84:ed:5e:54:f6:34:9f:08:01:f3:10:25:06:
                    17:4a:da:f1:1d:7a:66:6b:98:60:66:a4:d9:ef:d2:
                    2e:82:f1:f0:ef:09:ea:44:c9:15:6a:e2:03:6e:33:
                    d3:ac:9f:55:00:c7:f6:08:6a:94:b9:5f:dc:e0:33:
                    f1:84:60:f9:5b:27:11:b4:fc:16:f2:bb:56:6a:80:
                    25:8d
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Key Usage: critical
                Certificate Sign, CRL Sign
            1.3.6.1.5.5.7.1.12: 
                0_.].[0Y0W0U..image/gif0!0.0...+..............k...j.H.,{..0%.#http://logo.verisign.com/vslogo.gif
            X509v3 Subject Key Identifier: 
                B6:77:FA:69:48:47:9F:53:12:D5:C2:EA:07:32:76:07:D1:97:07:19
    Signature Algorithm: sha256WithRSAEncryption
         4a:f8:f8:b0:03:e6:2c:67:7b:e4:94:77:63:cc:6e:4c:f9:7d:
         0e:0d:dc:c8:b9:35:b9:70:4f:63:fa:24:fa:6c:83:8c:47:9d:
         3b:63:f3:9a:f9:76:32:95:91:b1:77:bc:ac:9a:be:b1:e4:31:
         21:c6:81:95:56:5a:0e:b1:c2:d4:b1:a6:59:ac:f1:63:cb:b8:
         4c:1d:59:90:4a:ef:90:16:28:1f:5a:ae:10:fb:81:50:38:0c:
         6c:cc:f1:3d:c3:f5:63:e3:b3:e3:21:c9:24:39:e9:fd:15:66:
         46:f4:1b:11:d0:4d:73:a3:7d:46:f9:3d:ed:a8:5f:62:d4:f1:
         3f:f8:e0:74:57:2b:18:9d:81:b4:c4:28:da:94:97:a5:70:eb:
         ac:1d:be:07:11:f0:d5:db:dd:e5:8c:f0:d5:32:b0:83:e6:57:
         e2:8f:bf:be:a1:aa:bf:3d:1d:b5:d4:38:ea:d7:b0:5c:3a:4f:
         6a:3f:8f:c0:66:6c:63:aa:e9:d9:a4:16:f4:81:d1:95:14:0e:
         7d:cd:95:34:d9:d2:8f:70:73:81:7b:9c:7e:bd:98:61:d8:45:
         87:98:90:c5:eb:86:30:c6:35:bf:f0:ff:c3:55:88:83:4b:ef:
         05:92:06:71:f2:b8:98:93:b7:ec:cd:82:61:f1:38:e6:4f:97:
         98:2a:5a:8d

Générer des données aléatoires

À ce stade, vous êtes devenu à l'aise avec la connexion aux serveurs et l'inspection des certificats. Je terminerai par une dernière astuce qui m'est souvent utile. Le openssl rand La commande peut être utilisée pour générer des octets pseudo-aléatoires. Le -base64 flag encodera la sortie en base64, vous fournissant une chaîne aléatoire pouvant être utilisée comme mot de passe ou pour d'autres applications nécessitant une chaîne aléatoire. Assurez-vous simplement que le nombre d'octets est divisible par trois pour éviter le remplissage.

$  openssl rand -base64 9
Emo+xQINmYoU

[ Obtenez ce livre gratuit de Red Hat et O'Reilly - Kubernetes Operators :Automating the Container Orchestration Platform. ] 

Récapitulez

Dans cet article, vous avez appris quelques commandes OpenSSL de base qui peuvent faciliter votre vie quotidienne en tant qu'administrateur système. OpenSSL est une suite d'outils (et une bibliothèque de logiciels) très puissante, et cet article n'a fait qu'effleurer la surface de ses fonctionnalités. Cependant, ces commandes sont à la fois un bon point de départ pour approfondir ses connaissances sur OpenSSL et un ensemble d'outils utiles à avoir dans la boîte à outils de tout administrateur système qui travaille régulièrement avec des serveurs protégés par TLS.


Linux
  1. 10 commandes que tout utilisateur de Linux devrait connaître

  2. Disséquer la commande gratuite :ce que l'administrateur système Linux doit savoir

  3. 17 commandes Linux que tout administrateur système devrait connaître

  4. Liste des commandes Linux que chaque développeur devrait connaître

  5. 8 arguments de ligne de commande Perl impressionnants que vous devriez connaître

34 commandes Linux de base que chaque utilisateur devrait connaître

Raccourcis clavier Ubuntu que chaque utilisateur devrait connaître

Apprenez les bases de la mise en réseau que chaque administrateur système doit connaître

5 commandes Linux que chaque utilisateur Linux devrait connaître

5 astuces simples pour l'historique de Bash que tout utilisateur de Linux devrait connaître

Raccourcis de terminal Linux utiles que chaque utilisateur Linux expérimenté doit connaître