Spring Boot + Mongodbを使用する2つのプロジェクトがあります。1つのプロジェクトでは、春のブートバージョンは1.4.1.RELEASEで、他のプロジェクトは2.1.3.RELEASEです。証明書、PEM形式のキーをトラストストアとキーストアにオンボードで持っています-1つのサーバー証明書チェーンと他のクライアント証明書と秘密キー。プログラムで証明書をトラストストアとキーストアにロードします。
ymlファイルに証明書パスを構成しました。このパスは、クライアントとサーバーの証明書またはキーがそれぞれ格納されるクライアントとサーバーのフォルダーで構成されます。以下に、プログラムでトラストストアとキーストアに証明書をロードするために使用するコードを示します。
final KeyStore trustStore = loadTrustStore(...); // Gets and loads server certificates
final TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(trustStore);
final TrustManager[] trustManagers = tmf.getTrustManagers();
final KeyStore keyStore = loadKeyStore(...); // Gets and loads client certs and key
final KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(keyStore, password.toCharArray());
keyManagers = kmf.getKeyManagers();
sslContext.init(keyManagers, trustManagers, null);
上記のコードは、春のブートバージョン2.1.3.RELEASEおよび他のツール(mongodbクライアントなど)(例:studio3tまたはmongo compass)で、mongodbまたはhttpクライアント証明書でも正常に機能しますが、1.4.1.RELEASEでは、残念ながら上記のコード結果として
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
at java.security.cert.CertPathBuilder.build(Unknown Source)
現在、私は後のバージョンと古いバージョンの両方で見つけたAPIに違いがあります。古いバージョンのmongodb libでは、MongoClientOptions.BuilderはsocketFactory
パラメーターとしてのみ使用しますが、それ以降のバージョンではSSLContext
パラメーターとして使用します。以下の両方のコードフラグメント。
spring-boot-starter-data-mongodb-1.4.1.RELEASE
final MongoClientOptions.Builder builder = MongoClientOptions.builder(config.getOptions());
final SSLContext sslContext = certificateUtil.buildSslContext(...);
builder.socketFactory(sslContext.getSocketFactory());
spring-boot-starter-data-mongodb-2.3.1.RELEASE
final MongoClientOptions.Builder builder = MongoClientOptions.builder(config.getOptions());
final SSLContext sslContext = certificateUtil.buildSslContext(...);
builder.sslContext(sslContext);
古いバージョンでMongoUriオプションを使用しようとしましたが、URIとSSL証明書を使用してmongodbに接続するドキュメントが見つからなかったため失敗しました(古いバージョンから、新しいmongodb仕様のようにTLSパラメーターを使用できませんでした)。
上記へのポインタは高く評価されています。SSLContextの方法、または必要に応じてMongoUriを参照することもできます。
誰もがこの問題に遭遇した場合、今のところ、mongoドライバーのバージョンを3.5にアップグレードして、SSLコンテキストによるSSL / TLS構成のサポートを追加した1つの解決策を見つけました。これにより、証明書を使用してデータベースに接続できます。バージョンがデフォルトのバージョンと異なるため、私はアプリケーションの広範なテストを行います-3.2
リファレンス https://mongodb.github.io/mongo-java-driver/3.5/driver/tutorials/ssl/
POMの変更
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<exclusions>
<exclusion>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.5.0</version>
</dependency>
トラストストアとキーストアにクライアントとサーバーに必要な証明書とキーを読み込んだ後、以下を使用してmongoオプション設定を使用します。
final MongoClientOptions.Builder builder = MongoClientOptions.builder(config.getOptions());
final SSLContext sslContext = certificateUtil.buildSslContext(...);
builder.sslContext(sslContext);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加