我成功地为 tomcat 配置了 SSL,并使用了自签名证书。最近出现了一个问题,让客户端“接受/信任”我们的证书并不容易。我们最终为该服务器购买了 verisigin 证书。
我已将新证书添加到密钥库中的证书中。我已更新 tomcat 的服务器.xml文件以使用新证书的别名。我已重新启动 Tomcat 和服务器。每次连接到服务器时,我都会获得旧证书。
环境:
- Windows 2008 R2 - 64 位
- Tomcat 6.0.29 - 作为服务安装
- Java 1.6.0_23
连接器从服务器.xml:
<Connector port="443" maxThreads="150"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="keystore.keys" keyalias="webapps2013"
keystorePass="Redacted"
clientAuth="false" sslProtocol="TLS" protocol="HTTP/1.1" />
我甚至尝试更改密钥库,将旧证书移动到不同的别名,并在旧别名中添加我的新证书。
我已从多个浏览器和工作站尝试过。(也清除了我的缓存。)
那么我需要做什么才能让 tomcat 获取并提供我的新证书?
更新:
按照评论中一条建议清除 tomcat 缓存的建议,
我停止了 tomcat,删除了 ${CATALINA_HOME}/work,然后重新启动了 tomcat。
它仍在提供旧证书。
更新2:
我看过了jakarta_service_date.log catalina.date.log 经理.日期.日志 标准输出日期日志和标准错误日志我没有看到任何证书错误。尽管我看到了有关会话序列化的奇怪错误。
Dec 11, 2013 10:46:27 AM org.apache.catalina.session.StandardManager doUnload
SEVERE: IOException while saving persisted sessions: java.io.FileNotFoundException:
C:\Tomcat6.0\work\Catalina\localhost\RCSLIBRRunner\SESSIONS.ser (Access is denied)
java.io.FileNotFoundException: C:\Tomcat6.0\work\Catalina\localhost\RCSLIBRRunner\SESSIONS.ser (Access is denied)
随后是堆栈跟踪。其他应用程序也抛出了类似的异常。几个小时内都没有发生过这种情况,我认为这是清除 tomcat 缓存的副作用。
这是另一个序列化错误:
Dec 11, 2013 10:46:27 AM org.apache.catalina.session.StandardManager stop
SEVERE: Exception unloading sessions to persistent storage
java.io.FileNotFoundException: C:\Tomcat6.0\work\Catalina\localhost\RCSLIBRRunner\SESSIONS.ser (Access is denied)
答案1
我们在使用 时遇到了麻烦protocol="HTTP/1.1"
,日志中出现了错误。我们的错误是
证书文件已指定或文件格式无效
基于一些“谷歌研究“,我们改用这个protocol
:
protocol="org.apache.coyote.http11.Http11NioProtocol"
我们的Connector
如下:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true"
maxThreads="150"
scheme="https"
secure="true"
keystoreFile="/path/to/keystore"
keystorePass="******"
clientAuth="false"
sslProtocol="TLS" />
答案2
原来我的Connector
它应该是:
<Connector port="443" maxThreads="150"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="keystore.keys" keyAlias="webapps2013"
keystorePass="Redacted"
clientAuth="false" sslProtocol="TLS" protocol="HTTP/1.1" />
笔记:中的第一个 akeyAlias
大写。
事实证明,如果未列出别名,它只会默默地提供在密钥库中找到的第一个密钥。