Minha empresa forneceu um aplicativo baseado em Tomcat / MySQL para um cliente que, por padrão, usa http. A pedido do cliente, eu habilitei isso para usar https, criando um certificado autoassinado. Isso funcionou sujeito ao erro esperado do navegador ao usar um certificado autoassinado.
Depois de um teste de caneta, decidimos que precisamos desabilitar alguns protocolos ssl e cifras reprovados, então alterei o conector ssl no meu tomcat server.xml para ficar assim:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" sslEnabledProtocols="TLSv1.2,TLSv1.1" ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_WITH_AES_128_GCM_SHA256"
keystoreFile="/path/to/keystore/file"
keystorePass="password" />
Isso satisfez o teste da caneta e o aplicativo continuou funcionando nos três principais navegadores (Chrome, Firefox e IE). No entanto, o teste da caneta também sinalizou que, idealmente, não deveríamos estar usando um certificado autoassinado, seguindo estes guias , criei um CSR e consegui que o cliente criasse um certificado assinado em seu domínio interno (o servidor pode ser acessado por um par de URLs diferentes, portanto, a necessidade de criar um CSR com uma SAN).
Eu adicionei o certificado a um novo keystore e alterei o caminho no arquivo server.xml apropriadamente. Agora, quando tento conectar recebo o seguinte erro (isso é do Firefox, mas todos os navegadores produzem um erro semelhante):
Secure Connection Failed
An error occurred during a connection to 172.31.1.36:8443. Cannot
communicate securely with peer: no common encryption algorithm(s).
Error code: SSL_ERROR_NO_CYPHER_OVERLAP
The page you are trying to view cannot be shown because the authenticity of the received data could not be verified.
Please contact the web site owners to inform them of this problem.
Meu entendimento é que o certificado não controla quais cifras ou protocolos devem ser usados, então não entendo por que isso aconteceu. Este é um erro que cometi ao produzir o CSR ou poderia ser um erro que o cliente fez ao gerar o certificado?
-EDIT -
Parece que estou recebendo erros em todos os lugares que viro. Se eu tentar importar a chave para um armazenamento de chaves, recebo isto:
cat <keyfile> | openssl pkcs12 -export -out <keystore>.p12
Enter pass phrase:
unable to load certificates
Ou isto:
keytool -importkeystore -srckeystore <keyfile> -srcstoretype pkcs12 -destkeystore <keystore>.jks
Enter destination keystore password:
Re-enter new password:
Enter source keystore password:
keytool error: java.io.IOException: toDerInputStream rejects tag type 45
Eu tenho o cliente para me enviar a cadeia de certificados e quando tento importar que recebo este erro:
keytool -import -trustcacerts -alias tomcat -file <certchain>.p7b -keystore <keystorefile>.jks
Enter keystore password:
keytool error: java.lang.Exception: Input not an X.509 certificate
Eu encontrei algumas soluções sobre como converter o arquivo pkcs para x.509, mas depois recebi outros erros, então estou totalmente preso agora.