【问题标题】:HANDSHAKE_FAILURE alert received收到 HANDSHAKE_FAILURE 警报
【发布时间】:2011-10-29 21:18:33
【问题描述】:

我正在编写一个 Java 客户端(在 weblogic 10.3 上)来调用一个安全的 Web 服务。 我已经获得了一个客户端证书,我安装在 cacerts、DemoIdentity.jks 和 DemoTrust,jks 中 在我的 weblogic 中,我将密钥库设置为 DemoIdentity 和 DemoTrust。 在 weblogic 控制台中我设置了 “双向客户端证书行为:”为“请求但未强制执行的客户端证书”。 对于“启用 SSL 侦听端口:”我已选中复选框。

我在尝试访问 Web 服务时遇到以下异常:

] FaultActor [null] Detail [<detail><bea_fault:stacktrace xmlns:bea_fault="http:
//www.bea.com/servers/wls70/webservice/fault/1.0.0">javax.net.ssl.SSLHandshakeEx
ception: [Security:090497]HANDSHAKE_FAILURE alert received from ************** Check both sides of the SSL configuration for mismatches in supported ciphers, supported protocol versions, trusted CAs, and hos
tname verification settings.
        at com.certicom.tls.interfaceimpl.TLSConnectionImpl.fireException(Unknow
n Source)
        at com.certicom.tls.interfaceimpl.TLSConnectionImpl.fireAlertReceived(Un
known Source)
        at com.certicom.tls.record.alert.AlertHandler.handle(Unknown Source)
        at com.certicom.tls.record.alert.AlertHandler.handleAlertMessages(Unknow
n Source)
        at com.certicom.tls.record.MessageInterpreter.interpretContent(Unknown S
ource)
        at com.certicom.tls.record.MessageInterpreter.decryptMessage(Unknown Sou
rce)
        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(Unknow
n Source)
        at com.certicom.tls.interfaceimpl.TLSConnectionImpl.completeHandshake(Un
known 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:65
)
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
        at java.io.FilterOutputStream.flush(FilterOutputStream.java:123)
        at weblogic.net.http.HttpURLConnection.writeRequests(HttpURLConnection.j
ava:158)
        at weblogic.net.http.HttpURLConnection.getInputStream(HttpURLConnection.
java:363)
        at weblogic.net.http.SOAPHttpsURLConnection.getInputStream(SOAPHttpsURLC
onnection.java:37)
        at weblogic.wsee.connection.transport.TransportUtil.getInputStream(Trans
portUtil.java:85)
        at weblogic.wsee.connection.transport.http.HTTPClientTransport.receive(H
TTPClientTransport.java:271)
        at weblogic.wsee.connection.soap.SoapConnection.receive(SoapConnection.j
ava:485)
        at weblogic.wsee.ws.dispatch.client.ConnectionHandler.handleResponse(Con
nectionHandler.java:179)
        at weblogic.wsee.handler.HandlerIterator.handleResponse(HandlerIterator.
java:287)
        at weblogic.wsee.handler.HandlerIterator.handleResponse(HandlerIterator.
java:271)
        at weblogic.wsee.ws.dispatch.client.ClientDispatcher.handleResponse(Clie
ntDispatcher.java:213)
        at weblogic.wsee.ws.dispatch.client.ClientDispatcher.dispatch(ClientDisp
atcher.java:150)
        at weblogic.wsee.ws.WsStub.invoke(WsStub.java:87)
        at weblogic.wsee.jaxrpc.StubImpl._invoke(StubImpl.java:339)
        at sips_cn_contract.PaymentService_Stub.processPaymentWebInit(Unknown So
urce)
        at uk.gov.gateway.payments.SipsStartupController.handleRequest(SipsStart
upController.java:73)
        at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.ha
ndle(SimpleControllerHandlerAdapter.java:45)
        at org.springframework.web.servlet.DispatcherServlet.doService(Dispatche
rServlet.java:485)
        at org.springframework.web.servlet.FrameworkServlet.serviceWrapper(Frame
workServlet.java:342)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServl
et.java:318)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run
(StubSecurityHelper.java:227)
        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecuri
tyHelper.java:125)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.jav
a:300)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.jav
a:183)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationActio
n.doIt(WebAppServletContext.java:3686)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationActio
n.run(WebAppServletContext.java:3650)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(Authenticate
dSubject.java:321)
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:
121)
        at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppS
ervletContext.java:2268)
        at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletC
ontext.java:2174)
        at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.j
ava:1446)
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
</bea_fault:stacktrace></detail>]; nested exception is:

但是在 Firefox 中,我已经添加了证书,当我查看 Web 服务的 wsdl 时,它会提示我证书,在我单击“确定”后,它会呈现 wsdl 文件以用于安全的 Web 服务。 任何人都知道我应该怎么做才能让客户端使用 Java 工作?

【问题讨论】:

    标签: java web-services security sslhandshakeexception


    【解决方案1】:

    您可能没有正确导入您的证书和密钥。您可以通过将以下内容添加到 JUnit 或类似内容来测试您的密钥库:

    static {
            System.setProperty("javax.net.ssl.keyStoreType", "pkcs12"); // or whatever
            System.setProperty("javax.net.ssl.keyStore", "c:/folder/mycert.p12");
            System.setProperty("javax.net.ssl.keyStorePassword", "mypassword");
            System.setProperty("javax.net.debug", "ssl");
    }
    

    javax.net.debug 属性设置为 ssl 将打印您的证书链和所有其他 SSL 日志记录,这会很有帮助。您需要将证书等添加到您的应用程序容器中,就像您已经在生产环境中一样。

    尝试使用 SSL 进行调试,看看会发生什么。您很可能只需要正确配置 weblogic。检查是否有自定义 SSL 端点配置(即当 URI 为 /test/test 时使用 keyStore XYZ)。

    【讨论】:

    • 感谢您的回复。我已经在一个独立的 java 类中单独测试了证书的东西。但是当我在 weblogic 上部署 web 应用程序时,它仍然给了我同样的异常。
    【解决方案2】:

    我认为真正的问题是 Weblogic 没有使用 JDK 提供的标准 Sun HTTPS 实现,而是使用它自己的实现,如这一行所示:

    at weblogic.net.http.SOAPHttpsURLConnection.getInputStream(SOAPHttpsURLConnection.java:37)
    

    标准的 Sun 实现类称为javax.net.ssl.HttpsURLConnection

    因此,Weblogic 内部的证书策略与独立 Java 程序中的证书策略不同。我刚刚发现这个调试了一个类似的问题。

    此页面建议使用 Sun 实现而不是 Weblogic: http://webtech-kapil.blogspot.com/2010/06/javalangclasscastexception.html

    他们建议使用以下标志开始 WL:

    -DUseSunHttpHandler=true

    它将使用标准 Sun 的 SSL 实现。但是,我个人还没有尝试过。

    谢谢,

    伊戈尔

    【讨论】:

    • 我终于用上了这个参数,可以确认它加载了SUN的实现并解决了问题。
    • 你拯救了我的一天。我遇到了类似的错误,这篇文章有助于解决我的问题。
    • 我刚刚登录为您的回答 +1。
    • @yılmaz,感谢!
    猜你喜欢
    • 2012-03-18
    • 2015-12-04
    • 2012-10-15
    • 2018-02-09
    • 2019-01-02
    • 2018-08-10
    • 1970-01-01
    相关资源
    最近更新 更多