java.security.cert.CertPathValidator异常:证书链接错误

java.security.cert.CertPathValidator异常:证书链接错误,java,mongodb,ibm-cloud,cloud-foundry,websphere-liberty,Java,Mongodb,Ibm Cloud,Cloud Foundry,Websphere Liberty,我在按照文档进行访问时出现以下应用程序错误: 我正在测试从IBM云上的Liberty Java CF应用程序连接Mongo DB服务。如何解决错误 ```错误500:com.mongodb.MongoTimeoutException:在之后超时 等待匹配的服务器时为30000毫秒 可写服务器选择器。群集状态的客户端视图为{type=UNKNOWN, servers=[{address=sl-us-south-1-portal.16.dblayer.com:50233, 类型=未知,状态=正在连接

我在按照文档进行访问时出现以下应用程序错误:

我正在测试从IBM云上的Liberty Java CF应用程序连接Mongo DB服务。如何解决错误

```错误500:com.mongodb.MongoTimeoutException:在之后超时 等待匹配的服务器时为30000毫秒 可写服务器选择器。群集状态的客户端视图为{type=UNKNOWN, servers=[{address=sl-us-south-1-portal.16.dblayer.com:50233, 类型=未知,状态=正在连接, 异常={com.mongodb.MongoSocketWriteException:异常发送 消息}

由{javax.net.ssl.SSLHandshakeException:com.ibm.jsse2.util.h引起: PKIX路径生成失败: java.security.cert.CertPathBuilderException:PKIXCertPathBuilderImpl 无法生成有效的CertPath。;内部原因是: java.security.cert.CertPathValidator异常:颁发的证书 by CN=*******不可信;内因为: java.security.cert.CertPathValidator异常:证书链接 错误}

$keytool-list-v-keystore mongoKeyStore 输入密钥库密码:

密钥库类型:JKS密钥库提供程序:SUN

您的密钥库包含1个条目

别名:mykey创建日期:2017年6月24日条目类型: 信任证书条目

所有者:中国=mwsadows@us.ibm.com-0b24b0ff06b390e0cc5e803aecd5ec82发卡机构: CN=mwsadows@us.ibm.com-0b24b0ff06b390e0cc5e803aecd5ec82序列号: 59491e1b有效期:2017年6月20日星期二23:07:39至6月20日星期六 23:00:00 AEST 2037证书指纹:MD5: A4:54:21:6A:52:E1:8B:CB:07:CC:25:A3:3B:1A:8B:05 SHA1: BE:5D:AE:94:C3:A5:37:2D:43:B2:E7:FC:CF:39:19:EE:B8:10:29:9B SHA256: D5:6B:EB:D6:88:36:D4:77:06:9B:8D:2B:83:39:9B:95:A5:E3:22:09:99:EF:32:89:31:E2:88:C2:86:58:83:62 签名算法名称:SHA512withRSA版本:3

扩展:

1:ObjectId:2.5.29.35严重性=虚假授权密钥标识符[KeyIdentifier[0000:65 2C 47 37 D6 4C B7 24 E9 A1 AA 14 01 4A 12 广告e,G7.L.$…J..0010:63 E0 7C 56
c、 .V]]

2:ObjectId:2.5.29.19临界性=假基本约束:[CA:true PathLen:2147483647]

3:ObjectId:2.5.29.37临界性=错误的扩展密钥用法[serverAuth clientAuth]

4:ObjectId:2.5.29.15关键性=真实密钥使用[Key\u CertSign]

5:ObjectId:2.5.29.14临界性=错误的主题KeyIdentifier[KeyIdentifier[0000:65 2C 47 37 D6 4C B7 24 E9 A1 AA 14 01 4A 12 广告e,G7.L.$…J..0010:63 E0 7C 56
c、 .V]]


正如错误所说,证书不受信任。我看到教程中有一个相当重要的部分,介绍如何将证书从Mongo服务导入密钥库,并将其设置为Liberty的信任库。请仔细检查这些步骤,以确保:

  • 从Mongo服务正确获取并保存了证书,即证书不完整、未损坏或其他任何内容

  • 检查您是否在正确的位置使用
    keytool
    命令创建了密钥库,如果您签出了,则检查您是否替换了存储库中的密钥库,以及它是否包含您为Mongo服务器保存的证书。您可以在密钥库上使用
    keytool-list-v-keystore
    ,查看其中的内容

  • 请检查您是否正确配置了Liberty,以使用此密钥库作为您的信任存储。我认为教程有点误导,正如它所说的

  • 一个典型的应用程序还需要设置几个JVM系统 属性以确保客户端提供TLS/SSL证书 到MongoDB服务器:javax.net.ssl.keyStore到密钥存储的路径 包含客户端的TLS/SSL证书 javax.net.ssl.keystrepassword访问此密钥存储的密码

    但是,我认为您实际上需要将您创建的这个密钥库设置为
    javax.net.ssl.trustStore
    属性的值(并相应地设置
    trustStorePassword
    属性),因为JVM使用trustStore检查它所连接的主机的公钥是否可信

    无论哪种方式,请确保这些属性设置正确,并且Liberty在服务器启动时不会在与其相关的日志中抛出任何错误


    一旦您验证了整个链(您已经导出了正确的证书,您已经创建了包含该证书的密钥库,并且您已经将该密钥库设置为服务器的信任库,)您应该设置安全设置,以便与Mongo服务器正确对话。如果您在服务器运行时更改了现有的信任库,则必须重新启动服务器,使其接收这些更改。

    我最近与我们的db提供商遇到了同样的问题,他们向我发送了他们的.crt文件,我必须用它创建密钥库

    keytool -import -alias "name" -file "/path/to/file" -keystore "/path/to/keystore/file" -storetype pkcs12 -storepass "keystorepass"
    
    然后在我的主类中,我定义了truststore和truststore pass:

     System.setProperty("javax.net.ssl.trustStore", "/path/to/keystore/file");
     System.setProperty("javax.net.ssl.trustStorePassword", "keystorepass");  
    

    希望有帮助。

    谢谢你的评论。-1.我相信这是从Mongo保存的正确证书。我不知道如何验证。-2.我运行了keytool-list-v-keystore。我稍后将共享输出。-3.我检查了代码。看起来不错。谢谢你的评论。我根据你的建议再次测试了它。它与doc:Unfort类似单独地,我得到了相同的错误。如果是自签名证书,您可能需要将sslInvalidHostNameAllowed设置为true。请显示您以前对此的研究结果,好吗?