如何将 SSL 证书添加到 Bluemix Java 云代工厂应用程序?



我正在使用Spring Boot,Java JDK 1.8,Java的MongoDB驱动程序和MongoDB开发微服务。我已经在 Bluemix 上创建了 MongoDB 实例,并且正在从 Java 微服务连接到此实例。

Bluemix 上的 MongoDB 实例启用了 SSL,它提供了 SSL 证书。对于本地开发,我已经对 Base64 解码了此证书,并将此 SSL 证书导入到我的本地 java 密钥库中。因此,在本地,我可以毫无问题地连接到 Bluemix 上的 MongoDB 实例。

当我使用 cf CLI 将我的 Spring 引导微服务作为 jar 文件部署到 Bluemix 时,微服务无法连接到 Bluemix 上的 MongoDB,因为我还没有上传 MongoDB 提供的 SSL 证书。

有人可以告诉我将 SSL 证书上传到 Bluemix 以便我的微服务可以连接到 MongoDB 实例所需的步骤吗?

选项 1a

如果你有一个证书,你可以使用 spring-boot-ssl-truststore-gen,它将证书添加到构建包内的系统信任库:

首先,你需要在你的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:
    TRUSTED_CA_CERTIFICATE: |-
        -----BEGIN CERTIFICATE-----
        changeme
        -----END CERTIFICATE-----

cf push应用程序时,证书将添加到信任库。

如果您不打算创建云铸造应用程序,请使用证书的值TRUSTED_CA_CERTIFICATE设置环境变量,例如

$ export TRUSTED_CA_CERTIFICATE=<TRUSTED_CA_CERTIFICATE_VALUE>

选项 1b

spring-boot-ssl-truststore-gen 库不支持从TRUSTED_CA_CERTIFICATE环境变量加载多个证书。 如果您有多个证书,您可以尝试直接调用 ssl-truststore-gen api,例如从其中一个类中的静态块:

package helloworld;
import com.orange.clara.cloud.boot.ssl.CertificateFactory;
import com.orange.clara.cloud.boot.ssl.DefaultTrustStoreAppender;
import com.orange.clara.cloud.boot.ssl.TrustStoreInfo;
public class CertLoader {
    public static final String SSL_TRUST_STORE_SYSTEM_PROPERTY = "javax.net.ssl.trustStore";
    public static final String SSL_TRUST_STORE_PASSWORD_SYSTEM_PROPERTY = "javax.net.ssl.trustStorePassword";
    static {
        String[] certs = {
            System.getenv("CERTIFICATE_1"),
            System.getenv("CERTIFICATE_2")
        };
        for (String cert : certs) {
            DefaultTrustStoreAppender trustStoreAppender = new DefaultTrustStoreAppender();
            TrustStoreInfo trustStoreInfo = trustStoreAppender.append(CertificateFactory.newInstance(cert));
            System.setProperty(SSL_TRUST_STORE_SYSTEM_PROPERTY, trustStoreInfo.getTrustStorefFile().getAbsolutePath());
            System.setProperty(SSL_TRUST_STORE_PASSWORD_SYSTEM_PROPERTY, trustStoreInfo.getPassword());
        }
    }
}

然后,您将需要在 manifest.yml 中提供类似以下内容的内容:

env:
    CERTIFICATE_1: |-
        -----BEGIN CERTIFICATE-----
        changeme
        -----END CERTIFICATE-----
    CERTIFICATE_2: |-
        -----BEGIN CERTIFICATE-----
        changeme
        -----END CERTIFICATE-----

选项 1c

将以下内容添加到 pom .xml以便在应用程序启动时使用 https://github.com/snowch/spring-boot-ssl-truststore-gen 自动加载 SSL 证书:

<repository>
   <id>jitpack.io</id>
   <url>https://jitpack.io</url>
</repository>
<dependency>
   <groupId>com.github.snowch</groupId>
   <artifactId>spring-boot-ssl-truststore-gen</artifactId>
   <version>master</version>
</dependency>

或致您的 Gradle:

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
compile 'com.github.snowch:spring-boot-ssl-truststore-gen:master'

选项 2

如果您正在创建云铸造应用程序并使用 liberty 构建包,请参阅此问题以及添加 SSL 证书的已接受答案: 将证书添加到信任库以启用 SSL 通信

选项 3

如果您可以访问套接字,例如,您自己实例化MongoClient()实例,而不是让 Spring 云连接器等库为您处理此问题,您可以尝试 https://www.compose.com/articles/easier-java-connections-to-mongodb-at-compose-2/

最新更新