Tomcat HTTPS密钥库证书
使用SSL和Tomcat进入另一个问题:我已经配置了一个密钥库,其中包含密钥和证书(我希望向连接到该站点的客户端提供的服务器证书)。 我为信任库做了同样的事情(我将需要客户端身份validation)。
我现在遇到的问题是,当我通过HTTPS连接到我的Tomcat实例时,呈现给我的证书(服务器证书)不是我的实际服务器证书,而是JKS密钥库中的密钥。 使用-Djavax.net.debug = ssl显示它为客户端身份validation提供了正确的CA,但没有提供正确的服务器证书。
添加为可信证书:主题:CN = A发行者:CN = A算法:RSA; 序列号: - 从2009年11月10日星期二14:48:31 CET到2009年2月8日星期一14:48:31 CET 2010添加为可信证书:主题:X发行人:X算法:RSA; 序列号: - 有效期为2005年1月19日星期三01:00:00 CET至2015年1月19日星期一00 00:59:59
我用占位符取代了真正的价值观。 A =服务器的域名(但在这种情况下,由于某种原因,这是密钥而不是证书)。 X = VeriSign CA(这应该是正确的)。 我有一个现有的证书,我想用它来呈现给客户端,我使用keytool将其导入JKS密钥库。
Tomcat连接器配置:
连接器端口=“444”协议=“HTTP / 1.1”SSLEnabled =“true” maxThreads =“150”scheme =“https”secure =“true” clientAuth =“false”sslProtocol =“TLS” keystoreFile = “CONF / SSL / keystore.jks” keystorePass = “XX” keyAlias = “密押” truststoreFile = “CONF / SSL / truststore.jks” truststorePass = “XX”
知道为什么我的Tomcat实例没有提供正确的证书吗?
问题是(显然 – 我无法确认这一点),将先前生成的证书(和匹配密钥)正确导入JKS密钥库并由Tomcat正确呈现它是不可能的。
我的问题发生的情况如下:
- 我有一个证书文件,我自己使用OpenSSL从头开始生成(密钥+ CSR – >证书),由我自己的CA签名。
- 我希望配置Tomcat,以便它将此特定证书提供给连接到我的站点的用户。
我发现工作的解决方案是:
-
将现有证书及其私钥转换为DER格式。 例如(使用OpenSSL):
对于私钥 ;
openssl pkcs8 -topk8 -nocrypt -in my_private_key.key -inform PEM -out my_private_key.der -outform DER
对于实际签署的证书 ;
openssl x509 -in my_certificate.crt -inform PEM -out my_certificate.der -outform DER
-
使用自定义Java类将两个DER文件导入密钥库(JKS文件)。
java ImportKey my_private_key.der my_certificate.der
我自己并没有想到这一点(归功于原始发明者)。这个Java类的源代码,以及更多细节可以在这里和这里找到。 我稍微修改了这个类,以便有一个第3(或第4)参数指定生成的JKS文件的输出位置。
最终结果是一个JKS密钥库,然后可以在Tomcat Connector配置中用作密钥库。 上面的工具将生成带有密钥和JKS文件本身的默认密码的JKS文件,稍后可以使用keytool -storepasswd
和keytool -keypasswd
更改这些密码。 希望这对面临同样问题的人有所帮助。
您的配置应该正常工作。
Tomcat的操作方法解释了为获得合适的JKS而采取的步骤。
确保已使用适当的别名(testKey)将证书导入jks
扩展@Bozho评论,
这非常重要。 “密钥和购买的证书应使用相同的别名” 。
从CA(Verisign,Digicert等)购买的SSL证书应使用与创建csr之前生成的私钥相同的别名导入。 使用java keytool将购买的证书导入密钥库后,您将看到“将证书回复添加到密钥库”。
要检查信任链,请使用terminal命令openssl s_client -connect yourdomain.com:443 -showcerts。 它从您的证书开始,最终导致受信任的根CA.
- 如何在Win10 / Tomcat7 / Java7上从Web应用程序启用TLSv1.1 +出站通信?
- 将“jsse.enableSNIExtension”设置为false会带来什么安全后果?
- 如何在WireMock中成功获取HTTPS端点代理?
- 使用java代码将证书添加到密钥库
- 如何使用AES-256在Spring Boot上设置SSL(TLS)/ HTTPS?
- 如何强制Commons HTTPClient 3.1仅对HTTPS使用TLS 1.2?
- 什么可能导致套接字ConnectException:连接超时?
- Spring Boot将HTTP重定向到HTTPS
- 所有信任的HostnameVerifier都会导致HttpURLConnection出现SSL错误