簡體   English   中英

如何在Java中使用TLSV1或SSLV3進行第一次握手(Client Hello)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM