我成功地使用 MySQL Workbench 在 Bluemix 托管的 MySQL Compose 服务上完成了完整的 crud。
然后,我使用 Apache Derby 在本地笔记本电脑上使用 SpringBoot 构建了一个简单的微服务...成功。
我的下一步是使用 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:mypassword@somedomain.com:55555/compose"
}
我应该在我的 application.properties 中的某个地方使用 ca 证书吗?
我是否需要在默认使用 springBoot 运行的嵌入式 tomcat 服务器上启用 ssl?
我如何配置我的 springBoot 应用程序以使用他们提供的 json 通过 SSL 连接到我的云提供商 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
这是我的第一个答案 - 这没有用。忽略此部分。
一个选项是:
Import the cert to Java truststore file, pack the file into Java application and specify its path via JAVA_OPTS environment variable; the truststore file can be placed under resource directory. This can be used for single applications:
By using the 'cf set-env' command:
cf set-env <app> JAVA_OPTS '-Djavax.net.ssl.TrustStore=classpath:resources/config/truststore -Djavax.net.ssl.trustStorePassword=changeit'
or, by using 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
请注意, keystore 位置 (resources/config/truststore) 和 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