java.security.cert.CertificateException : Certificate data canot be processed

标签 java web-services security ssl ibm-was

我需要一些帮助来修复项目中的证书异常。我收到 java.security.cert.CertificateException: Certificate data canot be processed 以下是客户端应用程序的环境详细信息:

  • 我的客户端应用程序部署在 IBM WebsphereApplicationServer(WAS)6.0 上
  • 使用内置于 WAS 6.0 的 IBM JDK 1.4.2

第 3 方 Web 服务提供商最近已升级到 SHA-256。通过上述客户端设置,我收到握手异常。我们尝试使用 Bouncy CaSTLe jar 来支持 SHA-256。在此之后,我在进行 Web 服务调用时看到以下异常:

 WebContainer : 0, SEND TLSv1 ALERT:  fatal, description = certificate_unknown                               
 WebContainer : 0, WRITE: TLSv1 Alert, length = 2                                                            
 WebContainer : 0, called closeSocket()                                                                      
 WebContainer : 0, handling exception: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Certificate data canot be processed  
 Exception javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Certificate data canot be processed  
 Finalizer, called close()                                                                                   
 Finalizer, called closeInternal(true) 

我拥有的 keystore 和信任库来自默认的 JDK 版本:

keyStore is: /usr/local/opt/was/was60/java/jre/lib/security/cacerts   
keyStore type is : jks                                                
init keystore                                                         
trustStore is: /usr/local/opt/was/was60/java/jre/lib/security/cacerts 
trustStore type is : jks  

这里还有一些日志:

SystemErrR AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
 faultSubcode:
 faultString: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Certificate data canot be processed
 faultActor:
 faultNode:
 faultDetail:
        {http://xml.apache.org/axis/}stackTrace:javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Certificate data canot be processed
        at com.ibm.jsse2.bx.a(bx.java:114)
        at com.ibm.jsse2.by.a(by.java:24)
        at com.ibm.jsse2.by.a(by.java:444)
        at com.ibm.jsse2.w.a(w.java:281)
        at com.ibm.jsse2.w.a(w.java:105)
        at com.ibm.jsse2.v.a(v.java:25)
        at com.ibm.jsse2.by.a(by.java:272)
        at com.ibm.jsse2.by.m(by.java:198)
        at com.ibm.jsse2.by.startHandshake(by.java:68)
        at org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:186)
        at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:191)
        at org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:404)
        at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
        at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
        at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
        at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
        at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
        at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
        at org.apache.axis.client.Call.invoke(Call.java:2767)
        at org.apache.axis.client.Call.invoke(Call.java:2443)
        at org.apache.axis.client.Call.invoke(Call.java:2366)
        at org.apache.axis.client.Call.invoke(Call.java:1812)
        at com.cingular.csi.CSI.Namespaces.v94.wsdl.CingularWirelessCSI_wsdl.InquireWirelineServiceAppointmentReservationsSoapHttpBindingStub.inquireWireline

最后,还有几点需要注意:

  • WAS 和 JDK 都无法升级,应用稳定。

  • 使用的 SocketFactory 是:com.ibm.jsse2.SSLSocketFactoryImpl

  • 尝试了 javax.net.SSLSocketFactoryImpl。它在 SocketContext 本身失败。

  • 尝试使用 key 工具将第三方服务器证书添加到我的信任库 (cacerts)。也没用。

  • 还尝试分别使用 DummyClientKeyFile.jks 和 DummyClientTrustFile.jks 作为 Keystore 和 truststore 文件,而不是 JDK 的 cacerts,但没有成功。

两周多以来我一直被这个问题困扰着。感谢任何帮助。

最佳答案

IBM 的 1.4.2 JVM 不支持使用 SHA256 密码签名的证书。当我们遇到这个问题时,我提出了一个 PMR 来确认这一点,回复是:

"You will need to revert to using older style ciphers or upgrade. We began supporting SHA 256 from Java 1.5 onward. It's not possible to back port the function."

如果您发现提到 Java 1.4.2 支持此类证书,请检查这与哪个供应商的 JVM 有关 - 可能是 Oracle,因为他们的 1.4.2 JVM 确实支持 SHA256 签名证书。

更新

解决此问题的选项是:

  1. 升级到 IBM 的 1.5 JVM(或更好!)。如果您使用 Java 1.4.2 作为 IBM 产品的一部分,例如WebSphere Application Server (v6) 那么您也需要对其进行升级。
  2. 如果您不依赖 IBM 但必须使用 1.4.2,请尝试 Oracle 的 1.4.2 JVM
  3. 使用正向代理。这里涉及到连接代理,代理 终止 SSL 连接然后打开第二个连接 到最终目的地。代理成为中间人,所以 这里有一些安全问题需要考虑(例如 PCI DSS 合规性 如果您要发送支付卡数据)。
  4. #3 的变体涉及让防火墙透明地执行此操作。

关于java.security.cert.CertificateException : Certificate data canot be processed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31085565/

相关文章:

Java代码运行时生成和执行,java.lang.NoClassDefFoundError

java - 检查 REST 方法中是否存在 JSON Key

Java调用同一父类的子构造函数

java - 需要设计模式

iphone - ipad锁定: launch app on boot?

ios - iOS安全异常(exception)(-9813)仅来自翠鸟库的调用

java - 测试 REST Web 服务时出现空指针异常

java - 在 JSP 中显示响应代码消息

web-services - SOAPHandler 中的 JAX-WS handleMessage 未被调用

python - 如何在 Python 中生成加密安全的字母数字字符串?