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.5 IBM JVM (или лучше!). Если вы используете Java 1.4.2 как часть продукта IBM, например, WebSphere Application Server (v6), вам также потребуется обновить его.
- если вы не связаны с IBM, но должны быть на 1.4.2, попробуйте Oracle 1.4.2 JVM
- используйте прямое проксирование. Это включает в себя подключение к прокси-серверу, когда прокси-сервер завершает соединение SSL, а затем открывает второе соединение с конечным пунктом назначения. Прокси-сервер становится посредником, поэтому здесь необходимо учитывать проблемы безопасности (например, соответствие PCI DSS при отправке данных платежной карты).
- Вариант № 3 предполагает, что брандмауэр делает это прозрачно.