如何向Bluemix java cloud foundry应用程序添加SSL证书?

如何向Bluemix java cloud foundry应用程序添加SSL证书?,java,mongodb,ssl,ibm-cloud,Java,Mongodb,Ssl,Ibm Cloud,我正在使用SpringBoot、JavaJDK1.8、用于Java的MongoDB驱动程序和MongoDB开发微服务。我已经在Bluemix上创建了MongoDB实例,并且正在从Java微服务连接到此实例 Bluemix上的MongoDB实例启用了SSL,并提供SSL证书。对于本地开发,我已经对这个证书进行了Base64解码,并将这个SSL证书导入到我的本地java密钥库中。因此,在本地,我可以毫无问题地连接到Bluemix上的MongoDB实例 当我使用cf CLI将spring boot m

我正在使用SpringBoot、JavaJDK1.8、用于Java的MongoDB驱动程序和MongoDB开发微服务。我已经在Bluemix上创建了MongoDB实例,并且正在从Java微服务连接到此实例

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

当我使用cf CLI将spring boot microservices作为jar文件部署到Bluemix时,microservices无法连接到Bluemix上的MongoDB,因为我尚未上载MongoDB提供的SSL证书


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

选项1a

如果您只有一个证书,则可以使用将证书添加到buildpack内的系统信任库中的:

首先,您需要在pom.xml(或备选方案)中使用此选项:

当您推送应用程序时,证书将被添加到信任库中

如果您没有创建cloud foundry应用程序,请使用证书的值设置enivonment变量
TRUSTED_CA_CERTIFICATE
,例如

$ export TRUSTED_CA_CERTIFICATE=<TRUSTED_CA_CERTIFICATE_VALUE>
然后,您需要在manifest.yml中包含以下内容:

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

    CERTIFICATE_2: |-
        -----BEGIN CERTIFICATE-----
        changeme
        -----END CERTIFICATE-----
选项1c

将以下内容添加到pom.xml中,以便在应用程序启动时使用自动加载ssl证书:

选项2

如果您正在创建cloud foundry应用程序并使用liberty buildpack,请参阅此问题以及添加ssl证书的公认答案:

选项3


如果您可以访问套接字,例如,您自己正在实例化一个
MongoClient()
实例,而不是让spring cloud connectors之类的库为您处理这个问题,那么您可以尝试一下,谢谢您的回答。我需要向manifest.yml文件添加多个SSL证书,因为我在Bluemix上有多个MongoDB实例要连接。您能告诉我如何为manifest.yml文件中的多个SSL证书添加受信任的CA证书吗?我已经用更多信息更新了选项1。请告诉我您的进展情况。Chris,您能告诉我我们如何在manifest.yml文件中添加多个SSL证书吗?或者这种方法有任何限制吗?spring boot SSL truststore gen不支持这一点。我已经更新了答案,为您提供了一个可能的解决方案。Chris尝试了上面提到的选项1b,得到了以下示例:“App/0 java.security.cert.CertPathValidator异常:CN颁发的证书不可信;内部原因是:App/0 java.security.cert.CertPathValidator异常:证书链接错误。App/0原因:javax.net.ssl.SSLHandshakeException:com.ibm.jsse2.util.h:PKIX路径生成失败:java.security.cert.CertPathBuilderException:PKIXCertPathBuilderImpl无法生成有效的CertPath”。在此之后,我使用Server.xml文件尝试了下面提到的选项2,并将jar转换为war文件,得到了相同的异常。
$ export TRUSTED_CA_CERTIFICATE=<TRUSTED_CA_CERTIFICATE_VALUE>
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());
        }
    }
}
env:
    CERTIFICATE_1: |-
        -----BEGIN CERTIFICATE-----
        changeme
        -----END CERTIFICATE-----

    CERTIFICATE_2: |-
        -----BEGIN CERTIFICATE-----
        changeme
        -----END CERTIFICATE-----
<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>
allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

compile 'com.github.snowch:spring-boot-ssl-truststore-gen:master'