一个在linux下启动Tomcat报错的解决方案

本文介绍了一种解决在Linux环境下启动Tomcat时出现java.net.UnknownHostException的方法,通过本地部署DTD文件来避免网络连接问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux下启动Tomcat时报java.net.unknownhostException异常,经了解是struts DTD验证问题导致,如有人遇到此类问题,可参照下面的解决方案:)

不联网的情况下启动TOMCAT发生了java.net.unknownhostException

严重: Parsing error processing resource path
ava.net.UnknownHostException: struts.apache.org
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:177)
at java.net.Socket.connect(Socket.java:507)
at java.net.Socket.connect(Socket.java:457)
at sun.net.NetworkClient.doConnect(NetworkClient.java:157)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:365)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:477)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:214)
at sun.net.www.http.HttpClient.New(HttpClient.java:287)
at sun.net.www.http.HttpClient.New(HttpClient.java:299)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:792)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:744)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:669)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:913)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.jav
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:905)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(XMLEntityManager.java:87
at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(XMLDTDScannerImpl.java:
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(XMLDocumen

at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentF
368)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:834)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:148)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1242)
at org.apache.commons.digester.Digester.parse(Digester.java:1548)
at org.apache.struts.action.ActionServlet.parseModuleConfigFile(ActionServlet.java:1006)
at org.apache.struts.action.ActionServlet.initModuleConfig(ActionServlet.java:955)
at org.apache.struts.action.ActionServlet.init(ActionServlet.java:470)
at javax.servlet.GenericServlet.init(GenericServlet.java:211)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1105)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:932)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3917)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4201)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:759)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:739)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:524)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:904)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:867)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1122)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:310)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1021)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1013)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:442)
at org.apache.catalina.core.StandardService.start(StandardService.java:450)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:709)
at org.apache.catalina.startup.Catalina.start(Catalina.java:551)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432)

这是由于struts-config.xml中的dtd校验中的地址为http://struts.apache.org/dtds/struts-config_1_2.dtd,按照这个地址将struts-config_1_2.dtd下载后放到和struts-config.xml同一文件夹下,然后将struts-config.xml

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts

Configuration 1.1//EN"

"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

中的DTD文件路径替换为struts-config_1_2.dtd就可以了

顺祝

 
<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、付费专栏及课程。

余额充值