【发布时间】:2020-05-01 11:42:18
【问题描述】:
我在使用基于 TLS/SSL 的纯 Java 连接我的 DocumentDB 集群时遇到问题
我按照AWS docs 遵循的程序是这样的:
我从 AWS 下载了 .pem 文件并复制到我的 java 项目的根目录中,我从那里执行:
keytool -importcert -trustcacerts -file rds-combined-ca-bundle.pem -alias certAlias -keystore rds-ca-certs -storepass keyStorePassword
这已经在我的项目的根目录创建了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();
}
}
}
它给了我这个丑陋的错误:
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
它工作得很好,所以我放弃了网络问题,我认为问题出在 Java 代码本身或执行的 keytool 命令中。
此外,在集群中 禁用 TLS 的情况下,java code provided by AWS(仅在密钥库配置中有所不同)有效。
PD:我知道关于 SSL/TLS 与 AWS DocumentDB 的连接还有很多其他问题,但没有一个专门解决我的问题。此外,我还检查了普通的 mongodb TLS/SSL 连接问题,并且过程不同,因此它们对我无效。
【问题讨论】:
-
我认为您实际上并未加载信任库.. 尝试
-Djavax.net.ssl.trustStore=path/to/keystore.jks查看此问题stackoverflow.com/questions/2138574/…。 stackoverflow.com/questions/48790981/… 。 stackoverflow.com/questions/5871279/java-ssl-and-cert-keystore/… 。您还可以将 aws rds 包导入您的 java 信任库 -
@Yan 因为信任存储在项目的根目录中,所以我只是简单地用它的名字来称呼它。无论如何,我也用绝对路径测试过,同样的问题也会发生。我对您所说的将 aws rds 包直接导入 java 信任库很感兴趣,因为这不需要 keytool 配置,而且一切都由代码完成,对吧?你能分享一些关于这个方法的细节吗?
标签: aws-documentdb