é o alerta “SSL3_READ_BYTES: sslv3 alert bad certificate” indicando que o SSL falhou

12

enquanto executa o comando abaixo openssl s_client -host example.xyz -port 9093

Eu recebo o seguinte erro.

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:

Mas no final eu recebo "Verify return code: 0 (ok)" mensagem.

Minha pergunta é o que significa o alerta acima e se o SSL foi realmente bem-sucedido. Muito obrigado pela ajuda antecipadamente.

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)**
    
por kris433 29.09.2016 / 17:58

1 resposta

18

"Falha de handshake" significa que o handshake falhou e não há conexão SSL / TLS. Você deve ver que openssl sai para o shell (ou CMD, etc) e não espera que os dados de entrada sejam enviados para o servidor. "Verificar o código de retorno 0" significa que nenhum problema foi encontrado no certificado do servidor, porque não foi verificado ou porque foi verificado e foi bom (no que diz respeito às verificações do OpenSSL, que não cobre tudo); Nesse caso, conhecendo o protocolo, podemos deduzir que o último caso se aplica.

Recebendo o alerta bad certificate (código 42) significa que o servidor exige que você autentique com um certificado, e você não o fez e causou a falha de handshake. Algumas linhas antes da linha SSL handshake has read ... and written ... você deve ver uma linha Acceptable client certificate CA names geralmente seguida por várias linhas identificando CAs, possivelmente seguidas por uma linha que começa com Client Certificate Types e talvez cerca de Requested Signature Algorithms dependendo da sua versão do OpenSSL e do protocolo negociado .

Encontre um certificado emitido por uma autoridade de certificação na lista 'aceitável' ou, se estiver vazio, procure documentação sobre ou sobre o servidor informando em quais CAs confia ou entre em contato com os operadores ou proprietários do servidor e pergunte a eles, mais a chave privada correspondente , no formato PEM, e especifique-os com -cert $file -key $file ; se você tiver ambos em um arquivo, como é possível com o PEM, use apenas -cert $file . Se você os tiver em um formato diferente, especifique-o ou pesquise aqui e talvez superusuário e security.SX; já existem muitos Q & como sobre a conversão de vários formatos de certificado e chave privada. Se o seu certificado precisar de um certificado "chain" ou "intermediário" (ou até mais de um) para ser verificado, como é frequentemente o caso de um certificado de uma CA pública (versus uma CA interna) dependendo de como o servidor está configurado, s_client requer um truque: adicione o (s) certificado (s) de cadeia ao armazenamento confiável do sistema ou crie um armazenamento confiável local / temporário contendo o (s) certificado (s) CA necessário (s) para verificar o servidor enviar.

Se você não possui esse certificado, é necessário obter um, que é uma pergunta diferente que requer muito mais detalhes para responder ou é necessário encontrar uma maneira de se conectar ao servidor sem usar a autenticação de certificado; verifique novamente a documentação e / ou pergunte aos operadores / proprietários.

EDIT: Parece que a partir do comentário você pode ter a chave do cliente e a cadeia de certificados, bem como a âncora do servidor (s?) em Java. Ao verificar, não vejo uma boa resposta existente cobrindo totalmente esse caso, por isso, mesmo que isso provavelmente não seja bem pesquisado:

# 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
    
por 29.09.2016 / 19:52