Spring boot / Java, подключение mongodb SSL / TLS - PullRequest
1 голос
/ 12 июля 2020

У меня есть два проекта, в которых я использую spring boot + mongodb. В одном проекте версия весенней загрузки - 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);

Приведенный выше код отлично работает для сертификатов mongodb или даже HTTP-клиентов в версиях весенней загрузки 2.1.3. RELEASE и в других инструментах, таких как клиенты mongodb (например, studio3t или mon go compass), но в 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 в более старой версии безуспешно, потому что не смог найти документ для подключения к mongodb с использованием сертификатов URI и SSL (поскольку более старая версия, не может использовать параметры TLS, как в новых спецификациях mongodb).

Любые указатели на выше приветствуются, SSLContext, или также могут обратиться к MongoUri, если требуется.

1 Ответ

2 голосов
/ 12 июля 2020

Для тех, кто столкнется с этой проблемой, на данный момент я нашел одно решение, обновив версию драйвера mon go до 3.5, где они добавили поддержку конфигурации SSL / TLS через контекст SSL. Благодаря этому я могу подключиться к базе данных с сертификатами. Я буду проводить обширное тестирование приложения, потому что версия отличается от той, которая была по умолчанию - 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>

Используйте конфигурацию параметров mon go, используя следующие после загрузки необходимых сертификатов и ключей для клиентов и сервера в хранилище доверенных сертификатов и хранилище ключей.

final MongoClientOptions.Builder builder = MongoClientOptions.builder(config.getOptions());
final SSLContext sslContext = certificateUtil.buildSslContext(...);
builder.sslContext(sslContext);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...