2017-02-17 7 views
2

を有効にしてMongoDbインスタンスを実行しています(シングルインスタンス)。私はSSLタブに、私は次を提供RoboMongoとそれに接続することができる午前:JAVAアプリケーションからSSLを使用してMongoDbに接続

正常に接続
CA File : /path to my certificate/testCA.pem 
PEM certificate/key: /path to my key/testKey.pem 

。今私はjavaアプリから同じmondodbに接続しようとしています。次のコマンドを使用して、cacertsにtestCA.pemをインポートしました。

keytool -import -keystore cacerts -file testCA.pem -storepass changeit 

と私はストアに新しいエントリが追加されています。他のキーを追加しようとすると、無効な証明書が表示されます。

System.setProperty ("javax.net.ssl.trustStore","C:\\Program Files\\Java\\jre1.8.0_91\\lib\\security\\cacerts"); 
System.setProperty ("javax.net.ssl.trustStorePassword","changeit"); 

を、私は次のエラーを取得しています:私はここ

org.springframework.dao.DataAccessResourceFailureException: Timed out after 10000 ms while waiting to connect. Client view of cluster state is {type=Unknown, servers=[{address=test.mongo.com:27017, type=Unknown, state=Connecting, exception={com.mongodb.MongoException$Network: Exception opening the socket}, caused by {java.io.EOFException}}]; nested exception is com.mongodb.MongoTimeoutException: Timed out after 10000 ms while waiting to connect. Client view of cluster state is {type=Unknown, servers=[{address=test.mongo.com:27017, type=Unknown, state=Connecting, exception={com.mongodb.MongoException$Network: Exception opening the socket}, caused by {java.io.EOFException}}] 
    at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:75) 
    at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2075) 
    at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1918) 

何をしないのです、事前に感謝をJavaアプリケーションでは、私は次のようにシステムプロパティを設定します!

答えて

0

(コマンドを実行するために、あなたのjava_home/jre/lib/securityに移動します)

1. keytool -import -trustcacerts -file testCA.pem -keystore cacerts -storepass "changeit"

私もキーをエクスポートする必要がありました。 「pkcs12」の形式にペーストします(デフォルトのパスワード「changeit」)

2. openssl pkcs12 -export -out mongodb.pkcs12 -in testKey.pem

とシステムプロパティトラストストア/パスワードを設定することに加えて、キーストア/パスワードも設定する必要があります。通常、フォーラムで提案の下に言及したアプローチがしますの仕事 "両方

System.setProperty ("javax.net.ssl.trustStore",javaHome + "\\lib\\security\\cacerts"); 
System.setProperty ("javax.net.ssl.trustStorePassword","changeit"); 
System.setProperty ("javax.net.ssl.keyStore",javaHome + "\\lib\\security\\mongodb.pkcs12"); 
System.setProperty ("javax.net.ssl.keyStorePassword","changeit"); 
+0

私はまったく同じ問題を抱えていますが、それでも私のために働いていません。私はxyz.pkcs12を 'testKey.pem'から作成してWindowsにコピーし、Windowsにコピーしてキーストアにインポートしました。そうしなければ私はすべきですか? – Amit

+0

@あなたはスタックトレースを投稿できますか? – Gurkha

+0

javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateException:sun.security.ssl.Alerts.getSSLException(不明なソース) \tで \t sun.security.ssl.SSLSocketImpl.fatalに存在しませんサブジェクト代替名sun.security.ssl.Handshaker.fatalSE(不明なソース)でsun.security.ssl.Handshaker.fatalSE(不明なソース)で(不明なソース) \t \t sun.security.ssl.ClientHandshaker.serverCertificateで \t(不明ソース) \t at sun.security.ssl.ClientHandshaker.processMessage(不明なソース) \t sun.security.ssl.Handshaker.processLoop(不明なソース) – Amit

1

SSLを使用するようにmonog dbドライバを設定する必要があります。 @Configurationクラスで手動で設定することでこれを行うことができます。コマンドでCAFile.pemをインポートすることに加え

public @Bean MongoClient mongo() { 
     MongoClientOptions.Builder options = MongoClientOptions.builder().sslEnabled(true); 
     // add more options to the builder with your config 
     MongoClient mongoClient = new MongoClient("localhost", options.build()); 
     return mongoClient; 
    } 
+1

を助けhttps://jira.mongodb.org/browse/JAVA-2184

希望どおりに私はURIを経由してSSLを有効にお使いのJDKのバージョンを更新お勧めします – Gurkha

+0

afiak MongoデータベースURI。ホスト、ポート、および資格情報で設定することはできません。ホストとポートだけを受け入れる内部ServerAddressクラスを使用します。 – Redlab

+0

はい、それはhttp://mongodb.github.io/mongo-java-driver/3.0/driver/reference/connecting/ssl/?_ga=1.246548100.1027948420.1459173085 ' – Gurkha

1

けどとして確保されていませんSSLを本質的に否定するホスト名検証を無効にします。あなたのコードは、生産上に展開されるかどうそこで彼らは、特に推奨されていません。

// 1. For any HTTPS connection 
    javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
     new javax.net.ssl.HostnameVerifier(){ 
      public boolean verify(String hostname, 
       javax.net.ssl.SSLSession sslSession) { 
        if(hostname.equals("<hostname>")) { 
         return true; 
        } 
       } 
      }); 

// 2. MongoDB SSL specific 
MongoClientOptions.builder().sslEnabled(true).sslInvalidHostNameAllowed(true).build(); 

参照してください:https://wiki.openssl.org/index.php/Hostname_validation


をこの問題を解決するには、次のようにサーバーのDNSを含む証明書が必要になりますあなたのJDKにインポートできるサブジェクトの代替名エントリ

また、アプリケーションレベルでSSLを確立する場合は、その特定の接続に対してSSLContextを作成することをお勧めしますキーストア/トラストストアの設定にはSystem.setProperty()を使用します。これは、アプリケーションが異なるSSL実装を持つ異なる外部サービスに接続する場合、競合を回避するのに役立ちます。


は、具体的にMongoDBのために、あなただけの、上記の工程の後にMongoDBURIの終わりに?ssl=trueを追加する必要があります。 `test.mongo.com:?27017/TESTDB SSL = true`を、それはまだ動作しない場合、私は、これは

関連する問題