【问题标题】:InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty on upgrading from Tomcat 7InvalidAlgorithmParameterException:从 Tomcat 7 升级时 trustAnchors 参数必须为非空
【发布时间】:2021-05-02 16:10:59
【问题描述】:

我已经回答了几个关于这个问题的问题和答案,但仍然无法解决这个问题。

我正在从 Tomcat 7 升级到 8.5。我已将 server.xml、web.xml 和 context.xml 从旧服务器复制到新服务器。我所做的唯一更改是在 server.xml 中注释以下行

<!--Listener className="org.apache.catalina.core.JasperListener" /-->

连接器端口规格如下:

<Connector port="50000" protocol="org.apache.coyote.http11.Http11Protocol"
           SSLEnabled="true" acceptCount="100" debug="0" maxProcessors="75"
           minProcessors="5" server="Server for App" clientAuth="false"
           sslProtocol="TLS"  maxThreads="150" scheme="https" secure="true"
           sslEnabledProtocols="TLSv1.2" keystoreFile="/location/keystore.p12"
           truststoreType="PKCS12" keystoreType="PKCS12" keystorePass="***"
           truststoreFile="/location/keystore.p12" truststorePass="***"
           ciphers="***" connectionTimeout="60000" />

启动 Tomcat 会产生以下错误:

    SEVERE [main] org.apache.catalina.core.StandardService.initInternal Failed to initialize connector [Connector[org.apache.coyote.http11.Http11Protocol-50000]]
            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:846)
                    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(NativeMethodAccessorImpl.java:62)
                    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                    at java.lang.reflect.Method.invoke(Method.java:498)
                    at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:302)
                    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:472)
            Caused by: java.lang.IllegalArgumentException: the trustAnchors parameter must be non-empty
                    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:247)
                    at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1143)
                    at org.apache.tomcat.util.net.AbstractJsseEndpoint.init(AbstractJsseEndpoint.java:222)
                    at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:599)
                    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.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
                    at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:200)
                    at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:157)
                    at java.security.cert.PKIXBuilderParameters.<init>(PKIXBuilderParameters.java:130)
                    at org.apache.tomcat.util.net.SSLUtilBase.getParameters(SSLUtilBase.java:501)
                    at org.apache.tomcat.util.net.SSLUtilBase.getTrustManagers(SSLUtilBase.java:432)
                    at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:245)
                    at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:98)
                    ... 20 more

设置-Djavax.net.debug=all并没有产生太多额外的线索。

我相信这与证书有关,但如果我使用相同的设置运行旧的 Tomcat 7,它就可以正常工作。非常感谢任何帮助。

【问题讨论】:

  • 由于连接器在 Tomcat 8.5 中重构,所以没有 Http11Protocol。尝试使用默认值(省略属性)或阅读documentation 以查看您的选择。
  • 我尝试删除属性并尝试根据文档设置属性但没有运气
  • 您能列出您在keystore.p12 中有哪些密钥库条目吗?你应该有一个PrivateKeyEntry 和至少一个TrustedCertEntry。由于您不使用客户端身份验证,因此您也可以省略truststore* 参数,以便应用默认值。
  • 密钥库类型:PKCS12 密钥库提供者:SUN 您的密钥库包含 1 个条目 别名:xxx 创建日期:2021 年 5 月 1 日 条目类型:PrivateKeyEntry 证书链长度:1 证书[1]:所有者:EMAILADDRESS= xxx, CN=xxx, OU=xx, O=xx, L=xxx, ST=xx, C=xxx 发行人:CN=我们自己的 ca, DC=xx, DC=xx 序列号:xxx 有效期:3 月 21 日星期三2018 年 IST 16:56:37 至:2020 年 3 月 21 日星期六 17:06:37 IST
  • @PiotrP.Karwasz 我设法通过将一个全局可信证书导入密钥库来使其工作。感谢您的帮助!

标签: java ssl tomcat ssl-certificate tomcat8


【解决方案1】:

原来密钥库需要一个 TrustedCertEntry,而它只有一个 PrivateKeyEntry。我使用 keytool 导入了一个全球可信证书,问题已解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2012-01-08
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    相关资源
    最近更新 更多