[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[备忘]java调用https指定协议tlsv1.2

上一篇:[备忘]java中System.setProperty()的作用范围。
下一篇:[备忘]内存占用很高,paged pool和nonpaged pool引起的内存飙升

添加日期:2023/3/24 16:29:45 快速返回   返回列表 阅读253次
(1)直接指定SSLSocket,只影响这一个连接。


SSLSocketFactory socketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslSocket = (SSLSocket) socketFactory.createSocket(hosturl, port);
sslSocket.setEnabledProtocols(new String[] {"TLSv1.2"});


数组,可以写多个协议。

(2)指定SSLSocketFactory,共用这个工厂,则影响多个连接。


import java.io.InputStream;
import java.io.OutputStream;
import java.security.SecureRandom;

import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLHandshakeException;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;

public class SSLPoke
{

    public SSLPoke()
    {
    }

    public static void main(String args[])
    {

        try
        {
            SSLContext sc = SSLContext.getInstance("TLSv1.2");
            sc.init((KeyManager[])null, null, new SecureRandom());
            SSLSocketFactory sslsocketfactory = sc.getSocketFactory();
            
            //SSLSocketFactory sslsocketfactory = (SSLSocketFactory)SSLSocketFactory.getDefault();
            SSLSocket sslsocket = (SSLSocket)sslsocketfactory.createSocket("cloud.xxx.com", 443);
            InputStream inputstream = sslsocket.getInputStream();
            OutputStream outputstream = sslsocket.getOutputStream();
            outputstream.write(1);
            for(; inputstream.available() > 0; System.out.print(inputstream.read()));
            System.out.println("Successfully connected");
            System.exit(0);
        }
        catch(SSLHandshakeException sslhandshakeexception)
        {
            if(sslhandshakeexception.getCause() != null)
                sslhandshakeexception.getCause().printStackTrace();
            else
                sslhandshakeexception.printStackTrace();
        }
        catch(Exception exception)
        {
            exception.printStackTrace();
        }
        System.exit(1);
    }
}


貌似只能指定一个协议版本。

(3)结合HttpsURLConnection使用


URL url = new URL("https://cloud.xxx.com/xxx/api/sync/v1/yy/json");
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(sslsocketfactory);
InputStream inputstream = conn.getInputStream();



(4)使用Property,影响整个JVM,慎用!!
System.setProperty("https.protocols","TLSv1.2");
可以写多个协议,逗号分隔,不知道用哪个版本是如何决定的。

(5)使用-D参数,可以写多个,逗号分隔,全局,慎用
-Dhttps.protocols=TLSv1.2 
好使,貌似只能控制HttpsURLConnection时tls的版本。

注意:这个参数影响不到SSLSocket,
如果用sslsocketfactory指定了TLSv1.1,那么sslsocketfactory.createSocket得到的SSLSocket就是TLSv1.1,即使-Dhttps.protocols=TLSv1.2 

注意:这个参数影响HttpsURLConnection,-D参数指定啥版本就是啥版本,不管你里面sslsocketfactory怎么写的。

-Djdk.tls.client.protocols=TLSv1.2
不好使,jdk版本>=1.7.0_95才可用。
我是79版本,所以不行。
它是底层控制tls版本,更厉害一点?
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved