是否可以使用 OpenSSL 为 Tomcat 启用 HTTPS/TLS,而不需要本机库和 APR?

问题描述 投票:0回答:2

我正在尝试为 Tomacat (8.x) 启用 HTTPS/TLS,更喜欢 OpenSSL 替代方案,因为证书/密钥配置更简单(与带有密钥库的常见 JSSE 相比)。

遵循官方文档并启用连接器部分,如下所示:

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" 
          sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"
          maxThreads="150" SSLEnabled="true" scheme="https" secure="true">

        <SSLHostConfig protocols="TLSv1.2">
            <Certificate 
               certificateKeyFile="conf/MyKey.key"
               certificateFile="conf/MyCertificate.crt"
               type="RSA" />
        </SSLHostConfig>
    </Connector>

注意,我仍在使用

Http11NioProtocol
而不是 APR
Http11AprProtocol
连接器。

但是,使用此配置启动会失败,因为此配置组合似乎需要要构建和配置 Tomcat 本机库:

14-Jun-2019 10:38:46.363 SEVERE [main] org.apache.catalina.core.StandardService.initInternal Failed to initialize connector [Connector[HTTP/1.1-8443]]
 org.apache.catalina.LifecycleException: Failed to initialize component [Connector[HTTP/1.1-8443]]
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:112)
    at org.apache.catalina.core.StandardService.initInternal(StandardService.java:549)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
    at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:875)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:621)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:644)
    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:309)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492)
Caused by: java.lang.UnsatisfiedLinkError: org.apache.tomcat.jni.Pool.create(J)J
    at org.apache.tomcat.jni.Pool.create(Native Method)
    at org.apache.tomcat.util.net.openssl.OpenSSLEngine.<clinit>(OpenSSLEngine.java:70)
    at org.apache.tomcat.util.net.openssl.OpenSSLUtil.getImplementedProtocols(OpenSSLUtil.java:61)
    at org.apache.tomcat.util.net.SSLUtilBase.<init>(SSLUtilBase.java:53)
    at org.apache.tomcat.util.net.openssl.OpenSSLUtil.<init>(OpenSSLUtil.java:41)
    at org.apache.tomcat.util.net.openssl.OpenSSLImplementation.getSSLUtil(OpenSSLImplementation.java:36)
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:104)
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:87)
    at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:225)
    at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1082)
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.init(AbstractJsseEndpoint.java:267)
    at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:581)
    at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:66)
    at org.apache.catalina.connector.Connector.initInternal(Connector.java:993)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)

我确实构建并安装了 Tomcat native + APR 库,并在 Tomcat env 类路径中进行了配置,这解决了问题,但这不是重点。重点是,难道只有当我使用我没有使用的

Http11AprProtocol
时才需要 APR/本机库吗?我缺少什么?任何指示/帮助将不胜感激。谢谢!

ssl tomcat https apr
2个回答
2
投票

我犯的错误是我在连接器配置中明确配置了

sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"
。这就是导致对本机库的依赖以及启动时出错的原因。

未指定

sslImplementationName
会将其保留为默认值
org.apache.tomcat.util.net.jsse.JSSEImplementation
,并且可以与 OpenSSL 样式证书和密钥配置配合使用。最终配置:

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
          maxThreads="150" SSLEnabled="true" scheme="https" secure="true">

        <SSLHostConfig protocols="TLSv1.2">
            <Certificate 
               certificateKeyFile="conf/MyKey.key"
               certificateFile="conf/MyCertificate.crt"
               type="RSA" />
        </SSLHostConfig>
    </Connector>

主要问题的答案是:是的,可以使用纯 Java/JSSE 风格的配置和 OpenSSL 风格的 SSLHostConfig。

(然而,带有本机库的 APR/OpenSSL impl 的性能相对更高。)


0
投票

您的

Connector
上的此指令:
sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"

需要tc-native。如果您在 Tomcat 10 上使用此功能,则仍需要

AprLifecycleListener

<Listener className="org.apache.catalina.core.AprLifecycleListener" />

tc-native v1 也想要

SSLEngine="on"
<Listener>
标签上。

© www.soinside.com 2019 - 2024. All rights reserved.