【问题标题】:Jersey + Weblogic - javax.net.ssl.SSLKeyException: FATAL Alert:BAD_CERTIFICATEJersey + Weblogic - javax.net.ssl.SSLKeyException:致命警报:BAD_CERTIFICATE
【发布时间】:2014-01-21 08:27:06
【问题描述】:

我整天坐在一个问题上并放弃。我编写了一个球衣客户端,它适用于 Jetty,而 不适用于 Weblogic。原因可能隐藏在证书中:CN = "*.somecompany.com"。 Weblogic 不喜欢 CN 中的通配符。有人对此有有效的解决方案吗?

我将这些添加到 Weblogic 启动参数,但 Weblogic 使用许多其他客户端,所以 我不想添加这些参数:ignoreHostnameVerification: -

-Dssl.debug=true -Dweblogic.security.SSL.ignoreHostnameVerification=true 
-Dweblogic.security.SSL.enforceConstraints=off 
-Dweblogic.nodemanager.sslHostNameVerificationEnabled=false
-Dweblogic.security.SSL.allowSmallRSAExponent=true
-Dweblogic.security.SSL.ignoreHostnameVerification=true

我还使用 webbrowser 访问了 REST 服务并将证书下载到磁盘,然后使用 keytool 将其添加到信任库。它仍然无法正常工作。

唯一也是最好的方法是编写一些自定义来验证主机名?也许这个通配符是个问题.. 但我是新手,不知道怎么写,一个工作示例将不胜感激,我自己无法做到:/

以下是我发现的异常(不确定哪些存在以及何时出现,但仍然无法正常工作)我试图通过以下方式修复它:

1) 将整个证书链导入信任库(Java 和 Weblogic 信任库)

2)给Weblogic添加启动参数,但不是很好的解决方案

com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLKeyException: FATAL 
Alert:BAD_CERTIFICATE - A corrupt or unuseable certificate was received.
com.sun.jersey.api.client.ClientHandlerException: 
javax.net.ssl.SSLKeyException: FATAL Alert:BAD_CERTIFICATE - A corrupt 
or unuseable certificate was received.
         at 
    com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHa    ndler.java:131)
         at com.sun.jersey.api.client.Client.handle(Client.java:629)
     at 
com.sun.jersey.api.client.WebResource.handle(WebResource.java:601)
     at 
com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
     at 
com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:507)
     at 

第二

with Severity: FATAL, Type: 42
java.lang.Exception: New alert stack
    at com.certicom.tls.record.alert.Alert.<init>(Unknown Source)
    at         com.certicom.tls.record.handshake.HandshakeHandler.handleHandshakeMessages(Unknown Source)
    at com.certicom.tls.record.MessageInterpreter.interpretContent(Unknown Source)
    at com.certicom.tls.record.MessageInterpreter.decryptMessage(Unknown Source)
    at com.certicom.tls.record.ReadHandler.processRecord(Unknown Source)
    at com.certicom.tls.record.ReadHandler.readRecord(Unknown Source)
    at com.certicom.tls.record.ReadHandler.readUntilHandshakeComplete(Unknown Source)
    at com.certicom.tls.interfaceimpl.TLSConnectionImpl.completeHandshake(Unknown     Source)
    at com.certicom.tls.record.WriteHandler.write(Unknown Source)
    at com.certicom.io.OutputSSLIOStreamWrapper.write(Unknown Source)
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
    at java.io.FilterOutputStream.flush(FilterOutputStream.java:140)
    at weblogic.net.http.HttpURLConnection.writeRequests(HttpURLConnection.java:154)
    at weblogic.net.http.HttpURLConnection.getInputStream(HttpURLConnection.java:358)
    at     weblogic.net.http.SOAPHttpsURLConnection.getInputStream(SOAPHttpsURLConnection.java:37)
    at weblogic.net.http.HttpURLConnection.getHeaderField(HttpURLConnection.java:702)
    at weblogic.net.http.HttpURLConnection.getResponseCode(HttpURLConnection.java:962)
    at      com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:217)
    at     com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:129)
    at com.sun.jersey.api.client.Client.handle(Client.java:629)
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:601)
    at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
    at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:507)
    at  

第三

 E7C0E2529308F> <> <1387573464164> <BEA-000000> <Failure loading trusted CA list
java.security.cert.CertificateParsingException: Could not set value for ASN.1     string     object.
    at com.certicom.security.cert.internal.x509.X509V3CertImpl.<init>(Unknown Source)
    at com.certicom.tls.interfaceimpl.CertificateSupport.addTrustedCertificate(Unknown      Source)
    at com.certicom.net.ssl.SSLContext.addTrustedCertificate(Unknown Source)
    at com.bea.sslplus.CerticomSSLContext.addTrustedCA(Unknown Source)
    at weblogic.security.utils.SSLContextWrapper.addTrustedCA(SSLContextWrapper.java:62)
    at weblogic.security.utils.SSLSetup.getSSLContext(SSLSetup.java:320)
    at weblogic.net.http.HttpsClient.openServer(HttpsClient.java:334)
    at weblogic.net.http.HttpsClient.New(HttpsClient.java:566)
    at weblogic.net.http.HttpsURLConnection.getHttpClient(HttpsURLConnection.java:339)
    at weblogic.net.http.HttpURLConnection.getInputStream(HttpURLConnection.java:408)
    at weblogic.net.http.SOAPHttpsURLConnection.getInputStream(SOAPHttpsURLConnection.java:37)
    at weblogic.net.http.HttpURLConnection.getHeaderField(HttpURLConnection.java:702)
    at weblogic.net.http.HttpURLConnection.getResponseCode(HttpURLConnection.java:962)
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:217)
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:129)
    at com.sun.jersey.api.client.Client.handle(Client.java:629)
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:601)
    at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
    at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:507)
    at 

【问题讨论】:

  • 听起来您的信任库很糟糕。你在设置"-Dweblogic.security.SSL.trustedCAKeyStore 吗?参考这里:docs.oracle.com/cd/E11035_01/wls100/secmanage/…
  • 不,我没有设置它,应该吗?如果我错了,请纠正我,但我认为不是。在 weblogic 控制台上,我看到选择了 DemoTrust.jks。在这个 jks 里面都是已知的 CA。我可能已经在具有 CN="*.somcompany.com" 的链中导入了最后一个证书,并且我知道 Weblogic 不支持证书中的通配符 - 这就是发生此错误的原因:ava.security.cert.CertificateParsingException:无法设置值对于 ASN.1。除了基于 CXF 和使用其他证书的 web 服务 - 没有通配符的情况下使用 ssl。错误并不表示证书不受信任,但它很糟糕
  • 尝试开启环境 > 服务器 > [我的服务器] > SSL > 高级 > 按照stackoverflow.com/questions/27928157/…使用 JSSE SSL

标签: jersey weblogic


【解决方案1】:

尝试将站点证书添加到您的 weblogic 信任库,然后在您的 weblogic 启动中添加以下参数

-DUseSunHttpHandler=true
-Dssl.SocketFactory.provider=sun.security.ssl.SSLSocketFactoryImpl 
-Dssl.ServerSocketFactory.provider=sun.security.ssl.SSLSocketFactoryImpl

我遇到了像你这样的问题,通过这篇文章我解决了 Cannot access HTTPS from Weblogic

【讨论】:

    【解决方案2】:

    通过在 JVM 参数中添加这些条目来解决问题

    "-Dweblogic.security.SSL.nojce=true"
    "-Dweblogic.ssl.JSSEEnabled=true"
    "-Dweblogic.security.SSL.enableJSSE=true"
    

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    猜你喜欢
    • 2015-04-01
    • 2023-04-07
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    相关资源
    最近更新 更多