L'avviso "SSL3_READ_BYTES: avviso sslv3 certificato non valido" indica che SSL non è riuscito


17

Durante l'esecuzione del comando seguente openssl s_client -host example.xyz -port 9093

Ottengo il seguente errore:

139810559764296:error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate:s3_pkt.c:1259:SSL alert number 42
39810559764296:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:184:

Ma alla fine ricevo un "Verify return code: 0 (ok)"messaggio.

La mia domanda è: cosa significa l'avviso di cui sopra e se l'SSL ha avuto successo. Grazie mille per l'aiuto in anticipo.

SSL handshake has read 6648 bytes and written 354 bytes
New, TLSv1/SSLv3, Cipher is AES128-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol  : TLSv1.2
Cipher    : AES128-SHA
Session-ID: xx
Session-ID-ctx:
Master-Key: xx
Key-Arg   : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
Start Time: 1475096098
Timeout   : 300 (sec)
**Verify return code: 0 (ok)**

Risposte:


25

"Errore di handshake" significa che l'handshake non è riuscito e non esiste una connessione SSL / TLS. Dovresti vedere che opensslesce dalla shell (o CMD ecc.) E non aspetta che i dati di input vengano inviati al server. "Verifica codice di ritorno 0" significa che non è stato riscontrato alcun problema nel certificato del server, sia perché non è stato controllato per niente o perché è stato controllato ed era buono (per quanto riguarda i controlli OpenSSL, che non copre tutto); in questo caso conoscendo il protocollo possiamo dedurre che si applica quest'ultimo caso.

La ricezione di un avvisobad certificate (codice 42) indica che il server richiede l'autenticazione con un certificato e non lo ha fatto e ciò ha causato l'errore di handshake. Alcune righe prima della riga SSL handshake has read ... and written ...dovresti vedere una riga Acceptable client certificate CA namesgeneralmente seguita da diverse righe che identificano le CA, eventualmente seguite da una riga che inizia Client Certificate Typese forse alcune circa a Requested Signature Algorithmsseconda della tua versione OpenSSL e del protocollo negoziato.

Trova un certificato emesso da una CA nell'elenco "accettabile" o se era vuoto cerca la documentazione sul o sul server che dice quali CA si fida o contatta gli operatori o i proprietari del server e chiedi loro, oltre alla chiave privata corrispondente , entrambi in formato PEM e specificarli con -cert $file -key $file; se hai entrambi in un file, come è possibile con PEM, basta usare-cert $file. Se li hai in un formato diverso, specificalo o cerca qui e forse superutente e security.SX; ci sono già molte domande e risposte sulla conversione di vari formati di certificati e chiavi private. Se il tuo certificato necessita di un certificato "a catena" o "intermedio" (o anche più di uno) da verificare, come spesso accade per un certificato di una CA pubblica (rispetto a uno interno) a seconda della configurazione del server, s_clientrichiede un trucco: aggiungi i certificati di catena al tuo truststore di sistema o crea un truststore locale / temporaneo contenente i certificati di CA che devi verificare sul server PIÙ i certificati di catena che devi inviare.

Se non si dispone di un tale certificato, è necessario ottenerne uno, che è una domanda diversa che richiede molti più dettagli per rispondere, oppure è necessario trovare un modo per connettersi al server senza utilizzare l'autenticazione tramite certificato; controlla nuovamente la documentazione e / o chiedi agli operatori / proprietari.

EDIT: Sembra che dai commenti potresti avere la chiave client e la catena di certificati nonché gli ancoraggi del server in Java. Al momento del controllo non vedo una buona risposta esistente che copra completamente quel caso, quindi anche se questo probabilmente non cercherà bene:

# Assume Java keystore is type JKS (the default but not only possibility)
# named key.jks and the privatekey entry is named mykey (ditto)
# and the verify certs are in trust.jks in entries named trust1 trust2 etc.

# convert Java key entry to PKCS12 then PKCS12 to PEM files
keytool -importkeystore -srckeystore key.jks -destkeystore key.p12 -deststoretype pkcs12 -srcalias mykey 
openssl pkcs12 -in key.p12 -nocerts -out key.pem
openssl pkcs12 -in key.p12 -nokeys -clcerts -out cert.pem
openssl pkcs12 -in key.p12 -nokeys -cacerts -out chain.pem
# extract verify certs to individual PEM files
# (or if you 'uploaded' PEM files and still have them just use those)
keytool -keystore trust.jks -export -alias trust1 -rfc -file trust1.pem
keytool -keystore trust.jks -export -alias trust2 -rfc -file trust2.pem
... more if needed ...
# combine for s_client 
cat chain.pem trust*.pem >combined.pem
openssl s_client -connect host:port -key key.pem -cert cert.pem -CAfile combined.pem

ciao Dave; di seguito è la procedura che abbiamo seguito. 1: carica la CA principale e i certificati intermedi nel keystore. 2: carica il certificato Comodo firmato nel keystore. 3: caricare la CA principale e i certificati intermedi nel truststore. 4: copiare i file del keystore e del trustore su ogni nodo del cluster (cassandra). I nodi utilizzano SSL per la comunicazione e sembrano esacerbare i dati senza problemi. Tuttavia, quando eseguo il comando SSL sopra menzionato, il problema sorge.
kris433,

@ kris433: che keystore è quello? La procedura che descrivi suona come quella per Java se (e solo se) ha già generato una chiave privata per la quale ottieni (ed) il 'certificato Comodo firmato', sebbene se stai usando un'installazione Java standard ha un valore predefinito truststore che include Comodo, quindi non dovresti cambiarlo. OpenSSL non utilizza alcun keystore o truststore Java e per impostazione predefinita non utilizza alcun keystore, motivo per cui è necessario specificare i file con -cert [-key]. Se ho interpretato correttamente il tuo commento, vedi modifica.
dave_thompson_085

Grazie mille Dave. Questo ha funzionato perfettamente. Mi hai salvato la settimana. Se mai vieni a Filadelfia, la bistecca di formaggio e il gelato sono su di me;). Grazie ancora.
kris433,

@ kris433: prego, ma il modo ufficiale StackExchange è quello di accettare una risposta utile usando il segno di spunta, in modo che il sistema possa usare automaticamente queste informazioni per visualizzare i risultati ad altri querent; vedere il 'tour' che dovevi guardare quando sei arrivato su questo sito, o più specificamente serverfault.com/help/someone-answers .
dave_thompson_085,

0

Nel mio caso ho riscontrato questo errore quando la chiave privata non corrispondeva al certificato. Avevo aggiornato il certificato alla scadenza della mia e avevo bisogno di creare una nuova chiave privata. Tuttavia, ho dimenticato di fare riferimento a quello nella mia app. Quando ho indicato la nuova chiave privata, questo errore è scomparso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.