tomcat - Tomcat 将 Windows 证书存储用于 SSL
问题描述
我使用 Tomcat 9.0.10 并希望使用 Windows 证书存储来保存 SSL 私钥和证书。这里有另一个线程,似乎有答案,但是在启动 Tomcat 时出现异常。
我的 server.xml 看起来像这样:
<Connector port="443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true"
maxthreads="150"
scheme="https"
secure="true"
keyAlias="SERVER-TST-1.domain.local"
keystoreFile=""
keystoreType="Windows-ROOT"
clientAuth="false"
sslProtocol="TLS"
connectionTimeout="20000"
keepAliveTimeout="200000" />
这是一个例外:
org.apache.catalina.util.LifecycleBase.handleSubClassException Failed to initialize component [Connector[HTTP/1.1-443]]
org.apache.catalina.LifecycleException: Protocol handler initialization failed
at org.apache.catalina.connector.Connector.initInternal(Connector.java:935)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
at org.apache.catalina.core.StandardService.initInternal(StandardService.java:530)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:852)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
at org.apache.catalina.startup.Catalina.load(Catalina.java:633)
at org.apache.catalina.startup.Catalina.load(Catalina.java:656)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:306)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:491)
Caused by: java.lang.IllegalArgumentException: Alias name [SERVER-TST-1.domain.local] does not identify a key entry
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:114)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:85)
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:216)
at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1043)
at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:540)
at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:74)
at org.apache.catalina.connector.Connector.initInternal(Connector.java:932)
... 13 more
Caused by: java.io.IOException: Alias name [SERVER-TST-1.domain.local] does not identify a key entry
at org.apache.tomcat.util.net.jsse.JSSEUtil.getKeyManagers(JSSEUtil.java:229)
at org.apache.tomcat.util.net.openssl.OpenSSLUtil.getKeyManagers(OpenSSLUtil.java:79)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:112)
... 19 more
该证书在 Windows 证书存储中也有私钥。我也将它们导入到本地计算机和当前用户存储中。SSL 证书和整个链都在证书存储中。此外,证书中的 CN 是 SERVER-TST-1.domain.local 如果我将 Tomcat 配置为使用导入证书+私钥和链的 PFX 文件,那么一切正常。我只是想避免使用明文形式的密钥库密码,因此我想使用 Windows 证书存储。
解决方案
根据使用 Java 在本机平台中 利用安全性 Windows-ROOT密钥库包含机器信任的所有根 CA 证书。
您应该将 keystoreType 设置为Windows-MY,其中包含用户的私钥和相关的证书链。
此外,还有一个开放的OpenJDK 错误,即无法读取本地计算机证书。
推荐阅读
- rust - 如何在 serde crate 中合并宏和特征?
- css - react-native-paper-dates 日期选择器不显示
- android - 为什么我的应用无法从 Android 应用中链接到我的网站
- .net-core - Azure AKS 客户端证书身份验证服务 - NetCore 3.5
- reactjs - 基于组件尺寸的动态样式属性值
- excel - 在链接另一个单元格参考时将非空白单元格从工作表复制到另一个单元格
- javascript - 有什么方法可以在同一页面上触发多个表单的 DOM 事件?
- javascript - for 循环在 Angular 中的 Observable 之前完成
- python - Behave Python:如何创建单独的变量文件以用作输入参数
- c# - 从服务器端 Blazor 应用程序连接到本地客户端