#java #security #encryption #httpclient #jce
#java #Безопасность #шифрование #httpclient #jce
Вопрос:
Я использую HttpClient 4 для ПОЛУЧЕНИЯ URL-адреса https. Сервер имеет действительные сертификаты, и фактически доступ к тому же URL-адресу https из Chrome работает нормально без предупреждений.
Однако из кода Java при выполнении я получаю:
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:352)
Один и тот же код отлично работает с одной ссылкой https, а не с другой. Основное различие, которое я вижу между рабочим и нерабочим сертификатом, заключается в следующем:
В рабочем используется RC4_128
Тот, который выдает исключение, использует CAMELLIA 256 CBC
Затем я узнал, что Java не поддерживает Camellia. см. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6537034 и http://en.wikipedia.org/wiki/Comparison_of_TLS_Implementations#Encryption_Algorithms
Как я могу добавить эту поддержку в свой код HttpClient?
Я добавил библиотеку BouncyCastle и поставщика безопасности
static {
Security.addProvider(new BouncyCastleProvider());
}
Предположительно, это добавляет поддержку Camellia.
Но все равно не повезло.
Комментарии:
1. Это не имеет ничего общего с Camellia или RC4.
2. Привет, Грег, так каков же твой диагноз?
3. Я предполагаю, что ваше хранилище доверия не содержит сертификата CA для CA, который подписал сертификат этого SSL-сервера.
4. Сертификаты не используют симметричное шифрование. SSL / TLS обеспечивает безопасность транспорта. Сертификаты проходят проверку подлинности до настройки защищенного канала, поэтому я думаю, что GregS прав.
5. Поставщик услуг изменил шифрование с Camellia на AES, и тот же фрагмент кода работал идеально. Поэтому я не уверен, почему шифрование Camellia не работает с кодом Java.