CertificateException с async-http-client для https

У меня начались проблемы с доступом к https://ws.plimus.com/ с помощью https://github.com/AsyncHttpClient/async-http-client несколько дней назад. Я получаю сообщение "Общая проблема SSLEngine", и в трассировке стека я вижу, что это вызвано

java.security.cert.CertificateException: Certificates does not conform to algorithm constraints

Этот вопрос SO описывает в основном то же самое. Комментирование строки в java.security устраняет ошибку, но я предполагаю, что для отключения MD2 есть веская причина.

Используя ответ Рамана для подсказок, я обнаружил, что действительно библиотека async-http-client использует интерфейс X509TrustManager a>, но я мало что могу сделать, чтобы это изменить.

Запускаем это:

openssl s_client -showcerts -connect ws.plimus.com:443 | grep -i md2

ничего не находит, поэтому я даже не знаю, какой сертификат вызывает проблему.

Могу ли я что-то сделать, кроме обходного пути?

Я поместил демонстрационный код, который воспроизводит проблему на github.


person itsadok    schedule 08.01.2014    source источник


Ответы (1)


Указанный вами сервер действительно использует тот же сертификат Verisign Class 3 с алгоритмом md2WithRSAEncryption, который я описал в моем другом ответе:

openssl s_client -showcerts -no_ign_eof -connect ws.plimus.com:443
CONNECTED(00000003)
... [ stripped ] ...
 3 s:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
   i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
-----BEGIN CERTIFICATE-----
MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
-----END CERTIFICATE-----

а затем преобразовать этот сертификат в текстовую форму:

openssl x509 -text -noout < cert.pem
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            70:ba:e4:1d:10:d9:29:34:b6:38:ca:7b:03:cc:ba:bf
    Signature Algorithm: md2WithRSAEncryption
        Issuer: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority
        Validity
            Not Before: Jan 29 00:00:00 1996 GMT
            Not After : Aug  1 23:59:59 2028 GMT
        Subject: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority
... [ stripped ] ...

Просматривая javadocs для async-http-client, похоже, что вы можете вызвать setSSLContext при создании экземпляра AsyncHttpClientConfig:

Таким образом, вы можете создать свой собственный SSLContext с X509ExtendedTrustManager и настроить клиентскую библиотеку async http для его использования вместо внутреннего значения по умолчанию. Это должно решить вашу проблему!

Вот Gist, который содержит тестовый код SSL, который я использовал для отладки этой проблемы. Вы можете легко извлечь из этого то, что вам нужно, чтобы создать свой собственный SSLContext: https://gist.github.com/rocketraman/8312705.

person Raman    schedule 08.01.2014