Для подключения SpringBoot к MySQL, размещенному в облаке, требуется SSL

Я успешно использую MySQL Workbench для выполнения полной работы с сервисом MySQL Compose, размещенным на Bluemix.

Затем я создал простой микросервис с помощью SpringBoot на своем локальном ноутбуке с Apache Derby... успешно.

Следующим моим шагом было использование MySQL Compose, размещенного в Bluemix.

Я отредактировал application.properties и столкнулся с этой ошибкой «Ошибка построения пути PKIX: ....» «SunCertPathBuilderException: не удалось найти действительный путь сертификации для запроса цели»

application.properties file
spring.jpa.hibernate.ddl-auto=create
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.datasource.url=jdbc:mysql://somedomain:port/compose?useSSL=true?requireSSL=true
spring.datasource.username=myname
spring.datasource.password=mypassword

Bluemix предоставил мне эти учетные данные в json:

{
  "db_type": "mysql",
  "name": "bmix-dal-yp-xxxxxxx-",
  "uri_cli": "mysql -u myname -p --host somedomain.com --port 5555 --ssl-mode=REQUIRED",
  "ca_certificate_base64": "LS0tLS1CRUd......",
  "deployment_id": "58fexxxxxxxxxxx",
  "uri": "mysql://myname:[email protected]:55555/compose"
}

Должен ли я использовать сертификат ca где-то в моем application.properties?

Нужно ли мне включать ssl на моем встроенном сервере tomcat, работающем по умолчанию с SpringBoot?

Как я могу настроить приложение SpringBoot для подключения к экземпляру MySQL моего облачного провайдера с помощью SSL с помощью предоставленного ими json?

Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

person xpagesbeast    schedule 05.06.2017    source источник


Ответы (1)


Добавьте следующее в ваш pom.xml (или эквивалент):

...
<repositories>
   <repository>
      <id>jcenter</id>
      <url>http://jcenter.bintray.com </url>
      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>never</updatePolicy>
        <checksumPolicy>warn</checksumPolicy>
      </snapshots>
       <releases>
         <enabled>true</enabled>
         <checksumPolicy>warn</checksumPolicy>
      </releases>
   </repository>
</repositories> 
...
<dependency>
   <groupId>com.orange.clara.cloud.boot.ssl-truststore-gen</groupId>
   <artifactId>spring-boot-ssl-truststore-gen</artifactId>
   <version>2.0.21</version>
</dependency>
...

Добавьте следующее в свой manifest.yml

env:    
    # Add the certificate from VCAP_SERVICES ca_certificate_base64
    # You need to base64 decode the certificate and add it below
    # E.g. echo '<<ca_certificate_base64>>' | base64 -D

    TRUSTED_CA_CERTIFICATE: |-
        -----BEGIN CERTIFICATE-----
        ...
        -----END CERTIFICATE-----

Для получения дополнительной информации см. https://github.com/orange-cloudfoundry/spring-boot-ssl-truststore-gen

Также посмотрите минимальное приложение здесь: https://github.com/snowch/hello-spring-cloud/tree/8b9728a826dcc1995a7ccb19a852ac8face21147


Это мой первый ответ – он не сработал. Игнорировать этот раздел.

Один из вариантов:

Импортируйте сертификат в файл хранилища доверенных сертификатов Java, упакуйте файл в приложение Java и укажите путь к нему через переменную среды JAVA_OPTS; файл хранилища доверия может быть помещен в каталог ресурсов. Это можно использовать для отдельных приложений:

  • С помощью команды «cf set-env»:

    cf set-env <app> JAVA_OPTS '-Djavax.net.ssl.TrustStore=classpath:resources/config/truststore -Djavax.net.ssl.trustStorePassword=changeit' 
    
  • или, используя manifest.yml

    applications:
    - name: java-app
      ...
      env:
          JAVA_OPTS: '-Djavax.net.ssl.TrustStore=classpath:resources/config/truststore -Djavax.net.ssl.trustStorePassword=changeit'
    

Обратите внимание, что сертификат в поле ca_certificate_base64 имеет кодировку base64, поэтому вам нужно будет декодировать его перед добавлением в хранилище доверенных сертификатов, например.

Расшифруйте сертификат:

echo '<<ca_certificate_base64>>' | base64 -D  > ca_certificate.pem

Создайте хранилище доверия:

keytool -import -trustcacerts -file ca_certificate.pem -alias compose_cert -keystore resources/config/truststore -storepass changeit -noprompt

Обратите внимание, что расположение хранилища ключей (resources/config/truststore) и пароль хранилища (changeit) задаются в файле JAVA_OPTS.

Есть несколько разных вариантов, которые вы можете попробовать. Дополнительную информацию см. в этой документации: доверять-самоподписанным-сертификатам-или-частным-или-внутренним-ЦС" rel="nofollow noreferrer">https://discuss.pivotal.io/hc/en-us/articles/223454928-How-to -tell-application-containers-running-Java-apps-to-trust-self-signed-certs-or-a-private-or-internal-CA

person Chris Snow    schedule 05.06.2017
comment
Вопрос: мне следует взять предоставленный мне «ca_certificate_base64», декодировать его в файл с именем «truststore» и поместить его в папку моих ресурсов (проект SpringBoot)? - person xpagesbeast; 06.06.2017
comment
Я обновил ответ. Пожалуйста, дайте мне знать, как вы поживаете. Если это не сработает, возможно, вы могли бы создать минимальный пример в github, который работает без ssl, чтобы я мог попытаться добавить ssl и убедиться, что исправление работает. - person Chris Snow; 06.06.2017
comment
Я изменил jdbc, чтобы не использовать ssl, и я могу выполнять полную грубую работу с облачной базой данных со своего ноутбука (проект springBoot) ... успешно. Я выполнил все шаги, которые вы написали, чтобы создать хранилище ключей, но немного смущен для Переменная среды JAVA_OPTS. Есть ли spring application.properties, который мне нужно отредактировать, чтобы Tomcat загружался с переменной среды, или мне нужно создать глобальную переменную среды в моем O / S (ноутбуке). Я использую рабочую станцию ​​Ubuntu Linux. - person xpagesbeast; 08.06.2017
comment
Отличный материал. Доступен ли ваш проект в общедоступном репозитории github? Если это так, я могу взять инструкции в своем ответе и убедиться, что они работают для вашего конкретного проекта. - person Chris Snow; 08.06.2017
comment
Его нет в гитхабе. Я не уверен, куда поместить JAVA_OPTS, это в моем файле application.properties? Последний пакет, отправленный на сервер, был 363 мс назад. - person xpagesbeast; 09.06.2017
comment
Вызвано: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти допустимый путь сертификации к запрошенной цели - person xpagesbeast; 10.06.2017
comment
Подход здесь не работал для меня. Мне нужно провести дополнительное исследование сборки, чтобы понять, почему это не удается. Это может занять некоторое время. Я предлагаю также поднять билет поддержки на bluemix. - person Chris Snow; 10.06.2017
comment
Я нашел эту статью, которая может быть полезна compose.com/ статьи/ - person xpagesbeast; 14.06.2017