Как указать ciphersuite для использования в сеансе SSL

Я создал сокет на порт 443, как в следующей строке:

socket = (SSLSocket) factory.createSocket(hostName, port);

затем я хотел увидеть включенные шифры в этом сокете, я использовал:

String[] enCiphersuite=socket.getEnabledCipherSuites();
System.out.println("Enabled ciphersuites are: "+Arrays.toString(enCiphersuite));

затем я хочу выбрать только один ciphersuite, который я хочу, чтобы мое приложение использовало при создании рукопожатия с удаленным сервером. Я сделал следующее:--9-->

String pickedCipher[] ={"TLS_RSA_WITH_AES_128_CBC_SHA"}; 
socket.setEnabledCipherSuites(pickedCipher);
System.out.println("ciphersuite set to: "+Arrays.toString(pickedCipher));

затем я сделал рукопожатие и проверил сеанс ciphersuite:

socket.startHandshake();
System.out.println("Session ciphersuite is"+socket.getSession().getCipherSuite() );

но я обнаружил, что имя шифр, напечатанный в предыдущем операторе распечатки после рукопожатия (как я понимаю, это фактически используемый шифр в сеансе), не является тем, что я установил ранее, используя setEnabledCipherSuites()

почему я до сих пор не вижу, что мой выбранный ciphersuite используется? а также, я также пытался getEnabledCipherSuites() и распечатайте его после I setEnabledCipherSuites и обнаружил, что список не изменился на то, что я установил. Я не уверен, когда я печатаю enabled ciphersuite, этот список ciphersuites зависит от Java и всегда один и тот же список, или зависит от клиента или от сервера? Кто-нибудь может объяснить ?

EDIT: Перед рукопожатием у меня только следующие строки:

SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory(); 
SSLSocket socket=null;
try {
socket = (SSLSocket) factory.createSocket(hostName, port);
socket.setSoTimeout(15000); 
socket.startHandshake(); //handshake
.
.

1 ответов


я узнал, что я добавил розетку.метода getsession() перед setEnableCipherSuite() для того, чтобы распечатать включена cipheres прежде чем устанавливать их. Когда я удалил его, шифр был установлен. почему? это так ?

как описано в SSLSocket JavaDoc:

начальное рукопожатие на этом соединении можно начать в одном из три способа:--5-->

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

если вы называете getSession() перед вызовом setEnabledCipherSuite(), рукопожатие уже было сделано, когда вы пытаетесь установить включенные наборы шифров, поэтому набор шифров этого сеанса имеет уже отобраны.