La sicurezza del livello di trasporto (TLS) è una parte importante di qualsiasi strategia di sicurezza e le applicazioni oltre ai server Web sfruttano sempre più le protezioni offerte dalla crittografia a chiave pubblica. Il toolkit OpenSSL è l'utilità fondamentale che qualsiasi amministratore di sistema deve conoscere se è responsabile della manutenzione delle applicazioni protette da TLS. In questo articolo, mostro alcuni dei comandi più comuni che utilizzo quotidianamente. Sebbene molti articoli si concentrino sulla generazione di richieste di firma dei certificati (CSR) o certificati autofirmati, questo articolo dedicherà un po' di tempo alla revisione dei comandi OpenSSL e delle battute oltre il processo di generazione dei certificati.
[ Potrebbe interessarti anche: Rendere disponibili i certificati CA per gli strumenti a riga di comando di Linux ]
Verifica della validità del certificato
Uno dei passaggi più comuni per la risoluzione dei problemi che dovrai eseguire è controllare la validità di base di una catena di certificati inviata da un server, che può essere eseguita da openssl s_client
comando. L'esempio seguente mostra una catena di certificati verificata con successo inviata da un server (redhat.com) dopo una connessione sulla porta 443. Il -brief
flag esclude alcuni degli output più dettagliati che OpenSSL normalmente visualizzerebbe. Tieni presente che "Verifica" viene visualizzato come "OK".
Per impostazione predefinita, openssl s_client
leggerà dall'input standard i dati da inviare al server remoto. Aggiunta di un echo
al one-liner invia una nuova riga e termina immediatamente la connessione. Senza questo, dovresti premere Ctrl+C per uscire dalla connessione.
$ 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
Confronta l'output sopra con l'esempio seguente. In questo output, puoi vedere chiaramente che la verifica non è riuscita con un errore:"certificato autofirmato".
$ 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
Determinazione della scadenza di un certificato
Ogni amministratore di sistema ha sperimentato l'imbarazzo che deriva dal consentire la scadenza di un certificato per un sito Web rivolto al pubblico. Esistono molti strumenti di monitoraggio per tenerlo d'occhio e assicurarsi che non succeda a te, ma cosa succede se vuoi semplicemente controllare rapidamente la data di scadenza di un certificato dalla riga di comando? OpenSSL ti copre.
Il controllo della data di scadenza di un certificato implica un one-liner composto da due comandi OpenSSL:s_client
e x509
. Hai già visto come s_client
stabilisce una connessione a un server nell'esempio precedente. Convogliando l'output in x509
, puoi ottenere il periodo di validità del certificato utilizzando i -dates
bandiera. Di seguito sono riportati esempi di certificato valido e scaduto.
# 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
Nota :Se ricevi un certificato SSL predefinito al posto del certificato del server, dai un'occhiata a questa spiegazione di SNI (Server Name Indication).
Verifica delle estensioni dei certificati
Le estensioni X509 consentono di aggiungere campi aggiuntivi a un certificato. Uno dei più comuni è il nome alternativo del soggetto (SAN). La SAN di un certificato consente di associare più valori (ad es. FQDN multipli) a un unico certificato. La SAN viene utilizzata anche quando non sono presenti più valori perché l'uso del nome comune di un certificato per la verifica è deprecato.
Simile al precedente one-liner, il piping dell'output tra più comandi OpenSSL semplifica l'ispezione di estensioni di certificato specifiche e consente di visualizzare le SAN associate a un certificato:
$ 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 altro insieme comune di estensioni include i vincoli di base e l'utilizzo delle chiavi di un certificato. In particolare, potresti voler controllare se un certificato può essere utilizzato come autorità di certificazione. Ancora una volta, questo può essere fatto nello stesso modo in cui puoi verificare la presenza di una 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
Controllo di crittografie o versioni TLS obsolete
Esistono eccellenti strumenti basati sul Web, come Qualys SSL Lab, per fornirti un rapporto completo sulla sicurezza della tua configurazione TLS. Ciò include l'avviso dell'uso di suite di crittografia non sicure e altri parametri di configurazione che possono indebolire la posizione di sicurezza di una risorsa protetta da TLS. Tuttavia, potresti semplicemente voler eseguire un rapido test dalla riga di comando e OpenSSL lo rende facile.
Innanzitutto, puoi elencare le crittografie supportate per una particolare versione SSL/TLS utilizzando i openssl ciphers
comando. Di seguito, puoi vedere che ho elencato le crittografie supportate per TLS 1.3. Il -s
flag indica al comando ciphers di stampare solo i cifrari supportati dalla versione TLS specificata (-tls1_3
):
$ openssl ciphers -s -tls1_3
TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
Il s_client
Il comando può quindi essere utilizzato per testare diverse versioni di TLS e suite di crittografia. Il sito Web Ciphersuites.info è un utile archivio di informazioni sulla forza di varie suite di crittografia. Ad esempio, il tentativo di utilizzare la suite debole TLS_PSK_WITH_AES_128_CBC_SHA su un server che non la supporta risulterà in un errore:
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
Allo stesso modo, puoi specificare la versione del protocollo TLS utilizzato nella connessione. L'esempio seguente mostra che TLS 1.1 non è supportato dal server. Assicurati di rivedere la manpage per vedere un elenco completo di opzioni.
$ 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:
Ispezione di un certificato
Ho trattato l'esame di parti particolari di un certificato, come le date di validità o le estensioni X509. A volte, vuoi solo vedere tutto su un certificato specifico. L'utilità X509 può essere utilizzata con -noout
(per sopprimere la stampa del certificato codificato), -text
(per stampare le informazioni di testo sul certificato) e il -in
(per specificare il file di input) flag per stampare tutto ciò che vorresti sapere su un determinato certificato. L'esempio seguente utilizza un file di certificato sul mio sistema locale, ma puoi facilmente reindirizzare l'output da openssl s_client
, come visto negli esempi precedenti.
$ 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
Generazione di dati casuali
A questo punto, hai acquisito familiarità con la connessione ai server e l'ispezione dei certificati. Concluderò con un ultimo trucco che spesso mi torna utile. Il openssl rand
comando può essere utilizzato per generare byte pseudo-casuali. Il -base64
flag base64 codificherà l'output, fornendoti una stringa casuale che può essere utilizzata come password o per altre applicazioni che richiedono una stringa casuale. Assicurati solo che il numero di byte sia divisibile per tre per evitare il riempimento.
$ openssl rand -base64 9
Emo+xQINmYoU
[ Ottieni questo libro gratuito da Red Hat e O'Reilly - Operatori Kubernetes:Automating the Container Orchestration Platform. ]
Concludi
In questo articolo, hai appreso alcuni comandi di base di OpenSSL che possono semplificarti la vita quotidiana come amministratore di sistema. OpenSSL è una suite di strumenti (e libreria software) molto potente e questo articolo ha solo toccato la superficie della sua funzionalità. Tuttavia, questi comandi sono sia un buon punto di partenza per approfondire la conoscenza di OpenSSL, sia un utile set di strumenti da avere nella cassetta degli attrezzi di qualsiasi amministratore di sistema che lavori regolarmente con server protetti da TLS.