GNU/Linux >> Linux Esercitazione >  >> Linux

6 Opzioni di comando OpenSSL che ogni amministratore di sistema dovrebbe conoscere

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.


Linux
  1. Analisi del comando free:cosa deve sapere l'amministratore di sistema Linux

  2. 3 abilità che ogni amministratore di sistema Linux dovrebbe portare in tavola

  3. 7 comandi di rete Linux che ogni amministratore di sistema dovrebbe conoscere

  4. 17 comandi Linux che ogni amministratore di sistema dovrebbe conoscere

  5. Opzioni utili per ps

3 hack utili che ogni utente Linux deve conoscere

34 comandi di base di Linux che ogni utente dovrebbe conoscere

Scorciatoie da tastiera di Ubuntu che ogni utente dovrebbe conoscere

Impara le basi della rete che ogni amministratore di sistema deve conoscere

5 comandi Linux che ogni utente Linux dovrebbe conoscere

5 semplici trucchi per la cronologia di Bash che ogni utente Linux dovrebbe conoscere