Как указать 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()
, рукопожатие уже было сделано, когда вы пытаетесь установить включенные наборы шифров, поэтому набор шифров этого сеанса имеет уже отобраны.