访问时出现以下应用程序错误https://..appRoot../TestJavaMongo/test/mongo/all遵循文档:https://medium.com/@blumareks/mongodb-for-you-a-hardcore-java-cloud-developer-f67b909834f4
我正在测试从IBMCloud上的LibertyJavaCF应用程序连接MongoDB服务。如何解决错误?
``错误500:com.mongodb.MongoTimeoutException:之后超时30000毫秒,同时等待匹配的服务器可写服务器选择器。群集状态的客户端视图为{type=UNKNOWN,servers=[{address=sl-us-south1-portal.16.dblayer.com:50233,类型=未知,状态=正在连接,exception={com.mongodb.MongoSocketWriteException:发送异常消息},
由{javax.net.ssl.ssl握手异常:com.ibm.jsse2.util.h:PKIX路径构建失败:java.security.cert.CertPathBuilderException:PKIXCertPathBuilderImpl无法生成有效的CertPath。;内部原因是:java.security.cert.CertPathValidatorException:颁发的证书by CN=*********不受信任;内部原因是:java.security.cert.CertPathValidatorException:证书链接错误}。。。
$keytool-list-v-keystoremongoKeyStore输入密钥库密码:
密钥库类型:JKS密钥库提供商:SUN
您的密钥库包含1个条目
别名:mykey创建日期:2017年6月24日条目类型:trustedCertEntry
所有者:CN=mwsadows@us.ibm.com.0b24b0f06b390e0cc5e803aecd5ec82发行人:CN=mwsadows@us.ibm.com.0b24b0f06b390e0cc5e803aecd5ec82序列号: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:39b: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 Criticality=false AuthorityKeyIdentifier[KeyIdentifier[0000:65 2C 47 37 D6 4C B7 24 E9 A1 AA 14 01 4A 12ADe,G7.L.$….J.0010:63 E0 7C 56
c。。V]]2:ObjectId:2.5.29.19 Criticality=false基本约束:[CA:true PathLen:21474833647]
3:ObjectId:2.5.29.37 Criticality=false ExtendedKeyUsages[serverAuth clientAuth]
4:ObjectId:2.5.29.15 Criticality=true KeyUsage[Key_CertSign]
5:ObjectId:2.5.29.14 Criticality=false SubjectKeyIdentifier[KeyIdentifier[0000:65 2C 47 37 D6 4C B7 24 E9 A1 AA 14 01 4A 12ADe,G7.L.$….J.0010:63 E0 7C 56
c。。V]]
我最近与我们的数据库提供商遇到了同样的问题,他们向我发送了他们的.crt文件,我不得不用它创建一个密钥库。
keytool -import -alias "name" -file "/path/to/file" -keystore "/path/to/keystore/file" -storetype pkcs12 -storepass "keystorepass"
然后在我的主类中,我定义了信任库和信任库通行证:
System.setProperty("javax.net.ssl.trustStore", "/path/to/keystore/file");
System.setProperty("javax.net.ssl.trustStorePassword", "keystorepass");
希望能有所帮助。
正如错误所说,证书不受信任。我看到该教程有一个相当重要的部分,介绍如何将证书从Mongo服务导入密钥库,并将其设置为Liberty的trustStore。仔细检查这些步骤以确保您:
-
正确地从Mongo服务获得并保存了证书,即证书没有不完整或损坏或其他任何东西。
-
请检查您是否在正确的位置使用
keytool
命令创建了密钥库,如果您签出了该密钥库,请检查是否替换了存储库中的密钥库,并且其中包括您为Mongo服务器保存的证书。您可以在密钥库中使用keytool -list -v -keystore <path_to_keystore.jks>
来查看里面的内容。 -
请检查您是否正确配置了Liberty以将此密钥库用作您的信任存储。我认为教程有点误导,因为它说
一个典型的应用程序还需要设置几个JVM系统属性以确保客户端提供TLS/SSL证书到MongoDB服务器:javax.net.ssl.keyStore密钥存储的路径包含客户端的TLS/SSL证书javax.net.ssl.keyStorePassword访问此密钥存储的密码
但是,我认为您实际上需要将您创建的密钥库设置为javax.net.ssl.trustStore
属性的值(并相应地设置trustStorePassword
属性),因为JVM使用trustStore来检查其连接到的主机的公钥是否可信。
无论哪种方式,都要确保这些属性设置正确,并且Liberty在服务器启动时不会在与其相关的日志中抛出任何错误。
一旦验证了整个链(导出了正确的证书,创建了包含该证书的密钥库,并将该密钥库设置为服务器的信任库),就应该设置安全性,以便正确地与Mongo服务器对话。如果您在服务器运行时更改了现有的信任库,则必须重新启动服务器,使其接受这些更改。