Como especificar o ciphersuite a ser usado na sessão SSL
Eu criei um soquete na porta 443 como na linha a seguir:
socket = (SSLSocket) factory.createSocket(hostName, port);
Então, eu queria ver os ciphersuites habilitados neste socket, eu usei:
String[] enCiphersuite=socket.getEnabledCipherSuites();
System.out.println("Enabled ciphersuites are: "+Arrays.toString(enCiphersuite));
Então, eu quero escolher apenas um ciphersuite que eu quero que meu aplicativo use ao criar o handshake com o servidor remoto. Eu fiz o seguinte:
String pickedCipher[] ={"TLS_RSA_WITH_AES_128_CBC_SHA"};
socket.setEnabledCipherSuites(pickedCipher);
System.out.println("ciphersuite set to: "+Arrays.toString(pickedCipher));
Então fiz o aperto de mão e verifiquei o ciphersuite da sessão:
socket.startHandshake();
System.out.println("Session ciphersuite is"+socket.getSession().getCipherSuite() );
Mas eu achei que o nome da cifra impressa na declaração de impressão anterior após o aperto de mão (como eu entendo, esta é a cifra realmente usada na sessão) não é o que eu defini anteriormente usandosetEnabledCipherSuites()
Por que eu ainda não estou vendo o meu ciphersuite escolhido é o usado? e também, eu também tenteigetEnabledCipherSuites()
e imprimi-lo depois que eusetEnabledCipherSuites
e encontrou a lista não mudou para o que eu defini. Eu não tenho certeza quando eu imprimir o ciphersuite habilitado, esta lista de ciphersuites depende de Java e sempre a mesma lista, ou depende do cliente ou do servidor? Qualquer corpo pode explicar?
EDITAR: Antes do aperto de mão, só tenho as seguintes linhas:
SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory();
SSLSocket socket=null;
try {
socket = (SSLSocket) factory.createSocket(hostName, port);
socket.setSoTimeout(15000);
socket.startHandshake(); //handshake
.
.