Как указать шифр, который будет использоваться в сеансе 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
.
.

Ответы на вопрос(1)

Ваш ответ на вопрос