1

我成功地使用 MySQL Workbench 对 Bluemix 托管的 MySQL Compose 服务进行了完整的操作。

然后,我使用 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?

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

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

1 回答 1

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) 和 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

于 2017-06-05T10:54:07.827 回答