繁体   English   中英

Spring 启动 / Java, mongodb ZEA52C36203C5F99C3CE2Z/TLS 连接性

[英]Spring boot / Java, mongodb SSL / TLS connectivity

我有两个项目,我使用 spring 引导 + mongodb。 在一个项目中,spring 启动版本是 1.4.1.RELEASE,另一个项目是 2.1.3.RELEASE。 我有证书,PEM 格式的密钥可以载入信任库和密钥库 - 一个服务器证书链和另一个客户端证书和私钥。 我以编程方式将证书加载到信任库和密钥库中。

我在 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);

The above code is working fine for mongodb or even http client certificates in spring boot versions 2.1.3.RELEASE and in other tools such as mongodb clients (studio3t or mongo compass for example), but in 1.4.1.RELEASE unfortunately the above code导致

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 的文档(由于旧版本,无法使用新的 Z685A5F7FC 规范中的 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>

在信任库和密钥库中为客户端和服务器加载所需的证书和密钥后,使用以下 mongo 选项配置。

final MongoClientOptions.Builder builder = MongoClientOptions.builder(config.getOptions());
final SSLContext sslContext = certificateUtil.buildSslContext(...);
builder.sslContext(sslContext);

尝试更新您的 JDK 版本。 因为我在 IntelliJ 中使用 JDK 1.8.0_73 版本时遇到了同样的问题。 之后,我将JDK版本更改为1.8.0_231。 然后它起作用了。! 此链接可能有助于在没有 oracle 登录的情况下下载 java JDK - https://mega.nz/folder/EolCySUXhY#DWZdcafG

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM