Zabezpečení transportní vrstvy (TLS) je důležitou součástí jakékoli bezpečnostní strategie a aplikace mimo webové servery stále více využívají ochrany, kterou nabízí kryptografie s veřejným klíčem. Sada nástrojů OpenSSL je základní nástroj, který musí znát každý správce systému, pokud je odpovědný za údržbu aplikací chráněných TLS. V tomto článku předvádím některé z nejběžnějších příkazů, které denně používám. Zatímco mnoho článků se zaměřuje na generování žádostí o podpis certifikátu (CSR) nebo certifikátů s vlastním podpisem, tento článek stráví nějaký čas přezkoumáním příkazů OpenSSL a jednoduchých řádků nad rámec procesu generování certifikátu.
[ Také by vás mohlo těšit: Zpřístupnění certifikátů CA nástrojům příkazového řádku Linuxu ]
Kontrola platnosti certifikátu
Jedním z nejběžnějších kroků pro odstraňování problémů, které podniknete, je kontrola základní platnosti řetězce certifikátů zaslaného serverem, což lze provést pomocí openssl s_client
příkaz. Níže uvedený příklad ukazuje úspěšně ověřený řetězec certifikátů odeslaný serverem (redhat.com) po připojení na portu 443. -brief
příznak vylučuje některé podrobnější výstupy, které by OpenSSL normálně zobrazilo. Všimněte si, že „Ověření“ se zobrazí jako „OK.“
Ve výchozím nastavení openssl s_client
bude číst ze standardního vstupu pro data k odeslání na vzdálený server. Přidání echo
na jednořádkový odešle nový řádek a okamžitě ukončí spojení. Bez toho byste museli stisknout Ctrl+C pro ukončení připojení.
$ 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
Porovnejte výše uvedený výstup s příkladem níže. V tomto výstupu můžete jasně vidět, že ověření selhalo s chybou:„certifikát s vlastním podpisem.“
$ 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
Určení, kdy vyprší platnost certifikátu
Každý sysadmin zažil ostudu, která plyne z povolení vypršení platnosti certifikátu pro veřejně přístupný web. Existuje spousta monitorovacích nástrojů, jak to sledovat a zajistit, aby se vám to nestalo, ale co když chcete jen rychle zkontrolovat datum vypršení platnosti certifikátu z příkazového řádku? OpenSSL vás pokryje.
Kontrola data vypršení platnosti certifikátu zahrnuje jeden řádek složený ze dvou příkazů OpenSSL:s_client
a x509
. Už jste viděli, jak s_client
naváže připojení k serveru v předchozím příkladu. Propojením výstupu do x509
, dobu platnosti certifikátu můžete získat pomocí -dates
vlajka. Níže jsou uvedeny příklady platného i prošlého certifikátu.
# 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
Poznámka :Pokud místo certifikátu serveru obdržíte výchozí certifikát SSL, podívejte se na toto vysvětlení SNI (Server Name Indication).
Kontrola rozšíření certifikátu
Rozšíření X509 umožňují přidat do certifikátu další pole. Jedním z nejběžnějších je alternativní název předmětu (SAN). SAN certifikátu umožňuje přidružit více hodnot (např. více FQDN) k jednomu certifikátu. SAN se používá i v případě, že neexistuje více hodnot, protože použití běžného názvu certifikátu pro ověření je zastaralé.
Podobně jako u předchozího jednořádkového výstupu, propojení výstupu mezi více příkazy OpenSSL usnadňuje kontrolu konkrétních rozšíření certifikátu a umožňuje zobrazit sítě SAN přidružené k certifikátu:
$ 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
Další běžná sada rozšíření zahrnuje základní omezení a použití klíče certifikátu. Konkrétně můžete chtít zkontrolovat, zda je povoleno používat certifikát jako certifikační autoritu. Opět to lze provést stejným způsobem, jako můžete zkontrolovat 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
Kontrola zastaralých šifer nebo verzí TLS
Existují vynikající webové nástroje, jako je Qualys SSL Lab, které vám poskytují úplnou zprávu o zabezpečení vaší konfigurace TLS. To zahrnuje upozornění na použití nezabezpečených šifrovacích sad a dalších konfiguračních parametrů, které mohou oslabit bezpečnostní pozici zdroje chráněného TLS. Možná však budete chtít spustit rychlý test z příkazového řádku a OpenSSL to usnadní.
Nejprve můžete uvést podporované šifry pro konkrétní verzi SSL/TLS pomocí openssl ciphers
příkaz. Níže můžete vidět, že jsem uvedl seznam podporovaných šifer pro TLS 1.3. -s
příznak říká příkazu ciphers, aby tiskl pouze ty šifry, které podporuje zadaná verze TLS (-tls1_3
):
$ openssl ciphers -s -tls1_3
TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
s_client
příkaz pak lze použít k testování různých verzí TLS a šifrovacích sad. Web Ciphersuites.info je užitečným úložištěm informací o síle různých šifrovacích sad. Například pokus o použití slabé sady TLS_PSK_WITH_AES_128_CBC_SHA proti serveru, který ji nepodporuje, povede k chybě:
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
Podobně můžete určit verzi protokolu TLS použitého v připojení. Níže uvedený příklad ukazuje, že server TLS 1.1 nepodporuje. Úplný seznam možností naleznete v manuálové stránce.
$ 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:
Kontrola certifikátu
Zabýval jsem se pohledem na konkrétní části certifikátu, jako jsou data platnosti nebo rozšíření X509. Někdy prostě chcete vidět vše o konkrétním certifikátu. Nástroj X509 lze použít s -noout
(pro potlačení tisku zakódovaného certifikátu), -text
(pro tisk textových informací o certifikátu) a -in
(pro určení vstupního souboru) vytisknete vše, co byste chtěli vědět o konkrétním certifikátu. Níže uvedený příklad používá soubor certifikátu v mém místním systému, ale stejně snadno můžete výstup z openssl s_client
, jak je vidět v předchozích příkladech.
$ 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
Generování některých náhodných dat
V tuto chvíli jste si zvykli na připojení k serverům a kontrolu certifikátů. Skončím jedním posledním trikem, který se mi často hodí. openssl rand
příkaz lze použít ke generování pseudonáhodných bajtů. -base64
flag zakóduje výstup base64 a poskytne vám náhodný řetězec, který lze použít jako heslo nebo pro jiné aplikace, které vyžadují náhodný řetězec. Jen se ujistěte, že počet bajtů je dělitelný třemi, abyste se vyhnuli vyplnění.
$ openssl rand -base64 9
Emo+xQINmYoU
[ Získejte tuto bezplatnou knihu od Red Hat a O'Reilly – Kubernetes Operators:Automation the Container Orchestration Platform. ]
Sbalit
V tomto článku jste se naučili některé základní příkazy OpenSSL, které vám mohou usnadnit každodenní život správce systému. OpenSSL je velmi výkonná sada nástrojů (a softwarová knihovna) a tento článek se dotkl pouze povrchu jeho funkčnosti. Tyto příkazy jsou však dobrým výchozím bodem pro rozvoj dalších znalostí o OpenSSL a zároveň užitečnou sadou nástrojů, které by měl mít v sadě nástrojů každý správce systému, který pravidelně pracuje se servery chráněnými TLS.