У меня есть два проекта, в которых я использую 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, если требуется.