gpt4 book ai didi

java - Spring boot/Java、mongodb SSL/TLS 连接

转载 作者:行者123 更新时间:2023-12-04 22:38:49 33 4
gpt4 key购买 nike

我有两个使用spring boot + mongodb的项目。在一个项目中,spring boot 版本是 1.4.1.RELEASE,另一个项目是 2.1.3.RELEASE。我有证书,PEM 格式的 key 可以载入信任库和 keystore - 一个服务器证书链和另一个客户端证书和私钥。我以编程方式将证书加载到信任库和 keystore 中。
我在 yml 文件中配置了一个证书路径,其中包含一个客户端和服务器文件夹,客户端和服务器证书或 key 将分别存储在其中。下面是我用来以编程方式将证书加载到信任库和 keystore 中的代码。

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);
上面的代码在 Spring Boot 版本 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 配置的支持。通过这个,我可以使用证书连接到数据库。我将对应用程序进行广泛的测试,因为版本与默认版本不同 - 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>
在信任库和 keystore 中加载客户端和服务器所需的证书和 key 后,使用以下 mongo 选项配置。
final MongoClientOptions.Builder builder = MongoClientOptions.builder(config.getOptions());
final SSLContext sslContext = certificateUtil.buildSslContext(...);
builder.sslContext(sslContext);

关于java - Spring boot/Java、mongodb SSL/TLS 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62862637/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com