[英]how to use TLSV1 or SSLV3 for first handshake(Client Hello) in Java?
當我執行以下代碼時,為什么第一次握手是SSLv2,而不是TLSv1或SSLv3?
如何在Java中使用TLSV1或SSLV3進行首次握手?
String host = "www.google.com";
String url = "/adsense/?sourceid=aso&subid=ZH_CN-ET-AS-ADSBY6&medium=link&hl=zh_CN";
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
SSLContext.setDefault(ctx);
SSLSocketFactory factory = ctx.getSocketFactory();
Socket socket = factory.createSocket(host, 443);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.write("GET " + url + " HTTP/1.0");
out.flush();
out.close();
in.close();
對於TLSv1:使用啟動客戶端jvm
-Dhttps.protocols="TLSv1"
或使用
System.setProperty("https.protocols", "TLSv1");
為我解決了這個問題。
使用SSLSocket
:
SSLSocket socket = factory.createSocket(host, 443);
String[] newProtocols = {"TLSv1"};
socket.setEnabledProtocols(newProtocols);
你使用的是哪個版本的java? 另外你怎么說它使用SSLv2? 默認情況下,java 1.6將使用TLSv1。 這里有一個問題,如果您啟用debug ssl,您可能會看到正在使用SSLv2Hello格式,但如果您仔細查看,記錄層內的'protocol vesion'將是TLSv1(SSLv2格式下的1.e版本信息包裝器)。 使用wireshark的TCP級別數據包捕獲分析應該確認這一點。 如果要以TLSv1格式啟動,只需設置https.protocols = TLSv1(這可能會影響所有傳出的ssl調用)或在上面的特定套接字上設置。 請注意,即使您有五個逗號分隔列表(如https.protocols = SSLv3,TLSv1),它也將以TLSv1開頭。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.