Java 添加外部服务器';s自签名证书到我的Tomcat的受信任证书
我的Tomcat需要使用SSL(TLS)连接到另一个web服务器(at) foreign.example.com有一个我信任的自签名证书。当然,我的Tomcat在默认情况下不会这样做——所以我必须告诉它。一种方法是:Java 添加外部服务器';s自签名证书到我的Tomcat的受信任证书,java,tomcat,ssl,certificate,tomcat6,Java,Tomcat,Ssl,Certificate,Tomcat6,我的Tomcat需要使用SSL(TLS)连接到另一个web服务器(at) foreign.example.com有一个我信任的自签名证书。当然,我的Tomcat在默认情况下不会这样做——所以我必须告诉它。一种方法是: $JRE/bin/keytool -import -alias my -file ssl-cert-myselfsigned.cer -keystore $JRE/lib/security/cacerts 这是可行的:我的Tomcat允许SSL连接 但是,我不喜欢这样做:它将
$JRE/bin/keytool -import -alias my -file ssl-cert-myselfsigned.cer -keystore
$JRE/lib/security/cacerts
这是可行的:我的Tomcat允许SSL连接
但是,我不喜欢这样做:它将证书导入到Java安装的可信密钥中。我不想说:“在我的机器上运行Java的每个应用程序都应该信任该证书”。只有Tomcat(或运行Tomcat的用户)应该信任它
因此,我尝试将其导入tomcat用户的密钥存储库~/.keystore
,并使用以下属性设置tomcat的
:
keystoreFile="${user.home}/.keystore"
keystorePass="thePassphraseICreatedTheKeystoreWith"
但是,这根本不起作用(我相信,这只是针对我的Tomcat的服务器证书,而不是针对外国服务器的服务器证书,对吗?)
我对truststoreFile
/truststorePass
属性也做了同样的尝试,但它们也不起作用。(属性记录在)
有没有办法使用外部服务器的服务器证书设置Tomcat,或者向java
添加一些命令行参数,使我的密钥库(和密钥库密码短语)可用于JVM实例?JBoss(基于Tomcat)可以使用以下cmd参数运行。cacerts文件(或您想如何命名)必须包含端点的证书
-Djavax.net.ssl.trustStore=C:\Applications\jboss-as\server\default\conf\cacerts
-Djavax.net.ssl.trustStorePassword=changeit
因此,这也适用于Tomcat。另一种方法是将其添加到Tomcat server.xml文件中Tomcat中的SSL连接器中。具体来说,您需要设置truststoreFile属性以启用对来自其他服务器的证书的信任
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="../../../deploy/tomcat/config/ssl/keystore.jks" keystorePass="changeit"
truststoreFile="../../../deploy/tomcat/config/ssl/keystore.jks" truststorePass="changeit"/>
如果您复制了“$JRE/lib/security/cacerts”,将您的特定证书导入其中并使用truststoreFile/truststorePass属性,您能否澄清哪些不起作用?它应该会起作用。(是的,“keystore keystore”是指您的凭据,而不是您如何信任远程证书。)@Bruno:Ah,查看(非常广泛的)日志,我发现我得到了java.security.invalidalgorithParameterException:trustAnchors参数不能为空
-这意味着它没有找到信任库文件。。。我想知道,${user.home}
是否在这里不起作用?很抱歉,我应该早就意识到这一点,但是信任库
参数只指示连接器的行为(即客户端证书)。当你说“我的Tomcat需要连接到另一个web服务器”时,我猜你的webapp是客户端,而不是容器(当然也不是连接器)。信任配置将根据客户端库的不同而变化。通过javax.net.ssl.trustStore
系统属性配置默认的SSLContext
(如果未指定任何其他内容,则可能会使用它)。如果您想要更本地的配置,我们需要知道您使用的是哪个客户端库。@Bruno:非常感谢!这澄清了这一点-无法在连接器中配置信任库。使用命令行参数——以及复制cacerts并在其中添加键的方法——是的,很好。这些参数与我用来模拟连接的小Java测试应用程序一起工作(因为每次重启服务器都要快得多:-),但我还不能使它与我的服务器一起工作。(注意:如果trustStorePassword不应泄露给系统上的其他用户,最好不要在命令行上指定它-运行进程的命令行可以通过ps ax
(在Unix系统上)轻松读取。)完全同意,但在我的测试机上使用虚拟证书,我不在乎;-)确认,这也适用于我的设置:-)并思考:只要我只将公共证书放入我的信任库,并使其不可由其他用户写入,我就安全了。(我将重命名该文件以明确说明,我决不能在其中放入私钥!)实际上,在这种情况下,storePassword是完全多余的。@Chris Lercher@rit您根本不需要指定truststore密码。它所做的只是启用一个验证步骤。你没有从中得到任何秘密。事实上,信任库没有什么秘密,它只包含公共证书。@EJB完全正确;请确保不受信任的用户不能更改文件。但是,Java的keytool
(至少在默认情况下)不允许在没有密码的情况下创建密钥库。事实上,它要求它至少有6个字符长。我不确定:也许有别的方法可以说服它?对不起,但正如问题(和评论)中提到的,这不起作用——至少在我问这个问题的时候没有。自Tomcat 6.0以来,truststoreFile属性的含义是否发生了变化?