Как настроить конфигурацию клиента TLS от Spring Boot до экземпляра MongoDB? - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь настроить веб-приложение Spring Boot для использования TLS при подключении к экземпляру MongoDB, работающему в контейнере Docker.

Я настроил экземпляр MongoDB в Docker использовать самозаверяющий сертификат и требовать TLS. Файл конфигурации для MongoDB (mongod.conf) выглядит следующим образом:

net:
  bindIp: 0.0.0.0
  port: 27017
  tls:
    certificateKeyFile: /home/mongodb/ssl/my-self-signed-cert.pem
    mode: requireTLS
    allowConnectionsWithoutCertificates: true
...

Я могу подключиться к экземпляру с TLS, используя строку подключения Mon go из командной строки, получая Mon go ракушка. Однако я не могу заставить свое веб-приложение подключаться к тому же экземпляру MongoDB через TLS.

Чтобы попытаться проверить соединение, я попытался создать модульный тест, который будет обращаться к БД. Магия Spring Boot c вызывает сбой теста во время настройки. Похоже, это потому, что автоматическое подключение некоторых зависимостей (я думаю, MongoTemplate), кажется, проверяет соединение, которое требует TLS, а затем завершается ошибкой.

Чтобы установить соединение TLS, я добавил сертификат сервера в Java хранилище доверенных сертификатов, используя keytool. Тем не менее, соединение по-прежнему не удается. Я попытался указать расположение файла .jks, созданного с помощью keytool, а также в файле application.yml, например:

...
javax:
  net:
    ssl:
      trustStore: src/main/resources/truststore/trustedcerts.jks
...

В конечном счете, мой вопрос: как я могу настроить TLS- защищенные соединения с MongoDB из моего приложения Spring Boot? В настоящее время мы реализуем доступ к данным, используя MongoRepository и MongoTemplate.

1 Ответ

0 голосов
/ 08 апреля 2020

Вы должны установить системные свойства в вашем java приложении

System.setProperty ("javax.net.ssl.keyStore",keystorePath);
System.setProperty ("javax.net.ssl.keyStorePassword",keystorePass);
System.setProperty ("javax.net.ssl.trustStore",truststorePath);
System.setProperty ("javax.net.ssl.trustStorePassword","changeit");
...