与 Java 的 AWS DocumentDB TLS 连接

Arc*_*nes 12 aws-documentdb

我在通过 TLS/SSL 使用纯 Java 连接我的 DocumentDB 集群时遇到问题

我按照AWS 文档遵循的程序是这样的:

.pem从 AWS下载了文件并复制到我的 java 项目的根目录中,从那里我执行:

keytool -importcert -trustcacerts -file rds-combined-ca-bundle.pem -alias certAlias -keystore rds-ca-certs -storepass keyStorePassword
Run Code Online (Sandbox Code Playgroud)

这已经在rds-ca-certs我的项目的根目录创建了,现在看起来像这样:

在此处输入图片说明

并且,Main.java 中的 java 代码是:

package com.example.documentdb;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.ServerAddress;
import com.mongodb.MongoException;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoCollection;
import org.bson.Document;


public final class Main {
    private Main() {
    }
    public static void main(String[] args) {

        String template = "mongodb://%s:%s@%s/test?ssl=true&replicaSet=rs0&readpreference=%s";
        String username = "myUsernameInCluster";
        String password = "myPasswordInCluster";
        String clusterEndpoint = "mycluster.node.us-east-1.docdb.amazonaws.com:27017";
        String readPreference = "secondaryPreferred";
        String connectionString = String.format(template, username, password, clusterEndpoint, readPreference);

        String keystore = "rds-ca-certs";
        String keystorePassword = "keyStorePassword";

        System.setProperty("javax.net.ssl.trustStore", keystore);
        System.setProperty("javax.net.ssl.trustStorePassword", keystorePassword);

        MongoClientURI clientURI = new MongoClientURI(connectionString);
        MongoClient mongoClient = new MongoClient(clientURI);

        MongoDatabase testDB = mongoClient.getDatabase("test");
        MongoCollection<Document> numbersCollection = testDB.getCollection("numbers");

        Document doc = new Document("name", "pi").append("value", 3.14159);
        numbersCollection.insertOne(doc);

        MongoCursor<Document> cursor = numbersCollection.find().iterator();
        try {
            while (cursor.hasNext()) {
                System.out.println(cursor.next().toJson());
            }
        } finally {
            cursor.close();
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

它给了我这个丑陋的错误:

com.mongodb.MongoSocketWriteException: 异常发送消息

引起:javax.net.ssl.SSLHandshakeException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效认证路径

有趣的是,当我使用 mongo CLI 通过 SSL/TLS 进行连接时,如下所示:

mongo --ssl --host mycluster.node.eu-central-1.docdb.amazonaws.com:27017 --sslCAFile rds-combined-ca-bundle.pem --username myUsernameInCluster --password myPasswordInCluster
Run Code Online (Sandbox Code Playgroud)

它工作得很好,所以我放弃了网络问题,我认为问题出在 Java 代码本身或keytool执行的命令中。

此外,在集群中禁用TLS 的情况下,AWS 提供的 Java 代码(仅在密钥库配置中有所不同)可以工作。

PD:我知道还有很多关于与 AWS DocumentDB 的 SSL/TLS 连接的其他问题,但没有一个专门解决我的问题。此外,我还检查了普通的 mongodb TLS/SSL 连接问题,并且过程不同,因此它们对我无效。

Arc*_*nes 10

该问题似乎与在相同别名下在bundle中导入证书的过程有关。

所以我不得不停止使用捆绑选项(rds-combined-ca-bundle.pem)并开始使用这个rds-ca-2019-root.pem

使用以下命令导入密钥库后:

keytool -importcert -trustcacerts -file rds-ca-2019-root.pem -alias rds19 -keystore rds-ca-certs -storepass keyStorePassword
Run Code Online (Sandbox Code Playgroud)

实现了与 TLS 下的数据库的连接。


归档时间:

查看次数:

3242 次

最近记录:

4 年,3 月 前