Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 添加外部服务器';s自签名证书到我的Tomcat的受信任证书_Java_Tomcat_Ssl_Certificate_Tomcat6 - Fatal编程技术网

Java 添加外部服务器';s自签名证书到我的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连接 但是,我不喜欢这样做:它将

我的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连接

但是,我不喜欢这样做:它将证书导入到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属性的含义是否发生了变化?