Se obtiver um erro de chave pública inválido, isso significa que tenho um certificado instalado incorretamente

1

Eu criei uma API (em execução em um servidor nginx, informe-me se houver detalhes que considere relevantes) para um cliente e eles receberam esse erro ao tentar chamar meu serviço:

Notice: SSL certificate problem: self signed certificate in certificate chain 
in /usr/local/zend/apache2/htdocs/PefcSCS/components/ \
com_pefcscs/views/simplesearchs/tmpl/default.php on line 9

Não consigo reproduzir este erro e não tenho um certificado autoassinado. Olhando nos logs eu tenho:

$ sudo tail -n 100 /var/log/nginx/error.log
2014/05/04 07:17:09 [crit] 24027#0: *844 SSL_do_handshake() failed 
(SSL: error:05066066:Diffie-Hellman routines:COMPUTE_KEY:invalid 
public key error:1408B005:SSL routines:SSL3_GET_CLIENT_KEY_EXCHANGE:DH lib) 
while SSL handshaking, client: xx.169.xx.141, server: 0.x.0.x:443

Qual diz: invalid public key error . Isso significa que eles forneceram uma chave pública inválida? Alguém poderia explicar o significado do erro e como resolver esse problema? Obrigado.

EDITAR: P.S. Só estou assumindo que esses dois pontos estão relacionados, pode ser uma coincidência e estou inferindo uma conexão entre uma troca de chave pública com falha e o erro estranho de meus clientes declarando que temos um certificado auto-assinado.

    
por Mike H-R 06.05.2014 / 10:31

1 resposta

4

Provavelmente não é uma resposta ainda, mas mais do que posso tornar legível nos comentários:

Esse código de erro (e string) é sobre uma chave pública Diffie-Hellman . A menos que você esteja usando DH estática, o que seria muito incomum - eu nunca vi um problema de CA público em um certificado DH - esta deve ser a chave DH efêmera do cliente para um ciphersuite DHE. Para que seja inválido sugere algo bastante estranho na pilha SSL do cliente, um "ataque" (ou pelo menos dano) na sessão, ou os parâmetros DH em seu servidor ficarão em xeque - tudo isso não deveria acontecer. Se o cliente afirma 'cert autoassinado' e você não está usando um, esse é um problema diferente que não deveria estar relacionado, mas pode ser através de algum bug estranho.

O cliente parece ser algo em PHP, que eu não estou familiarizado, mas eu acho que é provável que usando openssl para fazer conexões SSL de cliente (neste caso, para você) (assim como o nginx AFAIK usa o openssl no lado do servidor). Se você configurou seu servidor para fornecer uma cadeia completa de certificados, incluindo root, e o cliente openssl não possui essa raiz no armazenamento confiável que está usando (que pode ser configurável), ele pode confundir o relatório 'certificado autoassinado' em vez de uma 'raiz não confiável' mais exata.

Se eu estiver certo, é openssl, posso (você pergunta) as pessoas do cliente tentam uma conexão com você usando a linha de comando openssl s_client , com o mesmo truststore que seu programa está usando, e a mesma lista de cifras (possivelmente padrão) - e veja se isso causa algum erro e, em caso afirmativo, a informação de erro (muito mais detalhada) s_client dá? Em outras palavras, o comando seria algo como

  openssl s_client -connect $yourhost:$yourport -CAfile $file_if_any -CApath $dir_if_any -cipher $string_if_any

(Se ele se conectar, apenas controle-D para sair sem enviar nada.) Se s_client disser algo como verify error: ... self-signed , eles deverão corrigir o armazenamento confiável que estão usando para incluir o certificado raiz da cadeia que você está usando. (Isso pode significar mudar para usar um diferente truststore, se eles não podem ou não querem modificar o que eles usam atualmente.)

Entretanto, o que (se alguma coisa) está configurado no seu servidor para ssl_dhparam ? Tente openssl dhparam -check -noout nesse arquivo apenas no caso, embora qualquer coisa errado deveria ter falhado em um passo anterior no aperto de mão.

Quando outras conexões (cliente) são bem-sucedidas, você pode verificar se elas negociam DHE ou não? Lembre-se de que um certificado RSA, o mais comum, de longe, pode suportar cifras simples RSA DHE-RSA e ECDHE-RSA. Alguns clientes podem exibir a codificação selecionada, em especial a maioria dos navegadores, se o servidor aceitar solicitações https do navegador. Eu mesmo não uso o nginx, mas o link indica que ele pode registrar isso. s_client sempre informa a cifra, juntamente com muitas outras coisas.

Se o problema ainda ocorrer, você pode, ou eles ou alguém, obter uma captura de rede - usando o wireshark / tshark, tcpdump, ou similar - de uma conexão com falha? Isso confirmará o ciphersuite e outras opções usadas, e mostrará o DHE troca até o fracasso, que deveria pelo menos diminuir o problema. A maneira mais fácil de olhar (IMO) é exibir em wireshark (mesmo se você capturou com outra coisa), expanda o ServerHello e obtenha o CipherSuite, e expanda o ServerKeyExchange e o ClientKeyExchange e obtenha todos os detalhes.

    
por 06.05.2014 / 15:03