带有签名证书的 SSL_ERROR_NO_CYPHER_OVERLAP 错误

Dar*_*ren 5 tomcat ssl-certificate ssl-certificate-errors

我的公司向默认使用 http 的客户提供了一个基于 Tomcat/MySQL 的应用程序。应客户的要求,我通过创建自签名证书使其能够使用 https。使用自签名证书时,这会受到预期的浏览器错误的影响。

经过渗透测试,他们决定我们需要禁用一些已弃用的 ssl 协议和密码,因此我将 tomcat server.xml 中的 ssl 连接器修改为如下所示:

    <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" />
Run Code Online (Sandbox Code Playgroud)

这满足了渗透测试,该应用程序继续在所有三个主要浏览器(Chrome、Firefox 和 IE)中运行。但是,渗透测试也表明我们最好不要使用自签名证书,因此,按照这些 指南,我创建了一个 CSR 并让客户创建了一个签名到其内部域的证书(服务器可以通过以下方式访问)几个不同的 URL,因此需要使用 SAN 创建 CSR)。

我将证书添加到新的密钥库并相应地修改了 server.xml 文件中的路径。现在,当我尝试连接时,出现以下错误(这是来自 Firefox,但所有浏览器都会产生类似的错误):

安全连接失败

连接到 172.31.1.36:8443 期间发生错误。无法与对等方安全通信:没有通用的加密算法。错误代码:SSL_ERROR_NO_CYPHER_OVERLAP

由于无法验证接收到的数据的真实性,因此无法显示您尝试查看的页面。请联系网站所有者以告知他们此问题。

我的理解是证书不控制应该使用什么密码或协议,所以我不明白为什么会发生这种情况。这是我在生成 CSR 时犯的错误还是客户端在生成证书时犯的错误?

-编辑-

我似乎到处都在出错。如果我尝试将密钥导入密钥库,我会得到以下任一信息:

cat <keyfile> | openssl  pkcs12 -export -out <keystore>.p12
Enter pass phrase:
unable to load certificates
Run Code Online (Sandbox Code Playgroud)

或这个:

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
Run Code Online (Sandbox Code Playgroud)

我让客户向我发送证书链,当我尝试导入时,出现此错误:

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
Run Code Online (Sandbox Code Playgroud)

我找到了一些关于如何将 pkcs 文件转换为 x.509 的解决方案,但后来我遇到了其他错误,所以我现在完全被卡住了。

Dar*_*ren 1

所有问题的根本原因是证书格式错误。

通过跟踪此处的信息,我发现该证书实际上是 DER 格式。我将其转换如下:

openssl x509 -inform der -in certfile.cer -out new_certfile.pem
Run Code Online (Sandbox Code Playgroud)