Не удалось подключиться к mongodb в Bluemix, не удалось найти путь к сертификату

Я не могу подключиться к моей службе Compose MongoDB из моего развернутого приложения bluemix. Похоже, что он не может найти нужный сертификат. Я ожидал, что он выберет это непосредственно из переменной среды VCAP_SERVICES.

Я могу выполнить это нормально из своей локальной тестовой среды, потому что я импортировал ключ в соответствующее хранилище ключей в Java.

Если я посмотрю на их образец node.js в bluemix, они фактически передают сертификат во время подключения. Однако я не могу найти это нигде в Java API.

Я считаю, что мне нужно либо добавить этот сертификат в виртуальную машину на bluemix (кажется маловероятным), либо мне нужно передать его через драйвер 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)

person DungeonTiger    schedule 08.05.2017    source источник
comment
Сборочный пакет Liberty for Java должен создать для вас файл server.xml с источником данных и хранилищем ключей MongoDB. Можете ли вы подключиться таким образом вместо того, чтобы анализировать VCAP_SERVICES и инициализировать Java-клиент самостоятельно?   -  person opiethehokie    schedule 09.05.2017
comment
Я использую tomcat, а не свободу. Есть ли для этого аналогичный файл server.xml?   -  person DungeonTiger    schedule 09.05.2017
comment
Я могу подключиться со своей локальной машины, проанализировав VCAP. Я получаю фирменный bluemix. Я добавил его в локальный ключевой камень Java.   -  person DungeonTiger    schedule 09.05.2017
comment
Здесь я добавил еще несколько параметров: stackoverflow.com/questions/44813280/   -  person Chris Snow    schedule 29.06.2017


Ответы (1)


Задокументировано несколько вариантов здесь. Например:

Импортируйте сертификат в файл хранилища доверенных сертификатов Java, упакуйте файл в приложение 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'
person Chris Snow    schedule 09.05.2017
comment
Это выглядит многообещающе. Я попробую и отчитаюсь. - person DungeonTiger; 09.05.2017
comment
Кажется, я не могу заставить это работать, и я не уверен, как его отладить на самом деле. Первый вопрос заключается в том, является ли это TrustStore или trustStore. Я пробовал оба. Это то, что у меня есть в манифесте: applications: - path: target/RecommenderExperiment.war .... buildpack: java_buildpack env: JAVA_OPTS: '-Djavax.net.ssl.trustStore=classpath:/resources/cacert -Djavax.net.ssl.trustStorePassword=changeit' Теперь то, что у меня есть в файловой структуре войны, это: target\WEB-INF\classes\cacerts Я также пробовал без «ресурсов» в пути. Как я могу понять, что не так? - person DungeonTiger; 10.05.2017
comment
Можете ли вы попытаться создать минимальный пример, чтобы я мог воспроизвести проблему? - person Chris Snow; 10.05.2017
comment
Что ж, на самом деле похоже, что если я перейду с Tomcat на Liberty, эта проблема исчезнет. Хотел бы я понять, как заставить tomcat работать, но сейчас главное — заставить его работать. - person DungeonTiger; 12.05.2017