2015-03-12 2 views
0

Наш сервер только что это шифры, ограниченные:Как настроить набор шифров в java/eclipse для http-клиента?

SSLCipherSpec ВСЕ TLS_RSA_WITH_AES_128_GCM_SHA256 TLS_RSA_WITH_AES_256_GCM_SHA384

И теперь мой тестовый код Java клиент не с этим сообщением в журнале сервера:

SSL рукопожатия Failed, нет шифры указано

и этот трассировки стека на стороне клиента:

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
    at com.ibm.jsse2.j.a(j.java:42) 
    at com.ibm.jsse2.j.a(j.java:41) 
    at com.ibm.jsse2.qc.b(qc.java:485) 
    at com.ibm.jsse2.qc.a(qc.java:381) 
    at com.ibm.jsse2.qc.h(qc.java:453) 
    at com.ibm.jsse2.qc.a(qc.java:625) 
    at com.ibm.jsse2.qc.startHandshake(qc.java:113) 
    at com.ibm.net.ssl.www2.protocol.https.c.afterConnect(c.java:188) 
    at com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:9) 
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1103) 
    at com.ibm.net.ssl.www2.protocol.https.b.getOutputStream(b.java:84) 

Может ли кто-нибудь посоветовать, что мне нужно настроить в моем HttpURLConnection, чтобы заставить его использовать эти ограниченные комплекты шифров? Или это то, что мне нужно настроить в аргументах JVM (в Eclipse)?

Большое спасибо

+0

Вам не нужно ничего делать. Пока клиент поддерживает этот набор шифров, сервер его выбирает. Вам не нужно ограничивать его с обоих концов. Сервер решает. Похоже, что ваш сервер настроен неправильно. – EJP

ответ

2

Вы явно используете IBM JSSE. . По its documentation (see Customizing JSSE -> Customization), это можно сделать, установив свойство https.cipherSuites системы:

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

Это, конечно, exactly the same parameter as for the Sun/Oracle JSSE. (Вы можете также найти https.protocols полезно, если вам нужно установить протокол тоже.)

Если вы хотите, чтобы достичь этого на основе каждого соединения, вы можете передавать определенные параметры в HttpsURLConnection с помощью пользовательской SSLSocketFactory. Как правило, вы можете реализовать свой собственный SSLSocketFactory, что делегаты всех вызовов по умолчанию SSLSocketFactory (SSLSocketFactory.getDefault()), или SSLSocketFactory наступающим из обычая SSLContext, но изменяет SSLSocket созданных любого createSocket(...) способом изменения установить его шифры. Что-то вдоль этих линий:

class MySSLSocketFactory { 
    public Socket createSocket(...) { 
     SSLSocket s = (SSLSocket) SSLSocketFactory.getDefault().createSocket(...); 
     s.setEnabledCipherSuites(...); 
     return s; 
    } 
    ... 
} 

Тогда:

URLConnection urlConnection = url.openConnection(); 
HttpsURLConnection httpsUrlConnection = (HttpsURLConnection) urlConnection; 
httpsUrlConnection.setSSLSocketFactory(new MySSLSocketFactory()); 

Тем не менее, эти два шифров, которые вы пытаетесь использовать (TLS_RSA_WITH_AES_128_GCM_SHA256 и TLS_RSA_WITH_AES_256_GCM_SHA384) только были поддержаны в Oracle JRE since Java 8, но по умолчанию они уже включены по умолчанию, поэтому вам не нужна никакая настройка.

В той же таблице для IBM® SDK, Java™ Technology Edition, Version 8 есть только столбцы до версии 7, и эти комплекты шифров вообще не указаны. Я не уверен, что это только часть документации, которая не была обновлена, или IBM JSSE не поддерживает эти шифровые комплекты, даже в версии 8.

+0

большое спасибо за этот ответ Бруно, я надеюсь, что в ближайшее время попробую ваши предложения и обновится. – IainS

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