2017-06-28 80 views
2

我正在開發使用Spring Boot,Java JDK 1.8,Java的MongoDB驅動程序和MongoDB的微服務。我在Bluemix上創建了MongoDB實例,並且我正在從Java微服務連接到這個實例。如何將SSL證書添加到Bluemix Java雲代工應用程序?

Bluemix上的MongoDB實例已啓用SSL,並提供SSL證書。對於本地開發,我有Base64解碼這個證書,我已經將這個SSL證書導入到我的本地Java密鑰庫。因此,我可以在本地連接到Bluemix上的MongoDB實例,沒有任何問題。

當我部署我的春天啓動微服務的jar文件使用CF CLI來Bluemix,該微服務無法連接到MongoDB的上Bluemix因爲我還沒有上傳這是由MongoDB中提供的SSL證書。

有人能讓我知道將SSL證書上傳到Bluemix所需的步驟,以便我的微服務可以連接到MongoDB實例嗎?

回答

2

方案1A

如果你有一個證書,就可以使用spring-boot-ssl-truststore-gen這將證書添加到buildpack內的系統信任:

首先,你需要這在你的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

彈簧引導-SSL-信任根庫does not support加載從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

添加以下你的朋友。當你的應用程序啓動時使用https://github.com/snowch/spring-boot-ssl-truststore-gen XML自動加載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> 

或您的搖籃:

allprojects { 
    repositories { 
     ... 
     maven { url 'https://jitpack.io' } 
    } 
} 

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

選項2

如果要創建一個Cloud Foundry的應用並使用liberty buildpack看到這個問題以及接受的添加ssl證書的答案:Add certificate to truststore to enable SSL communication

選項3

如果您有權訪問套接字,您自己實例化一個MongoClient()實例,而不是讓彈簧雲連接器等庫處理此問題,您可以嘗試使用https://www.compose.com/articles/easier-java-connections-to-mongodb-at-compose-2/

+0

感謝您的迴應。我需要將多個SSL證書添加到manifest.yml文件,因爲我在Bluemix上連接了多個MongoDB實例。您能否讓我知道如何爲manifest.yml文件中的多個SSL證書添加TRUSTED_CA_CERTIFICATE? –

+0

我已更新選項1以提供更多信息。請讓我知道你是如何得到的。 –

+0

Chris,請允許我告訴我們如何在manifest.yml文件中添加多個SSL證書,或者是否存在對此方法的限制? –

相關問題