tomcat https配置不上,记一次keystore与key不同的报错问题

在尝试配置Tomcat HTTPS时遇到无法访问加密页面的问题,错误源于keystore和key密码不一致。官方教程提示,如果这两个密码不同,需要在配置中同时设置keystore和key密码。解决方案是在server.xml中添加'certificateKeyPassword'属性并指定正确密码。

按照官方教程配置好server.xml后,无论怎么启动tomcat,死活都无法访问加密网页。在cmd下开启tomcat发现如下报错

27-Aug-2018 15:39:26.420 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/9.0.11
27-Aug-2018 15:39:26.424 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Aug 11 2018 19:47:23 UTC
27-Aug-2018 15:39:26.424 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:         9.0.11.0
27-Aug-2018 15:39:26.424 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Windows 10
27-Aug-2018 15:39:26.425 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            10.0
27-Aug-2018 15:39:26.425 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
27-Aug-2018 15:39:26.425 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             D:\jdk\jre
27-Aug-2018 15:39:26.425 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           1.8.0_171-b11
27-Aug-2018 15:39:26.426 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
27-Aug-2018 15:39:26.426 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         D:\apachetomcat9_0_11
27-Aug-2018 15:39:26.426 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         D:\apachetomcat9_0_11
27-Aug-2018 15:39:26.426 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=D:\apachetomcat9_0_11\conf\logging.properties
27-Aug-2018 15:39:26.426 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
27-Aug-2018 15:39:26.427 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
27-Aug-2018 15:39:26.427 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
27-Aug-2018 15:39:26.427 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs=
27-Aug-2018 15:39:26.427 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=D:\apachetomcat9_0_11
27-Aug-2018 15:39:26.427 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=D:\apachetomcat9_0_11
27-Aug-2018 15:39:26.428 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=D:\apachetomcat9_0_11\temp
27-Aug-2018 15:39:26.428 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded APR based Apache Tomcat Native library [1.2.17] using APR version [1.6.3].
27-Aug-2018 15:39:26.428 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
27-Aug-2018 15:39:26.428 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true]
27-Aug-2018 15:39:27.074 信息 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.0.2o  27 Mar 2018]
27-Aug-2018 15:39:27.177 信息 [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-80"]
27-Aug-2018 15:39:27.341 信息 [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
27-Aug-2018 15:39:27.346 信息 [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["https-openssl-nio2-443"]
27-Aug-2018 15:39:27.591 严重 [main] org.apache.catalina.util.LifecycleBase.handleSubClassException Failed to initialize component [Connector[org.apache.coyote.http11.Http11Nio2Protocol-443]]
 org.apache.catalina.LifecycleException: Protocol handler initialization failed
        at org.apache.catalina.connector.Connector.initInternal(Connector.java:935)
        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:852)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:633)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:656)
        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:306)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:491)
Caused by: java.lang.IllegalArgumentException: Cannot recover key
        at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:114)
        at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:85)
        at org.apache.tomcat.util.net.Nio2Endpoint.bind(Nio2Endpoint.java:158)
        at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1044)
        at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:540)
        at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:74)
        at org.apache.catalina.connector.Connector.initInternal(Connector.java:932)
        ... 13 more
Caused by: java.security.UnrecoverableKeyException: Cannot recover key
        at sun.security.provider.KeyProtector.recover(KeyProtector.java:328)
        at sun.security.provider.JavaKeyStore.engineGetKey(JavaKeyStore.java:146)
        at sun.security.provider.JavaKeyStore$JKS.engineGetKey(JavaKeyStore.java:56)
        at sun.security.provider.KeyStoreDelegator.engineGetKey(KeyStoreDelegator.java:96)
        at sun.security.provider.JavaKeyStore$DualFormatJKS.engineGetKey(JavaKeyStore.java:70)
        at java.security.KeyStore.getKey(KeyStore.java:1023)
        at org.apache.tomcat.util.net.jsse.JSSEUtil.getKeyManagers(JSSEUtil.java:246)
        at org.apache.tomcat.util.net.openssl.OpenSSLUtil.getKeyManagers(OpenSSLUtil.java:79)
        at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:112)
        ... 19 more

27-Aug-2018 15:39:27.594 信息 [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"]
27-Aug-2018 15:39:27.601 信息 [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
27-Aug-2018 15:39:27.602 信息 [main] org.apache.catalina.startup.Catalina.load Initialization processed in 1461 ms
27-Aug-2018 15:39:27.627 信息 [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]

在debug的时候,我们看到官网写着这么几句话:

也就是说,如果我们配置的keystore密码与key密码不相同的话,不但要设置keystore,还得设置key密码。

于是添加如下:certificateKeyPassword="**************" 到配置当中

<Connector port="443" protocol="org.apache.coyote.http11.Http11Nio2Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="D:/apachetomcat9_0_11/conf/test.keystore" certificateKeystorePassword="123456" 
                certificateKeyPassword="thepasswdofcertificate"/>
        </SSLHostConfig>
</Connector>

 

<think>嗯,用户遇到了在Linux上部署Tomcat时启动失败的问题,具体报错是"could not create default SSL context"。这个错误通常和SSL证书配置有关,需要一步步排查。 用户可能是个运维人员或者开发人员,正在部署Web应用。从报错信息看,ta应该已经完成了基础环境搭建,但在SSL配置环节卡住了。用户情绪可能比较着急,因为部署被中断了。 先梳理下可能的故障点。SSL上下文创建失败通常有三个核心原因:证书文件缺失或路径错误、密钥库密码匹配、证书格式问题。需要引导用户逐一检查这些环节。 证书路径是最常见的坑。Tomcat默认会在conf目录找keystore文件,但用户可能把证书放在其他位置了。要提醒ta检查server.xml里的keystoreFile路径,特别是Linux的绝对路径区分大小写这点容易忽略。 密钥库密码也经常出问题。用户可能混了生成密钥库时设置的密码,或者把密钥库密码和证书密码搞混了。需要让ta确认catalina.sh或setenv.sh里配置的JKS密码是否准确。 证书格式转换容易被忽略。很多用户直接从云服务商下载的证书是PEM格式,但Tomcat需要JKS或PKCS12格式。要提醒用keytool转换时注意-alias参数的一致性,这个参数匹配会导致后续步骤失败。 考虑到用户可能熟悉Linux环境,建议里需要包含具体的命令行操作示例,比如用openssl验证证书的指令。还要提醒权限问题Tomcat进程用户必须有证书文件的读取权限。 最后给出两个验证方案很关键。建议用户先用keytool list检查密钥库完整性,再用简易curl测试。这样能分阶段定位问题,比直接重启Tomcat盲目试错高效得多。 用户引用中提到Spring的动态加载方案,但当前场景Tomcat是独立进程,动态加载实现成本太高,建议普通用户尝试。还是应该优先解决基础配置问题。 如果用户后续补充报错细节,比如具体到哪行证书加载失败,可以进一步分析。但现在给出的通用方案应该能覆盖80%的情况。特别要强调查看catalina.out完整日志的重要性,很多用户只看最后几行报错会遗漏关键信息。</think>针对Linux系统部署Tomcat时出现"could not create default SSL context"错误,以下是系统化的排查解决方案: --- ### **错误原因分析** 此错误通常由SSL/TLS证书配置问题引发,具体可能涉及: 1. **证书文件缺失或路径错误** 2. **密钥库(Keystore)密码错误** 3. **证书格式兼容**(如未转换为JKS/PKCS12) 4. **证书域名/IP匹配** 5. **Tomcat未正确读取`JAVA_HOME`环境变量** --- ### **解决方案步骤** #### **1. 验证证书路径权限** 在`server.xml`中检查SSL连接器配置(示例): ```xml <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true"> <SSLHostConfig> <Certificate certificateKeystoreFile="/path/to/your/keystore.jks" certificateKeystorePassword="your_password" type="RSA" /> </SSLHostConfig> </Connector> ``` - **关键检查项**: - 确认`certificateKeystoreFile`的**绝对路径**正确 - 确保Tomcat用户有读取权限: ```bash chmod 644 /path/to/your/keystore.jks chown tomcat:tomcat /path/to/your/keystore.jks # 用户组根据实际调整 ``` #### **2. 检查密钥库密码** - 用以下命令验证密码正确性: ```bash keytool -list -v -keystore /path/to/keystore.jks ``` 输入密码后若提示`Keystore was tampered with, or password was incorrect`,则需重置密码或使用正确密码。 #### **3. 确保证书格式兼容** - **转换PEM证书为JKS格式**(适用于Let's Encrypt等): ```bash openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name tomcat keytool -importkeystore -srckeystore keystore.p12 -srcstoretype PKCS12 -destkeystore keystore.jks ``` - 在`server.xml`中指定类型: ```xml <Certificate ... type="RSA" certificateKeystoreType="PKCS12" /> ``` #### **4. 验证证书域名匹配** - 检查证书包含的域名是否服务器实际域名/IP一致: ```bash keytool -list -v -keystore keystore.jks | grep "Owner:" ``` #### **5. 确认JAVA环境变量** - 在`catalina.sh`中设置`JAVA_HOME`(位于Tomcat的`bin`目录): ```bash export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 # 路径根据实际JDK安装位置修改 export JRE_HOME=$JAVA_HOME/jre ``` #### **6. 检查端口冲突** - 确认`8443`(或其他SSL端口)未被占用: ```bash netstat -tulnp | grep 8443 ``` --- ### **动态加载证书(无需重启)** 若需**重启Tomcat更新证书**,可参考Spring的动态加载机制[^1]: ```java // 示例:动态创建SSLContext KeyStore keyStore = KeyStore.getInstance("JKS"); try (InputStream is = new FileInputStream("/path/to/keystore.jks")) { keyStore.load(is, "password".toCharArray()); } SSLContext sslContext = SSLContexts.custom() .loadKeyMaterial(keyStore, "password".toCharArray()) .build(); // 应用到Tomcat的Connector(需自定义扩展) ``` > **注意**:此方案需开发自定义组件,普通用户建议通过重启生效。 --- ### **日志分析** - 查看完整错误日志定位根源: ```bash tail -n 200 /opt/tomcat/logs/catalina.out # 路径根据实际安装位置调整 ``` 重点关注`Caused by:`之后的堆栈信息,如证书链缺失(`SunCertPathBuilderException`[^3])或文件权限错误。 --- ### **验证步骤** 1. 启动Tomcat: ```bash cd /opt/tomcat/bin && ./startup.sh ``` 2. 测试HTTPS访问: ```bash curl -vk https://localhost:8443 ``` 若输出包含`SSL certificate verify OK`,则表明SSL配置成功。 --- ### **常见问题总结** | 现象 | 解决方案 | |---------------------|----------------------------| | `Keystore was tampered with` | 重置密钥库密码 | | `Unsupported certificate type` | 转换证书为JKS/PKCS12格式 | | `Permission denied` | 修正证书文件权限 | | `Address already in use` | 更换SSL端口或释放占用端口[^2] | > **提示**:若问题持续,尝试使用`-Djavax.net.debug=ssl`参数启动Tomcat,获取详细SSL握手日志: > ```bash > export CATALINA_OPTS="-Djavax.net.debug=ssl" > ./catalina.sh run > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值