Transport Layer Security (TLS) ist ein wichtiger Bestandteil jeder Sicherheitsstrategie, und Anwendungen jenseits von Webservern nutzen zunehmend den Schutz, den die Public-Key-Kryptographie bietet. Das OpenSSL-Toolkit ist das grundlegende Dienstprogramm, das jeder Systemadministrator kennen muss, wenn er für die Wartung von TLS-geschützten Anwendungen verantwortlich ist. In diesem Artikel zeige ich einige der häufigsten Befehle, die ich täglich verwende. Während sich viele Artikel auf die Generierung von Certificate Signing Requests (CSRs) oder selbstsignierten Zertifikaten konzentrieren, wird dieser Artikel einige Zeit damit verbringen, OpenSSL-Befehle und Einzeiler über den Zertifikatgenerierungsprozess hinaus zu überprüfen.
[Vielleicht gefällt Ihnen auch:CA-Zertifikate für Linux-Befehlszeilentools verfügbar machen ]
Gültigkeit des Zertifikats prüfen
Einer der häufigsten Schritte zur Fehlerbehebung besteht darin, die grundlegende Gültigkeit einer von einem Server gesendeten Zertifikatskette zu überprüfen, was mit dem openssl s_client
durchgeführt werden kann Befehl. Das folgende Beispiel zeigt eine erfolgreich verifizierte Zertifikatskette, die von einem Server (redhat.com) nach einer Verbindung auf Port 443 gesendet wurde. Der -brief
-Flag schließt einige der ausführlicheren Ausgaben aus, die OpenSSL normalerweise anzeigen würde. Beachten Sie, dass die "Bestätigung" als "OK" ausgegeben wird.
Standardmäßig openssl s_client
liest von der Standardeingabe nach Daten, die an den Remote-Server gesendet werden sollen. Anhängen eines echo
an den Einzeiler sendet einen Zeilenumbruch und beendet sofort die Verbindung. Andernfalls müssten Sie Strg+C drücken um die Verbindung zu beenden.
$ 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
Vergleichen Sie die obige Ausgabe mit dem Beispiel unten. In dieser Ausgabe können Sie deutlich sehen, dass die Überprüfung mit einem Fehler fehlgeschlagen ist:„self-signed certificate.“
$ 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
Bestimmen, wann ein Zertifikat abläuft
Jeder Systemadministrator hat die Peinlichkeit erlebt, die sich daraus ergibt, dass ein Zertifikat für eine öffentlich zugängliche Website abläuft. Es gibt viele Überwachungstools, um dies im Auge zu behalten und sicherzustellen, dass Ihnen das nicht passiert, aber was, wenn Sie nur schnell das Ablaufdatum eines Zertifikats von der Befehlszeile aus überprüfen möchten? OpenSSL deckt Sie ab.
Das Überprüfen des Ablaufdatums eines Zertifikats umfasst einen Einzeiler, der aus zwei OpenSSL-Befehlen besteht:s_client
und x509
. Sie haben bereits gesehen, wie s_client
stellt im vorherigen Beispiel eine Verbindung zu einem Server her. Durch Weiterleiten der Ausgabe an x509
können Sie die Gültigkeitsdauer des Zertifikats über die -dates
ermitteln Flagge. Nachfolgend finden Sie Beispiele für ein gültiges und ein abgelaufenes Zertifikat.
# 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
Hinweis :Wenn Sie anstelle des Serverzertifikats ein Standard-SSL-Zertifikat erhalten, sehen Sie sich diese Erklärung von SNI (Server Name Indication) an.
Zertifikatserweiterungen prüfen
X509-Erweiterungen ermöglichen das Hinzufügen zusätzlicher Felder zu einem Zertifikat. Einer der gebräuchlichsten ist der subject alternative name (SAN). Der SAN eines Zertifikats ermöglicht die Zuordnung mehrerer Werte (z. B. mehrerer FQDNs) zu einem einzelnen Zertifikat. Das SAN wird sogar verwendet, wenn es nicht mehrere Werte gibt, da die Verwendung des allgemeinen Namens eines Zertifikats zur Überprüfung veraltet ist.
Ähnlich wie im vorangegangenen Einzeiler erleichtert das Weiterleiten der Ausgabe zwischen mehreren OpenSSL-Befehlen die Überprüfung bestimmter Zertifikatserweiterungen und ermöglicht Ihnen, die mit einem Zertifikat verknüpften SANs anzuzeigen:
$ 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
Ein weiterer gängiger Satz von Erweiterungen umfasst die grundlegenden Einschränkungen und die Schlüsselverwendung eines Zertifikats. Insbesondere möchten Sie möglicherweise prüfen, ob ein Zertifikat als Zertifizierungsstelle verwendet werden darf. Auch dies kann auf die gleiche Weise erfolgen, wie Sie nach einem SAN suchen können:
$ 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
Veraltete TLS-Chiffren oder -Versionen prüfen
Es gibt hervorragende webbasierte Tools wie Qualys SSL Lab, die Ihnen einen vollständigen Bericht über die Sicherheit Ihrer TLS-Konfiguration liefern. Dazu gehört, dass Sie vor der Verwendung unsicherer Verschlüsselungssammlungen und anderer Konfigurationsparameter gewarnt werden, die die Sicherheitslage einer TLS-geschützten Ressource schwächen können. Möglicherweise möchten Sie jedoch nur einen schnellen Test über die Befehlszeile ausführen, und OpenSSL macht dies einfach.
Zunächst können Sie die unterstützten Chiffren für eine bestimmte SSL/TLS-Version mit openssl ciphers
auflisten Befehl. Unten sehen Sie, dass ich die unterstützten Chiffren für TLS 1.3 aufgelistet habe. Das -s
Flag weist den Ciphers-Befehl an, nur die von der angegebenen TLS-Version (-tls1_3
):
$ openssl ciphers -s -tls1_3
TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
Der s_client
Der Befehl kann dann verwendet werden, um verschiedene TLS-Versionen und Verschlüsselungssammlungen zu testen. Die Website Ciphersuites.info ist eine nützliche Sammlung von Informationen über die Stärke verschiedener Cipher Suites. Wenn Sie beispielsweise versuchen, die schwache TLS_PSK_WITH_AES_128_CBC_SHA-Suite gegen einen Server zu verwenden, der sie nicht unterstützt, führt dies zu einem Fehler:
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
Ebenso können Sie die Version des in der Verbindung verwendeten TLS-Protokolls angeben. Das folgende Beispiel zeigt, dass TLS 1.1 vom Server nicht unterstützt wird. Sehen Sie sich unbedingt die Manpage an, um eine vollständige Liste der Optionen anzuzeigen.
$ 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:
Inspizieren eines Zertifikats
Ich habe die Betrachtung bestimmter Teile eines Zertifikats behandelt, z. B. Gültigkeitsdaten oder X509-Erweiterungen. Manchmal möchten Sie einfach alles über ein bestimmtes Zertifikat sehen. Das Dienstprogramm X509 kann mit -noout
verwendet werden (um das Drucken des verschlüsselten Zertifikats zu unterdrücken), -text
(um Textinformationen über das Zertifikat auszudrucken) und das -in
(um die Eingabedatei anzugeben) Flags, um alles auszudrucken, was Sie über ein bestimmtes Zertifikat wissen möchten. Das folgende Beispiel verwendet eine Zertifikatsdatei auf meinem lokalen System, aber Sie könnten die Ausgabe von openssl s_client
genauso einfach weiterleiten , wie in den vorherigen Beispielen zu sehen.
$ 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
Einige zufällige Daten generieren
An diesem Punkt haben Sie sich mit dem Herstellen einer Verbindung zu Servern und dem Überprüfen von Zertifikaten vertraut gemacht. Ich schließe mit einem letzten Trick, der mir häufig nützlich ist. Der openssl rand
Der Befehl kann verwendet werden, um pseudozufällige Bytes zu generieren. Die -base64
flag wird die Ausgabe mit base64 codieren und Ihnen eine zufällige Zeichenfolge zur Verfügung stellen, die als Passwort oder für andere Anwendungen verwendet werden kann, die eine zufällige Zeichenfolge erfordern. Stellen Sie nur sicher, dass die Anzahl der Bytes durch drei teilbar ist, um Auffüllen zu vermeiden.
$ openssl rand -base64 9
Emo+xQINmYoU
[ Holen Sie sich dieses kostenlose Buch von Red Hat und O'Reilly – Kubernetes Operators:Automating the Container Orchestration Platform. ]
Abschluss
In diesem Artikel haben Sie einige grundlegende OpenSSL-Befehle gelernt, die Ihren Alltag als Systemadministrator erleichtern können. OpenSSL ist eine sehr leistungsstarke Suite von Tools (und Softwarebibliotheken), und dieser Artikel berührte nur die Oberfläche seiner Funktionalität. Diese Befehle sind jedoch sowohl ein guter Ausgangspunkt, um weitere Kenntnisse über OpenSSL zu entwickeln, als auch ein nützlicher Satz von Tools, die in der Toolbox jedes Systemadministrators vorhanden sein sollten, der regelmäßig mit TLS-geschützten Servern arbeitet.