将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
问:我应该提供给我的“ca_certificate_base64”,其解码为一个名为“信任”的文件,并把它放在我的资源文件夹(SpringBoot项目)? – xpagesbeast
我已经更新了答案。请让我知道你是如何得到的。如果这不起作用,也许你可以在没有ssl的github中创建一个最小的例子,我可以尝试添加ssl并验证修复工作。 –
我将jdbc更改为不使用ssl,并且我能够从我的笔记本电脑(springBoot项目)上对云数据库执行全面的检查...成功我遵循您编写的创建密钥存储库的所有步骤,但有点困惑JAVA_OPTS环境变量。是否有我需要编辑的spring application.properties,以便Tomcat加载环境变量,还是需要在我的O/S(便携式计算机)中创建环境变量“global”。我正在使用Ubuntu Linux工作站。 – xpagesbeast