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

时间:2017-06-28 22:05:35

标签: java mongodb ssl ibm-cloud

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

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

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

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

1 个答案:

答案 0 :(得分:2)

选项1a

如果您有一个证书,则可以使用spring-boot-ssl-truststore-gen将证书添加到buildpack内的系统信任库:

首先,您需要在pom.xml(或替代方案)中使用它:

public function _getSocialAccountTitle()
{
    if (isset($this->social_network)) {
        return $this->social_network->title.' ('.$this->user_key.')';
    }
    return $this->id;
}

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

如果您要创建云代工厂应用,请在manifest.yml中声明证书:

<dependency>
    <groupId>com.orange.clara.cloud.boot.ssl-truststore-gen</groupId>
    <artifactId>spring-boot-ssl-truststore-gen</artifactId>
    <version>2.0.21</version>
</dependency>

当您env: TRUSTED_CA_CERTIFICATE: |- -----BEGIN CERTIFICATE----- changeme -----END CERTIFICATE----- 申请时,证书将被添加到信任库。

如果您没有创建云代工厂应用,请使用证书的值设置enivonment变量cf push,例如

TRUSTED_CA_CERTIFICATE

选项1b

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

$ export TRUSTED_CA_CERTIFICATE=<TRUSTED_CA_CERTIFICATE_VALUE>

然后,您需要在manifest.yml中使用以下内容:

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());
        }
    }
}

选项1c

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

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

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

或您的Gradle:

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

选项2

如果您正在创建云代工厂应用并使用liberty buildpack,请参阅此问题以及添加ssl证书的已接受答案:Add certificate to truststore to enable SSL communication

选项3

如果您有权访问套接字,例如您自己实例化allprojects { repositories { ... maven { url 'https://jitpack.io' } } } compile 'com.github.snowch:spring-boot-ssl-truststore-gen:master' 实例,而不是让像Spring spring连接器这样的库为您处理此问题,您可以尝试https://www.compose.com/articles/easier-java-connections-to-mongodb-at-compose-2/