将 PKCS#12 文件与 Tomcat 8.5.41 Nio2 连接器一起使用

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

我必须使用的第 3 方 Docker 映像有 Tomcat 8.5.41、OpenSSL 1.1.0j。 Tomcat 日志显示 OpenSSL 已成功初始化。

问题是 Tomcat 未成功初始化

[Connector[org.apache.coyote.http11.Http11Nio2Protocol-8443]]
我已将此 Connector 元素添加到 Tomcat 进程使用的 server.xml 中:

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
            maxThreads="150" SSLEnabled="true"
            scheme="https" secure="true" defaultSSLHostConfigName="thehost"
            sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"
            keyPass="changeIt"
            keystorePass="changeIt"
            keystoreType="PKCS12"
            keystoreFile="conf/thehost-cert.pfx" >
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        <SSLHostConfig certificateVerification="none" protocols="SSLv2Hello,TLSv1.2,TLSv1.3"
                hostName="thehost"
                ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA"
                caCertificateFile="ISRG_Root_X1.pem"  caCertificatePath="/etc/ssl/certs">
            <OpenSSLConf>
            </OpenSSLConf>
            <Certificate type="RSA" />
        </SSLHostConfig>
    </Connector>

服务器证书是通过 The Littlest JupyterHub ACME 设置获得的 PKCS#12。所以我真的很想使用该证书来避免浏览器必须处理多个证书(不同的序列号等),即使是由同一个根 CA 颁发的。我确实发现我必须重新创建 PKCS#12 文件才能添加密码(Stackoverflow 发布的内容表明 Tomcat 不会接受空的密钥库密码。因此需要重新创建。

我尝试使用未弃用的配置元素(通过certificateKeystorePassword 在证书元素中具有 keystorePass 属性,但不允许,因为这是 JSSE 属性),但没有运气 - 密码错误。我使用容器的 openssl pkcs12 命令来验证密码是否正确。任何其他值 -> 无法以 PEM 格式显示证书和密钥。

是否有人获得了 8.5+ 语法来处理具有密码的 PKCS#12 文件,并使用 OpenSSL 1.1.0?使用 Nio2 连接器?当然,移动这些属性,现在我得到了非常令人愉快的“IllegalArgumentException”,异常中没有指示标识什么非法参数?我有没有提到这有多有趣?

MTIA 获取任何见解。最好的决定可能是从 pfx 中抓取证书、密钥并使用传统的 PEM x509 证书、私钥文件?正如我在过去 15 年多里所做的很多事情一样。 PKCS#12 文件?没那么多。

tomcat openssl pkcs#12
1个回答
0
投票

您不能像这样混合连接器级别和 SSLHostConfig/证书级别属性;请参阅此处第 6 段

我没有 8.5,但在 Ubuntu 18.04 上的 9.0.16(带有 tcnative 1.2.21 和 OpenSSL 1.1.1)中,如果我使用 all 连接器级属性(即旧的 pre- 8.5 方式,现已弃用但仍在工作)使用所有 SSLHostConfig 和证书并且使 SSLHostConfig.hostName 与 Connector.defaultSSLHostConfigName 匹配(您的没有):

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
    maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
    sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"
     keyPass="redacted" keystorePass="redacted" keystoreType="PKCS12"
     keystoreFile="redacted.p12" 
     sslEnabledProtocols="SSLv2Hello,TLSv1.2,TLSv1.3"
     ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA"
    >
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
 >

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
    maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
    sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"
    defaultSSLHostConfigName="localhost"
    >
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig hostName="localhost"
        protocols="SSLv2Hello,TLSv1.2,TLSv1.3"
        ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA"
        >
        <Certificate certificateKeystoreType="PKCS12" 
            certificateKeystorePassword="redacted" certificateKeyPassword="redacted"
            certificateKeystoreFile="redacted" />
    </SSLHostConfig>
</Connector>

旁白:使用 OpenSSL 指定 SSLv2Hello 会被忽略,如文档中所述,甚至对于 JSSE 来说,使用 only 1.2 和 1.3 指定 SSLv2Hello 也是没有意义的,因为即使在很久以前它有一些实用程序的时候,SSLv2Hello 也不能协商需要扩展的协议——1.2(有效)和1.3都这样做。此外,当您不进行客户端身份验证时,指定“ca”证书(以 OpenSSL 样式)或“trustStore”证书(以 JSSE 样式)是不必要且无用的。

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