首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试让Tomcat使用Windows证书存储

尝试让Tomcat使用Windows证书存储
EN

Stack Overflow用户
提问于 2022-07-15 15:44:23
回答 1查看 210关注 0票数 1

我一直试图修改Tomcat 9安装以使用Windows证书存储(证书安装在受信任根证书颁发机构下,来自我从Entrust证书生成的PFX文件,并将别名"tomcat“分配给它)。这是在Server2019上,安装了Oracle Java。Java -version报告18.0.1.1,javac -version也报告18.0.1.1。

当我启动Tomcat时,我就得到了这个异常。

代码语言:javascript
复制
15-Jul-2022 08:28:50.561 SEVERE [main] org.apache.catalina.util.LifecycleBase.handleSubClassException Failed to initialize component [Connector[HTTP/1.1-2443]]
    org.apache.catalina.LifecycleException: Protocol handler initialization failed
        at org.apache.catalina.connector.Connector.initInternal(Connector.java:1051)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
        at org.apache.catalina.core.StandardService.initInternal(StandardService.java:556)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
        at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:1045)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:724)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:746)
        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 [tomcat] does not identify a key entry
        at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:107)
        at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:71)
        at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:234)
        at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1227)
        at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1240)
        at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:603)
        at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:80)
        at org.apache.catalina.connector.Connector.initInternal(Connector.java:1048)
        ... 13 more
    Caused by: java.io.IOException: Alias name [tomcat] does not identify a key entry
        at org.apache.tomcat.util.net.SSLUtilBase.getKeyManagers(SSLUtilBase.java:337)
        at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:247)
        at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:105)
        ... 20 more

以下是SSL连接的相关连接器部分

代码语言:javascript
复制
    <Connector port="2443" scheme="https" secure="true"
                sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
                SSLEnabled="true">
        <SSLHostConfig hostName="localhost"
                    sslProtocol="TLS"
                    protocols="TLSv1.3,+TLSv1.2">
            <Certificate 
                certificateKeystoreFile=""
                certificateKeystoreProvider="SunMSCAPI"
                certificateKeyAlias="tomcat"
                certificateKeystoreType ="Windows-ROOT" />
        </SSLHostConfig>
    </Connector>

我在这里发现了一个问题,有人提供了一些Java代码来验证证书的安装和可用,我做了一些小的修改(没有改变功能,只是没有列出所有证书)。

代码语言:javascript
复制
import javax.net.ssl.KeyManagerFactory;
import java.security.KeyStore;
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance("Windows-ROOT");
ks.load(null, null);

Enumeration<String> aliases = ks.aliases();

System.out.println("Examining " + ks.size() + " aliases ");
while (aliases.hasMoreElements())
{
    String ka = aliases.nextElement();
    if (ks.isKeyEntry(ka))
    {
        System.out.println(ka + " is a key entry.");
    }
}

当我使用JShell运行它时,输出是.

代码语言:javascript
复制
Examining 35 aliases
tomcat is a key entry.

我不是Tomcat的专家,但我一直在查阅有关这方面的文档,并从各地找出一些零碎的东西,试图挽救我的理智和头发。

我确信这是一件简单的事情,我做错了,不理解,所以如果我做了什么蠢事,我愿意接受我的愚蠢。

EN

回答 1

Stack Overflow用户

发布于 2022-07-20 20:58:33

我终于解决了这个问题。如果我回答自己的问题违反了政策,请告诉我。

问题的结果是Tomcat作为一个服务运行,使用内置服务类型的on。我将其更改为使用正常帐户,并确保新帐户能够作为服务运行。我将证书添加到该用户的证书存储区,它能够在没有错误的情况下运行(我开始怀疑是否会识别一个无错误启动)。

还有更多的验证要做,但看起来它解决了这个问题(我想我在任何地方都没有看到这一点)。

我在Tomcat用户邮件列表上看到有人建议尝试运行Tomcat作为操作系统的正常帐户,看看这是否有帮助,这让我的头朝正确的方向踢去。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72996544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档