Java 正在尝试将CA根证书导入JVM信任存储

Java 正在尝试将CA根证书导入JVM信任存储,java,keytool,Java,Keytool,首先让大家知道我是这方面的新手 我有两个文件要添加到信任存储中,以允许Java应用程序与传真服务进行通信。一个是api.fax.crt,另一个是api.fax.ca。 我已通过以下方式将证书添加到服务器: cd /etc/pki/ca-trust/source/anchors/ aws s3 cp s3://BlahBlah/temp/api.fax.ca . aws s3 cp s3://BlahBlah/temp/api.faxa.crt . sudo update-ca-trust sud

首先让大家知道我是这方面的新手

我有两个文件要添加到信任存储中,以允许Java应用程序与传真服务进行通信。一个是api.fax.crt,另一个是api.fax.ca。 我已通过以下方式将证书添加到服务器:

cd /etc/pki/ca-trust/source/anchors/
aws s3 cp s3://BlahBlah/temp/api.fax.ca .
aws s3 cp s3://BlahBlah/temp/api.faxa.crt .
sudo update-ca-trust
sudo service tomcat restart
这似乎是可行的,但有时需要十分钟,有时需要几个小时。通过工作,我的意思是它允许使用它的代码与终端传真服务通信 我读了一点,发现我应该在JVM信任存储中安装这些。 我尝试了以下方法:

cd /usr/java/latest/lib/security/
aws s3 cp s3://BlahBlah/temp/api.fax.ca .
aws s3 cp s3://BlahBlah/temp/api.fax.crt .
sudo keytool -importcert -noprompt -trustcacerts -alias faxage -file api.fax.com.ca -keystore /usr/java/latest/lib/security/cacerts -storepass blahblah
sudo keytool -importcert -noprompt -trustcacerts -alias faxage2 -file api.fax.com.crt -keystore /usr/java/latest/lib/security/cacerts -storepass blahblah
sudo service tomcat restart
这样做,我一直无法连接到传真服务

有更好的办法吗?我应该将其添加到Java位置还是ca信任位置?我应该同时添加ca和crt文件吗?在第一个示例中,为什么会在它工作之前出现延迟? 谢谢大家的洞察力

仅供参考-我得到的错误如下。我查找了这些错误,找到的答案是将证书添加到“/usr/java/latest/lib/security/cacert”密钥库中,我尝试了一下,但没有成功

javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target<br>
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131)<br>
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:321)<br>
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264)<br>
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:259)<br>
at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:642)<br>
at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.onCertificate(CertificateMessage.java:461)<br>
at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.consume(CertificateMessage.java:361)<br>
at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392)<br>
at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:450)<br>
at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:427)<br>
at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:178)<br>
at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:164)<br>
at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1152)<br>
at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1063)<br>
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:402)<br>
at java.base/sun.security.ssl.SSLSocketImpl.ensureNegotiated(SSLSocketImpl.java:716)<br>
at java.base/sun.security.ssl.SSLSocketImpl$AppOutputStream.write(SSLSocketImpl.java:970)<br>
at java.base/java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:81)<br>
at java.base/java.io.BufferedOutputStream.write(BufferedOutputStream.java:122)<br>
at java.base/java.io.FilterOutputStream.write(FilterOutputStream.java:108)<br>
at org.apache.commons.httpclient.methods.ByteArrayRequestEntity.writeRequest(ByteArrayRequestEntity.java:90)<br>
      And many more........
javax.net.ssl.SSLHandshakeException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径
位于java.base/sun.security.ssl.Alert.CreateSLexception(Alert.java:131)
位于java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:321)
位于java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264)
位于java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:259)
位于java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:642)
位于java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.onCertificate(CertificateMessage.java:461)
位于java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.Consumer(CertificateMessage.java:361)
位于java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392)
位于java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:450)
位于java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:427)
位于java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:178)
位于java.base/sun.security.ssl.sslttransport.decode(sslttransport.java:164)
位于java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1152)
位于java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1063)
位于java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:402)
在java.base/sun.security.ssl.SSLSocketImpl.ensureNegotiated(SSLSocketImpl.java:716)
位于java.base/sun.security.ssl.SSLSocketImpl$AppOutputStream.write(SSLSocketImpl.java:970)
位于java.base/java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:81)
位于java.base/java.io.BufferedOutputStream.write(BufferedOutputStream.java:122)
位于java.base/java.io.FilterOutputStream.write(FilterOutputStream.java:108)
位于org.apache.commons.httpclient.methods.bytearrayrequestity.writeRequest(bytearrayrequestity.java:90)
还有更多。。。。。。。。
您需要更新
server.xml
并通知它您的
密钥库的路径:



文档的其余部分可能也很有用

我更喜欢为系统或jvm默认不信任的CA证书使用单独的密钥库。原因是CA的默认列表可能会被更新(系统或jvm版本)ErnieAndBert覆盖,我可以看到您正在使用tomcat,但我猜您正在与传真服务建立传出连接?换句话说,您正在进行HttpsUrlConnection,但失败了?如果是这样的话,瓦朗顿的建议将毫无帮助?
<Connector
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           port="8443" maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true"
           keystoreFile="${user.home}/.keystore" keystorePass="changeit"
           clientAuth="false" sslProtocol="TLS"/>