java - 无法连接到 Bluemix 中的 mongodb,找不到证书路径

标签 java mongodb ssl ibm-cloud compose-db

我无法从已部署的 bluemix 应用程序连接到我的 Compose MongoDB 服务。似乎找不到必要的证书。我原以为它会直接从环境变量 VCAP_SERVICES 中获取它。

我可以在我的本地测试环境中正常运行,因为我将 key 导入到 Java 中适当的 keystore 中。

如果我查看他们在 bluemix 上的 node.js 示例,他们实际上在连接期间传递了证书。但是,我在 Java API 上的任何地方都找不到它。

我认为我要么需要将此证书添加到 bluemix 上的 VM(似乎不太可能),要么我需要在我不能(看不到如何)时通过 Java 驱动程序传递它。

想法?

郑重声明,这是我得到的异常:

com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches 
ReadPreferenceServerSelector{readPreference=primary}. Client view of 
cluster state is {type=UNKNOWN, servers=[{address=bluemix-sandbox-dal-9-portal.7.dblayer.com:26123, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketWriteException: Exception sending message}, caused by {javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target}, caused by {sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target}, caused by {sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target}}, {address=bluemix-sandbox-dal-9-portal.6.dblayer.com:26123, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketWriteException: Exception sending message}, caused by {javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target}, caused by {sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target}, caused by {sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target}}]
com.mongodb.connection.BaseCluster.createTimeoutException(BaseCluster.java:377)
com.mongodb.connection.BaseCluster.selectServer(BaseCluster.java:104)
com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.<init>(ClusterBinding.java:75)
com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.<init>(ClusterBinding.java:71)
com.mongodb.binding.ClusterBinding.getReadConnectionSource(ClusterBinding.java:63)
com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:402)
com.mongodb.operation.FindOperation.execute(FindOperation.java:510)
com.mongodb.operation.FindOperation.execute(FindOperation.java:81)
com.mongodb.Mongo.execute(Mongo.java:836)
com.mongodb.Mongo$2.execute(Mongo.java:823)
com.mongodb.FindIterableImpl$FindOperationIterable.first(FindIterableImpl.java:216)
com.mongodb.FindIterableImpl.first(FindIterableImpl.java:156)
com.ibm.smarts.experiment.UserMgr.getUserDetails(UserMgr.java:146)
com.ibm.smarts.experiment.UserMgr.authenticateUser(UserMgr.java:123)
com.ibm.smarts.experiment.servlet.LoginServlet.doPost(LoginServlet.java:31)
javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

最佳答案

记录了一些选项 here .例如:

将证书导入Java truststore文件,将文件打包到Java应用程序中,并通过JAVA_OPTS环境变量指定其路径;信任库文件可以放在资源目录下。这可用于单个应用程序:

通过使用“cf set-env”命令:

cf set-env <app> JAVA_OPTS '-Djavax.net.ssl.TrustStore=classpath:resources/config/truststore'

通过使用 manifest.yml:

---
applications:
- name: java-app
  ...
  env:
    JAVA_OPTS: '-Djavax.net.ssl.TrustStore=classpath:resources/config/truststore'

关于java - 无法连接到 Bluemix 中的 mongodb,找不到证书路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43847820/

相关文章:

java - JFreeChart如何绘制具有紧密间隔的点的虚线

java - 为什么我们在 TreeMap 中转换为 Comparable

java - java中解析复杂的JSON字符串

mongodb - 从满足 K of N 标准的 MongoDB 中选择数据

mobile - 如何确保 http 请求不是手工制作的?

ruby-on-rails - 如何使 S3 在 Rails 应用程序中使用 http 和 https 提供相同的文件?

java - 如何强制 Hibernate 在更新前删除孤儿

mongodb - 通过嵌套字段查询 ReactiveMongo

java - 从 Java 访问 MongoDB

apache - httpd 使用 SSL 和子域/虚拟主机重定向