2015-11-23 1 views
1

Мне дали 3 файла: MY.cer, MY.key, B.pem (root, промежуточные сертификаты). Использование OpenSSL я получаю успешное соединение:Сертификаты и ключи работают с openssl; почему они не работают с JSSE в jks keystores?

openssl s_client -connect abc.com:10101 -cert MY.cer -key MY.key, -CAfile B.pem 

Использование OpenSSL, мы в комплекте MY.cer и MY.key (PKCS12) и используя Keytool импортировали пары в keystore.jks затем ввозимые B.pem в truststore.jks. Наш объект Java SSLConnector (который мы используем здесь повсюду) barfs:

main, READ: TLSv1 Alert, length = 2 
main, RECV TLSv1 ALERT: fatal, bad_certificate 
%% Invalidated: [Session-1, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA] 
main, called closeSocket() 
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate 
main, called close() 
main, called closeInternal(true) 
javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate 
     at sun.security.ssl.Alerts.getSSLException(Unknown Source) 
     at sun.security.ssl.Alerts.getSSLException(Unknown Source) 
     at sun.security.ssl.SSLSocketImpl.recvAlert(Unknown Source) 
     at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source) 
     at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) 
     at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
     at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
     at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source) 
     at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source) 
     at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source) 
     at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source) 
     at com.dam.system.SSLConnector.sendPost(SSLConnector.java:132) 

SSLConnector использует HttpsURLConnection и с сервером этого нового клиента, мы видим эту ошибку в первый раз.

Мы рассмотрели отладку openssl debug, javax.ssl debug, широко развернутую по ссылке, попробовали portecle и InstallCert.java (которые оба отображают bad_certificate) без разрешения.

Какие причины может иметь сервер для того, чтобы считать наши сертификаты плохой из JSSE, но не плохо от openssl?

+1

Вы проверили с помощью «keytool -list», что оба промежуточных и корневых CA были импортированы в truststore.jks? Вы должны разделить B.pem на отдельные файлы, по одному для каждого сертификата CA, а затем импортировать их по одному в доверительный магазин. – Omikron

+0

Да, они оба там, но я попробую рассказать сегодня вечером - спасибо! – belwood

+0

Я только что заметил в другом tuststore.jks, используя kse, что сертификаты находятся в цепочке, но они не в наших проблемах с хранилищами ключей. Я попрошу кого-нибудь исправить это и посмотреть, что произойдет. – zhaopian

ответ

1

Проблема полностью в том, как были созданы хранилища ключей.

  1. Список вместо цепи: Клиент и его корень и intermiedate сертификаты CA (из файла B.pem) были импортированы в keystore.jks отдельно (появился в списке), а прилагаемый друг к другу в ЦЕЛУ. Мы использовали kse v5.1.1 для удаления сертификатов CA, затем отредактировали цепочку и добавили ее обратно.

  2. Отсутствуют сертификаты сервера. У truststore.jks были сертификаты CA вместо сервера. Используется openssl для получения сертификатов сервера и keytool для создания нового truststore.jks.

Все работает безупречно без изменения кода Java.

 Смежные вопросы

  • Нет связанных вопросов^_^