将SpringBoot连接到托管在云中的MySQL需要SSL

问题描述:

我成功使用MySQL Workbench对Bluemix托管的MySQL Compose服务执行完全攻击。将SpringBoot连接到托管在云中的MySQL需要SSL

然后,我在本地笔记本电脑上用Apache Derby构建了一个简单的SpringBoot Microservice ...成功。

我的下一步是使用Bluemix中托管的MySQL Compose。

我编辑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" 
} 

我应该在我的application.properties中的某处使用CA证书吗?

我是否需要在默认情况下使用springBoot运行的嵌入式tomcat服务器上启用ssl?

如何配置我的springBoot应用程序以连接到我的云提供商带有SSL提供的json的MySQL实例?

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

以下内容添加到您的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设定-ENV' 命令:使用清单

    cf set-env <app> JAVA_OPTS '-Djavax.net.ssl.TrustStore=classpath:resources/config/truststore -Djavax.net.ssl.trustStorePassword=changeit' 
    
  • ,或者。阳明海运

    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 

注意,密钥存储位置(资源/配置/信任)和Storepass用于(的changeit)都在JAVA_OPTS设置。

有几个不同的选项,你可以试试。有关更多信息,请参阅本文档: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

+0

问:我应该提供给我的“ca_certificate_base64”,其解码为一个名为“信任”的文件,并把它放在我的资源文件夹(SpringBoot项目)? – xpagesbeast

+0

我已经更新了答案。请让我知道你是如何得到的。如果这不起作用,也许你可以在没有ssl的github中创建一个最小的例子,我可以尝试添加ssl并验证修复工作。 –

+0

我将jdbc更改为不使用ssl,并且我能够从我的笔记本电脑(springBoot项目)上对云数据库执行全面的检查...成功我遵循您编写的创建密钥存储库的所有步骤,但有点困惑JAVA_OPTS环境变量。是否有我需要编辑的spring application.properties,以便Tomcat加载环境变量,还是需要在我的O/S(便携式计算机)中创建环境变量“global”。我正在使用Ubuntu Linux工作站。 – xpagesbeast