由自己的CA签名的有效SSL证书

时间:2015-12-28 19:39:48

标签: java apache tomcat ssl https

El problemo:我希望拥有自己的CA并发出签名证书,这些证书可以在内部用于测试通过HTTPS进行通信的Android应用和REST Web服务。我选择的服务器是Tomcat 7。 我已按照指南在Tomcat上根据其文档的Installing a Certificate from a Certificate Authority section使用keytool设置SSL:

keytool -genkey -alias tomcat -keystore keystore.jks
keytool -certreq -alias tomcat -file certreq.csr -keystore keystore.jks

要签署证书签名请求,我使用openssl:

openssl ca -config openssl.cnf -out server.crt -extensions android_ext \
-extfile android_ext.cnf -md sha256 -infiles certreq.csr 

最后,我将CA证书和服务器证书导入密钥库:

keytool -import -alias root -keystore keystore.jks -trustcacerts -file cacert.crt
keytool -import -alias tomcat -keystore keystore.jks -file server.crt

之后我设置tomcat使用keystore.jks并启动它。如果我进入Firefox并尝试使用https进行导航,则会出现“安全连接失败”错误。

运行openssl s_client我得到this output

运行keytool -printcert我得到this output

如果我跑openssl verify -CAfile .\ca\cacert.pem .\server.crt我得到:

  

。\ server.crt:好的

就我对SSL和证书的了解而言,我无法找到为什么当我通过Firefox时出现错误。最有趣的是,使用Chrome会给我一个“连接重置”错误。

我需要一些帮助,但可能会出现什么问题?有什么想法吗?

1 个答案:

答案 0 :(得分:0)

La soluzione

所以经过两天试图找出可能出现的问题之后 - 我在这里作为最后的手段发布了 - 一位同事指出Chrome会逐步取消sha1签名证书 - 请查看this,{{ 3}}和this。并且显然默认情况下使用sha1标记openssl。因此,只需为具有更强签名的CA创建新证书并再次签名即可。以下是将来参考的命令:

openssl req -new -key .\private\cakey.pem.old -out .\ca\ca.csr -sha256 -config openssl.cnf
openssl x509 -req -days 8052 -sha256 -in .\ca\ca.csr -signkey .\private\cakey.pem -out ca\cacert.pem