【问题标题】:JaxB not Unmarshalling due to SSL error on cloud foundry?由于 Cloud Foundry 上的 SSL 错误,JaxB 没有解组?
【发布时间】:2017-03-04 05:13:05
【问题描述】:

我有一个 Web 应用程序,使用 thymeleaf、springboot、angularjs 和 oracle sql developer db。

在本地,我能够连接并从 oracle 获取值。但是当我将我的应用程序推送到 Cloud Foundry 时,我得到了 status=500。

错误

我正在解组的 url 具有不受信任的证书(“您的连接不安全)”。我将 cacerts 添加到我的 jvm 中,这允许它在本地工作。但我相信我需要将 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) 出现错误

原因

我从我的应用程序中删除了 jaxB 解组并上传到 Cloud Foundry,但我没有得到 status=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. 在我的应用程序中创建了文件夹 resources/config/truststore。
  2. 已将 Cert.cer 添加到信任库文件夹中。
  3. 将应用推送到 Cloud Foundry。
  4. cf set-env my-app JAVA_OPTS '-Djavax.net.ssl.TrustStore=classpath:resources/config/truststore'

同样的错误没有改变。

尝试 2

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

  2. 重新打包的应用,上传到cf.

  3. 在 Cloud Foundry 上添加了环境变量

    CF_TARGET=https://api.my-cf-domain.com

               //url of my secured/untrusted page
    

Github example

新的 StackTrace 错误

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)

为什么这项工作可以在本地找到,而不是在云端?

【问题讨论】:

  • “我需要云配置文件吗?” - 是的,可能还有一条防火墙规则,允许 PCF 连接到不在云上运行的 Oracle 数据库。
  • @duffymo 用于云配置。我只是添加 cloud.datasource.url 等....
  • 我认为您还需要将服务附加到实例。
  • 另外,检查您的日志。 500 错误意味着您的应用程序失败,并且日志中有一个堆栈跟踪来告诉您失败的原因。这应该提供有关正在发生的事情的线索。
  • A Connection timed out 通常意味着无法访问主机。您可能需要检查防火墙规则等。

标签: jdbc spring-boot ssl-certificate cloud-foundry


【解决方案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

最简单的方法可能是使用 cf set-env &lt;app&gt; JAVA_OPTS '-Djavax.net.ssl.TrustStore=classpath:resources/config/truststore' 或应用清单中的“env”属性将 Java VM 指向您捆绑在应用中的 cacert 文件。

【讨论】:

  • 我做了你所说的set-env。我重新整理了我的应用程序,它仍然无法正常工作。我仍然收到与上面的堆栈跟踪相同的错误。
  • 我认为这不是您实际问题的答案,它看起来与证书相关的网络更多。但是要为 SSL/证书信任问题提供一些其他解决方案,您可以从我提供的演示文稿中查看这张幻灯片 -> docs.google.com/presentation/d/…
  • @DanielMikusa 我发现具体证据表明这是 SSL 问题。当我从我的应用程序中删除 jaxB 时,它起作用了。
  • 我也关注了github.com/pivotal-cf/cloudfoundry-certificate-truster。它没有解决我的问题。
【解决方案2】:

如果您控制您的 CloudFoundry 平台,那么您可以使用以下方法::

1) 通过 PCF 的操作管理器或通过 bosh http://bosh.io/docs/trusted-certs.html 添加证书

2) 配置 buildpack 以使用自定义证书信任库。

cf set-env app JBP_CONFIG_CONTAINER_CERTIFICATE_TRUST_STORE ‘{enabled: true}’

链接:

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

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

【讨论】:

    【解决方案3】:

    首先,您必须为下载的证书创建 jks 文件。您可以从 JDK bin 中找到 keytool。

    keytool -importcert -file "your.cer" -keystore your.jks -alias "testAlias"

    将 your.jks 文件添加为 spring-boot 项目中的资源。

    使用 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)

    【讨论】:

    • 我将 .crt 保存为带有命令提示符的 .jks。在我的 app.properties 文件中添加了凭据。并创建了一个类来加载 ssl 信任库。从您提供的链接中按照您的示例进行操作。但我仍然收到同样的错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2017-07-27
    • 1970-01-01
    相关资源
    最近更新 更多