我成功地使用 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


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!