首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Debian 9 Tomcat 9让我们加密SSL配置

Debian 9 Tomcat 9让我们加密SSL配置
EN

Stack Overflow用户
提问于 2021-01-03 01:57:03
回答 2查看 194关注 0票数 2

现在我都快疯了。

我已经创建了指向PEM文件的sym链接。我使tomcat用户可以读取PEM文件。我将server.xml设置为使用SSL。并且连接器不能启动。

代码语言:javascript
复制
<Connector port="8443"
               protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="200"
               scheme="https"
               secure="true"
               SSLEnabled="true"
               clientAuth="false"
               sslProtocol="TLS"
               sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"
               defaultSSLHostConfigName="mydomain.com"
    >
        <SSLHostConfig hostName="mydomain.com" protocols="+TLSv1,+TLSv1.1,+TLSv1.2">
            <Certificate
                certificateKeyFile="conf/privkey.pem"
                certificateFile="conf/cert.pem"
                certificateChainFile="conf/chain.pem"
                type="UNDEFINED"
            />
        </SSLHostConfig>
    </Connector>

我确实尝试将类型更改为RSA,但无济于事。我在日志里看到的就是:

代码语言:javascript
复制
02-Jan-2021 17:40:54.398 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["https-openssl-nio-8443"]
02-Jan-2021 17:40:54.466 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:1013)
                ... some lines removed
                at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:473)
        Caused by: java.lang.IllegalArgumentException
                at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:99)
                ... some lines are removed
                at org.apache.catalina.connector.Connector.initInternal(Connector.java:1010)
                ... 13 more
        Caused by: java.io.IOException
                at org.apache.tomcat.util.net.SSLUtilBase.getKeyManagers(SSLUtilBase.java:302)
                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:97)
                ... 20 more

我已经检查了SSLUtilBase.java代码(Tomcat9.0.33):

代码语言:javascript
复制
            if (certificate.getCertificateFile() == null) {
                throw new IOException(sm.getString("jsse.noCertFile"));
            }

我确实尝试过复制文件,而不是使用sym链接。没有用。已从证书文件中删除注释。没有用。tomcat似乎找不到我在server.xml中指定的文件。

我错过了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-05 19:47:50

每当您在连接器上使用其中一个deprecated properties时,Tomcat都会创建一个包含hostName="_default_"<Connector>元素的<SSLHostConfig>元素。该错误是由于此特定元素上缺少certificateFile而导致的。

<Connector>元素中删除不推荐使用的属性(clientAuthsslProtocol),一切都会正常工作。

代码语言:javascript
复制
    <Connector port="8443"
               protocol="org.apache.coyote.http11.Http11NioProtocol"
               SSLEnabled="true"
               sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"
               defaultSSLHostConfigName="mydomain.com">
        <SSLHostConfig hostName="mydomain.com" protocols="TLSv1+TLSv1.1+TLSv1.2">
            <Certificate
                certificateKeyFile="conf/privkey.pem"
                certificateFile="conf/cert.pem"
                certificateChainFile="conf/chain.pem"
                type="UNDEFINED"
            />
        </SSLHostConfig>
    </Connector>

备注:sslProtocol属性是JSSE的一个特征,应该始终保留为默认值(TLS)。

票数 1
EN

Stack Overflow用户

发布于 2021-09-02 23:44:34

我在Ubuntu 20.04和Tomcat 9.0.52上也遇到了同样的问题。

代码语言:javascript
复制
Tomcat - server.xml - certificateKeyFile

<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true" >
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig>
                    <Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
                     certificateFile="conf/localhost-rsa-cert.pem"
                     type="RSA" />
    </SSLHostConfig>
</Connector>

我也尝试了你上面描述的所有方法,但我也无法让Tomcat Connector与certificateKeyFile一起工作。

注意,在RedHat Linux7/8上它工作得很好!我只在Ubuntu 20.04中遇到了这个问题。

好消息是,如果你使用密钥库而不是certificateKeyFile,它在Ubuntu20.04中工作得很好。

您需要以运行tomcat的用户身份创建keystore,在我的示例中,用户名为"tomcat",然后使用keystore创建CSR,颁发证书,并将证书导入keystore。

--创建keystore文件夹并授予适当的权限:

代码语言:javascript
复制
su - root
mkdir /rhdata/sslcert
chown -R tomcat:tomcat /rhdata/sslcert
su - tomcat
cd /rhdata/sslcert

--创建PKCS12密钥库(必须执行上一步):

代码语言:javascript
复制
su - tomcat
/usr/lib/jvm/java-11-openjdk-amd64/bin/keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keystore /rhdata/sslcert/.keystore
$ /usr/lib/jvm/java-11-openjdk-amd64/bin/keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -validity 3600 -keysize 2048 -keystore /rhdata/sslcert/.keystore
Enter keystore password:  key$tom@2021
$ /usr/lib/jvm/java-11-openjdk-amd64/bin/keytool --list --keystore /rhdata/sslcert/.keystore -storepass 'key$tom@2021'

--创建CSR:

代码语言:javascript
复制
su - tomcat
$ /usr/lib/jvm/java-11-openjdk-amd64/bin/keytool -certreq -keyalg RSA -alias tomcat -file /rhdata/sslcert/keytool_cert/certreq.csr -keystore /rhdata/sslcert/.keystore -storepass 'key$tom@2021'

--使用CSR从证书颁发机构创建新证书

--将新证书导入密钥库:

代码语言:javascript
复制
su - tomcat
$ /usr/lib/jvm/java-11-openjdk-amd64/bin/keytool -import -alias tomcat -keystore /rhdata/sslcert/.keystore -storepass 'key$tom@2021' -file /rhdata/sslcert/keytool_cert/certnew.p7b
$ /usr/lib/jvm/java-11-openjdk-amd64/bin/keytool -import -alias tomcat -keystore /rhdata/sslcert/.keystore -storepass 'key$tom@2021' -file /rhdata/sslcert/keytool_cert/certnew.cer

--这是新的Tomcat连接器:

代码语言:javascript
复制
Tomcat - server.xml - keystore

<Connector
       protocol="org.apache.coyote.http11.Http11NioProtocol"
       port="8443" maxThreads="200"
       scheme="https" secure="true" SSLEnabled="true"
       keystoreFile="/rhdata/sslcert/.keystore" keystorePass="key$tom@2021"
       clientAuth="false" sslProtocol="TLS"/>

--验证新的Tomcat server.xml文件

代码语言:javascript
复制
su - tomcat
cd /usr/local/tomcat9/conf
/usr/local/tomcat9/bin/configtest.sh

--然后,停止/启动Tomcat。

代码语言:javascript
复制
su - root
systemctl stop tomcat.service
systemctl start tomcat.service
systemctl status tomcat.service
vi /usr/local/tomcat9/logs/catalina.out   <-- shall not have any errors!!!
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65542329

复制
相关文章

相似问题

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