HttpURLConnection 与 HttpsURLConnection
首先可理解Https=Http+SSL/TLS(SSL:安全套接层协议,TLS:传输层协议)
HttpURLConnection这个类主要提供对HTTP协议的访问操作,若需要建立连接,必须实例对象
HttpsURLConnection与HttpURLConnection差别不大,通过HttpsURLConnection类的setSSLSocketFactory()方法获取SSLSocketFactory实例后就可当做HttpURLConnection类来进行使用。
而SSLSocketFactory类用于操作SSL套接字,需要通过SSLContext类的getSockeFactory方法获取,SSLContext在初始化的时候需要配置对应的密匙库与信任库。
//实例化密钥库工厂管理
KeyManagerFactory keyManager = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
//获得密钥库
KeyStore keyStore = getKeyStore(keyStorePath,password);
//初始化密钥库管理工厂
keyManager.init(keyStore,password.toCharArray());
//实例化密钥库工厂管理
TrustManagerFactory truestManager = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
//获得信任库
KeyStore trustStore = getKeyStore(keyStorePath,password);
//初始密钥库管理工厂
trustManager.init(trustStore);
完成上面的两步操作后,实例化SSLContext并获得SSL套接字工厂SSLSocektFactory
//实例化SSLContext
SSLContext ctx = SSLContext.getInstance("TLS");
这里也可
SSLContext ctx = SSLContext.getInstance("SSL",”SunJSSE”);目的都是为了拿到SSLContext实例对象,可查看相应的javaAPI文档
//初始化SSL上下文
ctx.init(keyManager.getKeyManagers(),trustManager.getTrustManagers(),new SecureRandom());
//思考:如果是这样子来写init方法会有什么效果?
sslContext.init(null, trustManager.getTrustManagers(), new java.security.SecureRandom());
//即将第一个参数至值为null的情况
//获得SSLSocketFactory
SSLSocketFactory factory = ctx.getSocketFactory();
我们获得到SSLSocketFactory对象后,就可以用它来初始化HTTPSURLConnection对象了,如:
//建立HTTPS连接
URL url = new URL(httpsUrl);
//获得HttpsURLConnection对象
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
//为HttpsURLConnection对象初始化我们从上面获得到的SSLSocketFactory实例。如:
conn.setSocketFactory(factory);