我的公司已经向默认使用http的客户提供了基于Tomcat / MySQL的应用程序。 在客户的要求下,我通过创build一个自签名证书来启用它。 这在使用自签名证书时受到预期的浏览器错误的影响。
在笔testing后,他们决定我们需要禁用一些弃用的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" />
这满足了笔testing和应用程序继续在所有三个主要的浏览器(铬,火狐和IE)工作。 然而,钢笔testing也标志着我们理想情况下不应该使用自签名证书,所以通过遵循这些 指南 ,我创build了一个CSR,并让客户创build一个签名到他们内部域的证书(服务器可以被访问几个不同的URL,因此需要创build一个与SAN的CSR)。
我将证书添加到一个新的密钥库,并适当地修改了server.xml文件中的path。 现在,当我尝试连接时,我得到以下错误(这是来自Firefox,但所有浏览器产生类似的错误):
安全连接失败
连接到172.31.1.36:8443期间发生错误。 无法与对等端安全通信:没有常用的encryptionalgorithm。 错误代码:SSL_ERROR_NO_CYPHER_OVERLAP
您尝试查看的页面无法显示,因为收到的数据的真实性无法validation。 请联系网站所有者告知他们这个问题。
我的理解是,证书不能控制什么密码或协议应该使用,所以我不明白为什么会发生这种情况。 这是我在制作CSR时犯的一个错误,还是客户在生成证书时犯的错误?
-编辑-
我似乎在任何地方都会遇到错误。 如果我试图将密钥导入到密钥库,我得到这个:
cat <keyfile> | openssl pkcs12 -export -out <keystore>.p12 Enter pass phrase: unable to load certificates
或这个:
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
我有客户给我发送证书链,当我尝试导入时,我得到这个错误:
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
我发现了一些关于如何将pkcs文件转换为x.509的解决scheme,但是后来发现了其他错误,所以现在我完全被卡住了。
所有问题的根本原因是证书格式错误。
通过在这里的信息,我发现证书实际上是在DER格式。 我转换它如下:
openssl x509 -inform der -in certfile.cer -out new_certfile.pem