2017-05-08 2 views
0

Je ne parviens pas à me connecter à mon service Compose MongoDB à partir de mon application bluemix déployée. Il semble qu'il ne peut pas trouver le certificat nécessaire. Je m'attendais à ce qu'il prenne cela directement à partir de la variable d'environnement VCAP_SERVICES.Impossible de se connecter à mongodb dans Bluemix, impossible de trouver le chemin du certificat

Je peux exécuter cette amende à partir de mon environnement de test local car j'ai importé la clé dans le magasin de clés approprié en Java.

Si je regarde leur exemple node.js sur bluemix, ils passent le certificat lors de la connexion. Cependant, je ne peux pas trouver cela n'importe où sur l'API Java.

Je crois que je dois soit ajouter ce cert à la VM sur bluemix (semble improbable) ou je dois le passer via le pilote Java quand je ne peux pas (ne peut pas voir comment).

Pensées?

Pour mémoire, c'est l'exception que je reçois:

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) 
+0

Liberty pour Java buildpack devrait produire un fichier server.xml pour vous avec une source de données MongoDB et un fichier de clés. Pouvez-vous vous connecter de cette façon au lieu d'analyser VCAP_SERVICES et d'initialiser vous-même le client Java? – opiethehokie

+0

J'utilise Tomcat plutôt que Liberty. Existe-t-il un fichier server.xml similaire pour cela? – DungeonTiger

+0

Je peux me connecter à partir de ma machine locale en analysant le VCAP et obtenir un bluemix ferme. Je l'ai ajouté à la clé de voûte Java locale. – DungeonTiger

Répondre

1

Il y a quelques options documentées here. Par exemple:

Importez le fichier cert du fichier de clés certifiées Java, empaquetez le fichier dans l'application Java et spécifiez son chemin via la variable d'environnement JAVA_OPTS; le fichier truststore peut être placé sous le répertoire de ressources. Ceci peut être utilisé pour des applications simples:

En utilisant la commande 'cf set-env':

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

En utilisant manifest.yml:

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

Cela semble prometteur. Je vais essayer et rendre compte. – DungeonTiger

+0

Je n'arrive pas à faire fonctionner ça et je ne sais pas trop comment le déboguer. La première question est de savoir si c'est TrustStore ou trustStore. J'ai essayé les deux. C'est ce que j'ai dans le manifeste: 'applications: - chemin: cible/RecommenderExperiment.war .... buildpack: env java_buildpack : JAVA_OPTS: « -Djavax.net.ssl.trustStore = classpath:/ressources/cacert -Djavax.net.ssl.trustStorePassword = changeit'' maintenant ce que j'ai dans la structure de fichier de guerre est la suivante: 'cible \ WEB-INF \ classes \ cacerts' J'ai essayé aussi sans 'ressources' en le chemin. Comment savoir ce qui ne va pas? – DungeonTiger

+0

Pouvez-vous essayer de créer un exemple minimal pour que je puisse reproduire le problème? –