java.security.cert.CertificateException: данные сертификата не могут быть обработаны

Мне нужна помощь для исправления исключения сертификата в моем проекте. Я получаю java.security.cert.Certificate Exception: данные сертификата не могут быть обработаны. Ниже приведены сведения об окружении для клиентского приложения:

  • Мое клиентское приложение развернуто на IBM WebsphereApplicationServer(WAS)6.0
  • Использует IBM JDK 1.4.2, встроенный в WAS 6.0

Сторонний поставщик веб-сервисов недавно обновился до SHA-256. С вышеупомянутой настройкой клиента я получаю исключение Рукопожатия. Мы попытались использовать банку Bouncy Castle для поддержки SHA-256. После этого я вижу ниже исключение при совершении вызова Webservice:

 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) 

Хранилище ключей и доверенных сертификатов у меня из версии 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.

  • Попытка добавления сторонних серверных сертификатов в мое хранилище доверенных сертификатов (cacerts) с помощью keytool. Это тоже не сработало.

  • Также попытался использовать DummyClientKeyFile.jks и DummyClientTrustFile.jks в качестве файлов хранилища ключей и доверенных сертификатов соответственно вместо кодеров JDK, но тщетно.

Я застрял в этой проблеме более двух недель. Любая помощь приветствуется.

1 ответ

IBM 1.4.2 JVM не поддерживает сертификаты, подписанные шифром SHA256. Я поднял PMR, чтобы подтвердить это, когда мы столкнулись с этой проблемой, и ответ был:

"Вам нужно будет вернуться к использованию более старых стилей шифров или обновлению. Мы начали поддерживать SHA 256 начиная с Java 1.5 и выше. Невозможно выполнить резервное копирование функции".

Если вы обнаружите упоминания о Java 1.4.2, поддерживающем такие сертификаты, проверьте, к какой JVM поставщика это относится - скорее всего, к Oracle, поскольку их 1.4.2 JVM поддерживает подписанные сертификаты SHA256.

Обновить

Ваши варианты решения этой проблемы:

  1. обновить до 1.5 IBM 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 предполагает, что брандмауэр делает это прозрачно.
Другие вопросы по тегам