Java 使用.keystore文件使用tomcat 8.5配置SSL-无法存储非私钥
我有一个tomcat(2).keystore文件,我把它放在Java 使用.keystore文件使用tomcat 8.5配置SSL-无法存储非私钥,java,tomcat,ssl,Java,Tomcat,Ssl,我有一个tomcat(2).keystore文件,我把它放在/opt/tomcat/conf目录中。目录权限设置如下: root@xxxxxxxxxx:/opt/tomcat# ls -l total 112 drwxr-x--- 2 root tomcat 4096 Sep 10 03:04 bin drwxr-x--- 2 root tomcat 4096 Sep 28 05:12 conf drwxr-x--- 2 root tomcat 4096 Sep 10 03:0
/opt/tomcat/conf
目录中。目录权限设置如下:
root@xxxxxxxxxx:/opt/tomcat# ls -l
total 112
drwxr-x--- 2 root tomcat 4096 Sep 10 03:04 bin
drwxr-x--- 2 root tomcat 4096 Sep 28 05:12 conf
drwxr-x--- 2 root tomcat 4096 Sep 10 03:04 lib
-rw-r----- 1 root tomcat 57092 Aug 2 21:36 LICENSE
drwxr-x--- 2 tomcat tomcat 4096 Sep 28 05:15 logs
-rw-r----- 1 root tomcat 1723 Aug 2 21:36 NOTICE
-rw-r----- 1 root tomcat 7064 Aug 2 21:36 RELEASE-NOTES
-rw-r----- 1 root tomcat 15946 Aug 2 21:36 RUNNING.txt
drwxr-x--- 2 tomcat tomcat 4096 Sep 28 05:15 temp
drwxr-x--- 8 tomcat tomcat 4096 Sep 28 03:52 webapps
drwxr-x--- 3 tomcat tomcat 4096 Sep 10 03:19 work
而server.xml
具有以下连接器:
<Connector
port="8080"
maxThreads="1000"
protocol="org.apache.coyote.http11.Http11NioProtocol"
maxHttpHeaderSize="8192"
emptySessionPath="true"
connectionTimeout="20000"
minSpareThreads="20"
acceptCount="100"
disableUploadTimeout="true"
enableLookups="false"
tcpNoDelay="true"
scheme="https"
secure="true"
SSLEnabled="true"
keystoreFile="/opt/tomcat/conf/tomcat (2).keystore"
keystorePass="xxxxxx"
clientAuth="false"
sslProtocol="TLS"
maxPostSize="97589953"
URIEncoding="UTF-8"/>
有人能帮忙吗?是否需要从server.xml
中删除任何其他内容
编辑:
当我运行
/keytool-list-keystore”/opt/tomcat/conf/tomcat(2).keystore“
我相信您正在尝试在服务器上设置SSL支持。如果是这样,您的密钥库应该只包含您的私有证书。看起来里面有一些第三方公钥,或者您正在使用带有对称密钥的JKS密钥库。最好的办法是检查密钥库的内容。使用命令
keytool -list -keystore yourkeystorefilename
看看里面有什么。我终于找到了问题所在。例外情况表明,
tomcat(2).keystore本身存在一些问题。因此,我使用$JAVA_HOME/bin/keytool-list-keystore tomcat(2)检查了keystore中的证书。keystore
的输出是:
密钥库类型:JKS
密钥库提供程序:SUN
您的密钥库包含3个条目
root, Dec 19, 2016, trustedCertEntry,
Certificate fingerprint (SHA1): xxxx
tomcat, Dec 19, 2016, PrivateKeyEntry,
Certificate fingerprint (SHA1): xxxx
intermed, Dec 19, 2016, trustedCertEntry,
Certificate fingerprint (SHA1): xxxxx
由于异常表明私钥以外的任何密钥都有问题,因此我使用以下方法删除了trustedCertEntry
:
$JAVA_HOME/bin/keytool -delete -noprompt -alias intermed -keystore tomcat\ \(2\).keystore -storepass xxxxxx
$JAVA_HOME/bin/keytool -delete -noprompt -alias root -keystore tomcat\ \(2\).keystore -storepass xxxxx
然后重新启动tomcat。这解决了问题。感谢@Gautam和@EJP的帮助。有点晚了,但我在迁移到tomcat 8.5.20后遇到了类似的问题。经过进一步的研究,我想出了一个单独的、合理的解决方案。在许多情况下,证书在生产环境中不在我们手中,因此不建议对其进行篡改。
实际上,从实现来看,tomcat似乎试图使用密钥存储文件中提到的第一个密钥,除非我们提供密钥别名。因此,在本例中,如果我们在连接器中提供密钥别名,它将正常工作
{keyalis=“tomcat”}您的密钥存储库文件是只读的吗?Tomcat试图写入它对我来说是个新闻,我不知道它为什么会这样,但出于某种原因,它正在调用setKeyEntry()
。@EJP是的,它是只读的。。。我应该增加权限吗?我想你应该试着让它读写,但我不知道为什么。@EJP现在我对.keystore文件的权限看起来像-r--rw---1 ubuntu tomcat 7492 Sep 28 03:58 tomcat(2).keystore
,但我仍然遇到同样的错误。所以它根本找不到它。检查文件名和密码是否完全正确。将命令结果添加为编辑。有什么意义吗?没有公钥。我相信,tomcat,2016年12月19日,PrivateKeyEntry,Certificate fingerprint(SHA1):xxxx
是您服务器的私钥。其他两个显示为可信证书的是什么?为什么在这个密钥库中需要它们。如果这些是针对您希望从应用程序调用的第三方终结点的,请将这些证书添加到cacerts
。请详细说明您的答案并提供步骤/参考?在密钥库中拥有受信任的证书不会导致此错误。它们可能是CA根证书及其链。看起来@EJP是对的,这与密钥库中的公钥无关。将keystore设置为rw有效吗?看起来tomcat无法访问密钥库并发现密钥库为null。请参阅处的JSSEUtil源代码,如果密钥库为null,它将尝试创建内存中的密钥库并向其写入密钥。这就是调用setKeyEntry
的地方此解决方案的问题是您刚刚删除的根密钥是您从CA收到的。你需要这些,这对我来说很有用。谢谢对于使用spring引导的嵌入式tomcat配置:server.ssl.key alias=alias
root, Dec 19, 2016, trustedCertEntry,
Certificate fingerprint (SHA1): xxxx
tomcat, Dec 19, 2016, PrivateKeyEntry,
Certificate fingerprint (SHA1): xxxx
intermed, Dec 19, 2016, trustedCertEntry,
Certificate fingerprint (SHA1): xxxxx
$JAVA_HOME/bin/keytool -delete -noprompt -alias intermed -keystore tomcat\ \(2\).keystore -storepass xxxxxx
$JAVA_HOME/bin/keytool -delete -noprompt -alias root -keystore tomcat\ \(2\).keystore -storepass xxxxx