Как указать шифр, который будет использоваться в сеансе SSL
Я создал сокет на порту 443, как показано в следующей строке:
socket = (SSLSocket) factory.createSocket(hostName, port);
Затем я хотел увидеть включенные наборы шифров в этом сокете, я использовал:
String[] enCiphersuite=socket.getEnabledCipherSuites();
System.out.println("Enabled ciphersuites are: "+Arrays.toString(enCiphersuite));
Затем я хочу выбрать только один набор шифров, который будет использоваться моим приложением при создании рукопожатия с удаленным сервером. Я сделал следующее:
String pickedCipher[] ={"TLS_RSA_WITH_AES_128_CBC_SHA"};
socket.setEnabledCipherSuites(pickedCipher);
System.out.println("ciphersuite set to: "+Arrays.toString(pickedCipher));
Затем я сделал рукопожатие и проверил шифр сеанса:
socket.startHandshake();
System.out.println("Session ciphersuite is"+socket.getSession().getCipherSuite() );
Но я обнаружил, что имя шифра, напечатанного в предыдущем операторе печати после рукопожатия (как я понимаю, это фактически используемый шифр в сеансе), не то, что я установил ранее, используяsetEnabledCipherSuites()
Почему я до сих пор не вижу, что выбранный мной шифр является использованным? а также я тоже пыталсяgetEnabledCipherSuites()
и распечатать его после того, как яsetEnabledCipherSuites
и нашел список не изменился на то, что я установил. Я не уверен, когда я печатаю включенный набор шифров, этот список наборов шифров зависит от Java и всегда один и тот же список или зависит от клиента или от сервера? Может ли тело объяснить?
РЕДАКТИРОВАТЬ: До рукопожатия у меня есть только следующие строки:
SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory();
SSLSocket socket=null;
try {
socket = (SSLSocket) factory.createSocket(hostName, port);
socket.setSoTimeout(15000);
socket.startHandshake(); //handshake
.
.