Comment spécifier la ciphersuite à être utilisés dans la session SSL

J'ai créé un socket sur le port 443 comme dans la ligne suivante:

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

Puis, je voulais voir le permis ciphersuites dans cette prise, j'ai utilisé:

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

Alors, je veux choisir un seul ciphersuite que je veux que mon application à utiliser lors de la création de poignée de main avec le serveur distant. J'ai fait la suivante:

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

Puis j'ai fait la poignée de main, et vérifié la session ciphersuite:

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

Mais j'ai trouvé que le nom de la clef de chiffrement imprimé dans le précédent imprimé de déclaration après la poignée de main (ce que je comprends, c'est le fait de chiffrement utilisé dans la session) n'est pas ce que j'ai mis plus tôt à l'aide de setEnabledCipherSuites()

Pourquoi suis-je toujours pas voir mon choisi ciphersuite est utilisé ? et aussi, j'ai aussi essayé de getEnabledCipherSuites() et l'imprimer après je setEnabledCipherSuites et trouvé la liste n'a pas changé à ce que j'ai mis. Je ne suis pas sûr que lorsque j'imprime le permis ciphersuite, est cette liste de ciphersuites dépend de Java et toujours la même liste, ou dépend du client ou sur le serveur? Tout organisme peut expliquer ?

EDIT:
Avant la poignée de main que je n'ai que les lignes suivantes:

SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory(); 
SSLSocket socket=null;
try {
socket = (SSLSocket) factory.createSocket(hostName, port);
socket.setSoTimeout(15000); 
socket.startHandshake(); //handshake
.
.
C'est la suite de chiffrement des options telles que l'algorithme de chiffrement symétrique.
Je sais ce que un de la suite de chiffrement est. Je vous ai demandé ce que de la suite de chiffrement est. Celui qui a effectivement été négocié. J'ai aussi demandé pourquoi vous pensez que vous avez besoin pour ce faire.
C'est pour les tests & des fins d'illustration dans un jouet application java. Le problème que j'ai décrit, en général, ne sont pas inclus pour un ciphersuite. Ex: Quand j'essaie de me connecter à hotmail.com la session ciphersuite est: TLS_RSA_WITH_AES_128_CBC_SHA. quand j'ai essayer de le modifier à partir de mon application Java à autre chose, de dire: TLS_ECDHE_RSA_WITH_RC4_128_SHA, et essayez de vous connecter, de nouveau, choisi la ciphersuite pour theis session SSL est: TLS_RSA_WITH_AES_128_CBC_SHA. Autant je comprends que setEnableCiphersuite() va utiliser la ciphersuite que j'ai défini. Ce n'est pas de travailler avec moi (plusieurs exemples).
Est-il rien d'autre dans votre code, avant d'appeler startHandshake() explicitement? Avez-vous un appel à getSession() ou êtes-vous essayer de lire/écrire à l'aide du flux e/S? (Un de ces serait de lancer la poignée de main, peut-être avant que vous faites l'appel à setEnabledCipherSuites(...)).
J'ai édité mon post et ajouté quelques lignes avant la poignée de main. Il n'y a pas de getsession() avant la poignée de main. Seulement après l'impression de la sesison ciphersuite. Après la poignée de main, j'appelle: socket.getInetAddress(); obtenir l'adresse IP. Alors, j'appelle: socket.getSession().getCipherSuite(); pour obtenir de la session, de la suite de chiffrement.

OriginalL'auteur user1810868 | 2012-12-18