2

我有一個web應用程序,使用thymeleaf,springboot,angularjs和oracle sql developer db。由於雲代工廠存在SSL錯誤,JaxB不能解組?

本地我能夠連接並從oracle獲取值。但是當我將我的應用程序推送到雲代工廠時,我的狀態= 500。

錯誤

,我解組有一個不受信任的證書的URL(「你的連接不可靠)」。我在我的jvm中添加了cacerts,它允許它在本地工作。但我相信我需要將cacerts添加到雲代工廠。我將如何能夠這樣做?

SSL錯誤

ERR java.net.ConnectException: Connection timed out 
ERR at java.net.PlainSocketImpl.socketConnect(Native Method) 
ERR at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
ERR at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
ERR at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
ERR at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
ERR at java.net.Socket.connect(Socket.java:589) 
ERR at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:668) 
ERR at sun.net.NetworkClient.doConnect(NetworkClient.java:180) 
ERR at sun.net.www.http.HttpClient.openServer(HttpClient.java:432) 
ERR at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:173) 
ERR at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367) 
ERR at sun.net.www.http.HttpClient.openServer(HttpClient.java:527) 
ERR at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264) 
ERR at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191) 
ERR at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1105) 
ERR at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) 
ERR at rest.springframework.controllers.IndexController.getDetails(IndexController.java:59) 
ERR at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
ERR at java.lang.reflect.Method.invoke(Method.java:498) 
ERR at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:999) 

在rest.springframework.jaxb.JAXSample.readXML(JAXSample.java:34)ERR

原因

我除去JAXB數據編從我的應用程序中,並上傳到雲代工廠,我沒有得到狀態= 500。我如何添加SSL來防止這種情況發生?

JAXB樣品

public deviceCert readXML(String MAC) throws MalformedURLException { 
    results customer = null; 
    deviceCert dcert = null; 
    String APPKEY = "Production"; 

    try { 
     JAXBContext jaxbContext = JAXBContext.newInstance(results.class); 
     //line 34 is below VV. 
     URL url = new URL("https://untrusted.page.that.I.Am/unmarshalling" + "?mac=" + MAC + "&app_key=" + APPKEY); 

     HttpURLConnection http = (HttpURLConnection) url.openConnection(); 

     http.addRequestProperty("User-Agent", "Mozilla/4.76"); 
     InputStream is = http.getInputStream(); 
     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
     customer = (results) jaxbUnmarshaller.unmarshal(is); 

     List<deviceCert> dcerts = customer.getDcerts(); 
     dcert = dcerts.get(0); 

找到相關鏈接here

我跟着CF CLI SSL但是這並沒有這樣的伎倆。

嘗試

  1. 創建的文件夾資源/配置/信任我的應用程序。
  2. 將Cert.cer添加到truststore文件夾中。
  3. 推送應用程序到雲代工廠。
  4. CF設置ENV我的應用程序內JAVA_OPTS '-Djavax.net.ssl.TrustStore = classpath中:資源/配置/信任'

同樣的錯誤空話改變。

嘗試2

<dependency> 
    <groupId>io.pivotal.spring.cloud</groupId> 
    <artifactId>cloudfoundry-certificate-truster</artifactId> 
    <version>1.0.1.RELEASE</version> 
</dependency> 
  1. 加入依賴性

  2. 重新打包的應用程序,上傳到比照

  3. 在Cloud Foundry

    CF_TARGET

    新增環境變量= https://api.my-cf-domain.com

      //url of my secured/untrusted page 
    

Github example

新的堆棧跟蹤誤差

ERR at java.util.concurrent.FutureTask.get(FutureTask.java:205) 
ERR at io.pivotal.springcloud.ssl.SslCertificateTruster.getUntrustedCertificateInternal(SslCertificateTruster.java:90) 
ERR at io.pivotal.springcloud.ssl.SslCertificateTruster.getUntrustedCertificate(SslCertificateTruster.java:66) 
ERR at io.pivotal.springcloud.ssl.CloudFoundryCertificateTruster.trustCertificatesInternal(CloudFoundryCertificateTruster.java:44) 
ERR at io.pivotal.springcloud.ssl.CloudFoundryCertificateTruster.trustCertificates(CloudFoundryCertificateTruster.java:32) 
ERR at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:420) 
ERR at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:403) 
ERR at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:394) 
ERR at org.springframework.boot.SpringApplication.initialize(SpringApplication.java:261) 
ERR at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:237) 
ERR at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175) 
ERR at rest.springframework.SpringBootWebApplication.main(SpringBootWebApplication.java:13) 
ERR at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
ERR at java.lang.reflect.Method.invoke(Method.java:498) 
ERR at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) 
ERR at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) 
ERR at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) 

這項工作爲什麼在本地找到,但不在雲上?

+1

「我需要一個雲個人資料?」 - 是的,可能還有防火牆規則,允許PCF連接到未在雲上運行的Oracle數據庫。 – duffymo

+0

@duffymo用於雲配置。我只是添加cloud.datasource.url等.... – Jesse

+0

我想你還需要一個服務來連接到實例。 – duffymo

回答

1

有多種方式向CA證書添加到您的容器:
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-internal-CA

最簡單的可能就是指向了Java虛擬機,你在你的應用程序中捆綁CACERT文件,使用cf set-env <app> JAVA_OPTS '-Djavax.net.ssl.TrustStore=classpath:resources/config/truststore'或應用清單中的「env」屬性。

+0

我做了你所說的set-env。我重新啓動了我的應用程序,但它仍然無法工作。我仍然收到上面的堆棧跟蹤相同的錯誤。 – Jesse

+0

我不認爲這是你的實際問題的答案,這看起來與證書相關的更多網絡相關。但爲了提供SSL/cert信任問題的其他解決方案,您可以從我給出的演示文稿中查看此幻燈片 - > https://docs.google.com/presentation/d/1GQ2qrFT3rNJ6L2PURmNfEkKdQhed_vI23Q0hopVFd0o/edit#slide=id.g154ee7fa13_0_13 –

+0

@DanielMikusa我發現這是SSL問題的具體證據。當我從應用程序中刪除jaxB時,它工作正常。 – Jesse

0

如果你控制你的CloudFoundry的平臺,那麼你可以用下面的辦法::

1)通過OPS管理員添加證書的PCF或經波什http://bosh.io/docs/trusted-certs.html

2)配置buildpack使用自定義的證書信任存儲。

CF設置ENV應用JBP_CONFIG_CONTAINER_CERTIFICATE_TRUST_STORE「{啓用:真正}」

鏈接:

https://docs.cloudfoundry.org/buildpacks/java/bosh_custom_trusted_certs.html

https://github.com/cloudfoundry/java-buildpack/blob/master/README.md#configuration-and-extension

0

拳,你必須創建一個下載證書JKS文件。您可以從JDK bin中找到keytool。

密鑰工具-importcert -file 「your.cer」 -keystore your.jks -alias 「testAlias」

添加your.jks文件如春啓動的項目資源。

設定的路徑,並使用在application.properties 如配置證書存儲的密碼:從應用程序啓動

your.ssl.trust-store = your.jks 
your.ssl.trust-password = changeit 

加載它。

如:

public class LoadSSLTrustStore implements CommandLineRunner{ 


     @Value("${your.ssl.trust-store}") 
     private String keyUrl; 
     @Value("${your.ssl.trust-password}") 
     private String keyPassword; 
    @Override 
    public void run(String... arg0) throws Exception { 
     try{ 
      System.setProperty("javax.net.ssl.trustStore",CustomerMasterServiceApplication.class.getClassLoader().getResource(keyUrl).getFile()); 
      System.setProperty("javax.net.ssl.trustStorePassword",keyPassword); 

     }catch(Exception e){ 
      LOGGER.error("Error in loading SSL trusted key store for Connect to GCIN service",e); 
     } 

    } 

} 

相關問題

Add SSL keystore file to java trusted store for HTTP Client request on PCF (Cloud Foundry)

+0

我用命令提示符將.crt保存爲.jks。在我的app.properties文件中添加了憑據。並創建一個類來加載ssl信任存儲。遵循你提供的鏈接的例子。但我仍然收到同樣的錯誤 – Jesse