Я сталкиваюсь с проблемами при подключении к кластеру DocumentDB с обычным Java через TLS / SSL
Процедура, которой я следовал согласно AWS документам , такова:
Я скачал файл .pem
из AWS и скопировал в root моего java проекта, откуда я выполнил:
keytool -importcert -trustcacerts -file rds-combined-ca-bundle.pem -alias certAlias -keystore rds-ca-certs -storepass keyStorePassword
Это создало rds-ca-certs
в root моего проекта, который теперь выглядит следующим образом:
![enter image description here](https://i.stack.imgur.com/nitFj.png)
И код java в Main. 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: невозможно найти допустимый путь сертификации для запрошенной цели
Интересно, когда я использую mon go 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 код, предоставленный AWS (который отличается только конфигурацией хранилища ключей), работает.
PD: я знаю, что есть множество других вопросов, касающихся соединения SSL / TLS с AWS DocumentDB, но ни одного из них конкретно касаются моей проблемы. Кроме того, я также проверил простые вопросы подключения TLS / SSL к mongodb, и процесс отличается, поэтому они недействительны для меня.