Tomcat无法访问Windows证书存储中的证书



我正在配置Tomcat以使用Windows证书存储,从而允许通过Microsoft System Center Operations Manager跟踪证书到期。我已经配置了Tomcat 8.5连接器来使用Windows证书存储,如下所示:

<Connector  port="443" 
scheme="https"
secure="true"
SSLEnabled="true"
>
<SSLHostConfig  hostName="*.mms.ams.local"
sslProtocol="TLS"
protocols="TLSv1,+TLSv1.1,+TLSv1.2"
truststoreProvider="SunMSCAPI"
truststoreType="Windows-ROOT"
>
<Certificate    certificateKeyStoreProvider="SunMSCAPI"
certificateKeyAlias="*.mms.ams.local"
certificateKeystoreFile="NONE"
certificateKeystorePassword=""
certificateKeystoreType="Windows-My"
type="RSA"
/>
</SSLHostConfig>
证书的通用名称/友好名称是相同的,具有关联的私钥,并且具有正确的、经过验证的证书链。但是,当Tomcat启动时,日志中会抛出以下错误:
11-Feb-2022 10:12:48.226 SEVERE [main] org.apache.catalina.core.StandardService.initInternal Failed to initialize connector [Connector[HTTP/1.1-443]]
org.apache.catalina.LifecycleException: Protocol handler initialization failed
at org.apache.catalina.connector.Connector.initInternal(Connector.java:1076)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
at org.apache.catalina.core.StandardService.initInternal(StandardService.java:552)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:843)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
at org.apache.catalina.startup.Catalina.load(Catalina.java:639)
at org.apache.catalina.startup.Catalina.load(Catalina.java:662)
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:305)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:475)
Caused by: java.lang.IllegalArgumentException: Alias name [*.mms.ams.local] does not identify a key entry
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:100)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:72)
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:244)
at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1189)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.init(AbstractJsseEndpoint.java:222)
at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:617)
at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:80)
at org.apache.catalina.connector.Connector.initInternal(Connector.java:1074)
... 13 more
Caused by: java.io.IOException: Alias name [*.mms.ams.local] does not identify a key entry
at org.apache.tomcat.util.net.SSLUtilBase.getKeyManagers(SSLUtilBase.java:335)
at org.apache.tomcat.util.net.openssl.OpenSSLUtil.getKeyManagers(OpenSSLUtil.java:98)
at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:244)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:98)
... 20 more

经过三天的搜索,我在网上找不到任何可能导致Microsoft证书存储出现此问题的参考资料。我发现的几乎所有引用都引用了基于文件的密钥库,但这并不适用。Tomcat的文档虽然表示支持使用Microsoft Keystore,但在谈到连接器的正确配置时却很少提及。";server.xml";文件也很含糊。到了连接器的这一点,我不得不将几篇文章中的设置拼凑在一起。有经验的人有什么建议或建议吗?提前感谢您的考虑。

经过大量研究,我发现了这个问题,我将把它发布在这里,这样我就可以省去其他Windows服务器管理员的时间去做同样的兔子洞了。:-(

为了访问Windows证书存储,您需要使用"存储提供程序";SunMSCAPI";。这是SUN/Java提供的CAPI。然而,CAPI存在一个已知的(但几乎没有记录的(问题。而TrustStoreType";Windows ROOT";能够跨不同的存储访问根/中间证书存储;Windows MY";仅访问CurrentUser\My存储。这意味着,为了使用此CAPI访问证书,您需要以Tomcat/Java应用程序运行的用户身份登录,并将证书添加到CurrentUser\My存储中,如果在多个帐户下运行多个服务,这可能会很乏味(如果必须将其作为本地服务运行,请不要让我开始(。LocalMachine\My商店是一个可以随时访问证书的地方,无论哪个帐户正在访问它。

据我所知,这个问题自2011年以来一直存在,但Sun没有明显尝试解决/纠正它。我已经找到了一些独立开发的解决方案,但没有由软件公司发布支持/定期更新的解决方案。

我们将转向一个混合解决方案,其中ROOT/INTERMEDIATE证书将通过SunMSCAPI访问,pub/priv证书将以PKCS12格式存储在文件共享中,并通过脚本和工具监控其过期情况。感谢所有评论和贡献的人。

最新更新