如何在 Tomcat9 中设置 SSL?

如何在 Tomcat9 中设置 SSL?

我曾尝试在端口 8443 上的 tomcat 9 上安装 SSL。但是,我不知道 tomcat 是否支持 pem 或 crt 格式的 SSL。

我已经对 server.xml 进行了更改,但是当启动 tomcat 时,我在 catelina.out 日志中收到以下错误。

下面是我的 server.xmaconfiguration。

 <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeyFile="conf/privkey.key"
                         certificateFile="conf/fullchain.crt"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>

Tomcat 错误日志

org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["https-openssl-nio-8443"]
17-Nov-2021 14:58:19.826 SEVERE [main] org.apache.catalina.util.LifecycleBase.handleSubClassException Failed to initialize component [Connector[HTTP/1.1-8443]]
    org.apache.catalina.LifecycleException: Protocol handler initialization failed
        at org.apache.catalina.connector.Connector.initInternal(Connector.java:983)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
        at org.apache.catalina.core.StandardService.initInternal(StandardService.java:533)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
        at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:1059)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:584)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:607)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:304)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:474)
    Caused by: java.lang.IllegalArgumentException
        at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:99)
        at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:71)
        at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:218)
        at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1124)
        at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1137)
        at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:574)
        at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:74)
        at org.apache.catalina.connector.Connector.initInternal(Connector.java:980)
        ... 13 more
    Caused by: java.lang.NullPointerException
        at org.apache.tomcat.util.net.jsse.PEMFile.<init>(PEMFile.java:101)
        at org.apache.tomcat.util.net.jsse.PEMFile.<init>(PEMFile.java:74)
        at org.apache.tomcat.util.net.SSLUtilBase.getKeyManagers(SSLUtilBase.java:303)
        at org.apache.tomcat.util.net.openssl.OpenSSLUtil.getKeyManagers(OpenSSLUtil.java:98)
        at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:247)
        at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:

答案1

Tomcat 因 SSL 处理困难而臭名昭著。我的建议:在 Tomcat 前面放置一个反向代理来处理 SSL。

有多种软件包可以用作反向代理。其中最流行的两个是 Apache 和 Nginx。选择一个,将其安装在与 Tomcat 服务器相同的机器上,并将其配置为在您选择的端口上接受 HTTPS 请求,并将它们作为 HTTP 转发到您的 Tomcat HTTP 端口。

很多地方都有关于如何设置 Apache 或 Nginx 作为 SSL 反向代理的教程,例如这里这里

相关内容