首先,我知道已经有人问过类似的问题,我尝试按照建议进行故障排除,但没有成功。所以,我认为我最好还是发帖寻求帮助。预先感谢您的帮助。
问题:我做错了什么?我应该检查什么/哪里?
目标:我正在尝试在 Tomcat 上设置证书。我有 Tomcat 8.5、%JAVA_HOME%="C:\Program Files\Java\jdk1.8.0_121" 和使用以下命令生成的证书:
keytool -genkeypair -alias cert -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -keypass 123456 -storepass 123456 -keystore d:\cert.jks
并填写我的姓名和其他信息等来生成密钥对。
我看到许多 YouTube 视频和其他说明都提到“genkey”而不是“genkeypair”,但此选项在此计算机上不可用。不管怎样,我修改了 server.xml 文件,添加了以下内容:
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="D:\cert.jks" type="RSA" keystorePass="123456" />
</SSLHostConfig>
</Connector>
执行 catalina configtest 给了我这个:
04-Apr-2017 19:28:16.271 SEVERE [main] org.apache.coyote.AbstractProtocol.init Failed to initialize end point associated with ProtocolHandler ["https-jsse-nio-443"]
java.lang.IllegalArgumentException: java.io.IOException: Keystore was tampered with, or password was incorrect
<Certificate certificateKeystoreFile="D:\cert.jks" type="RSA" keystorePass="123456" />
问题来了。密钥库类型是 JKS,而不是 RSA1。 keypair 类型是 RSA。
您可能还必须将密钥对/证书条目重命名为“tomcat”或 Tomcat 8 中的默认值,或者告诉 Tomcat 使用别名“cert”(糟糕的选择)。
keytool
指定任何其他类型。FWIW,我可以让它与 HTTP/1.1 协议一起工作 - 更简单。
基本都换了
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="D:\cert.jks" type="RSA" keystorePass="123456" />
</SSLHostConfig>
</Connector>
有了这个
<Connector port="443" protocol="HTTP/1.1"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clienAuth="false" sslProtocol="TLS" keystoreFile="/conf/.keystore" keystorePass="123456" />
继续阅读有关 Tomcat 和存储类型的更多信息。这里有一个有趣的线程:如何创建包含客户端证书链的 BKS(BouncyCastle)格式 Java 密钥库