简单理解https的流程

来源:互联网 发布:mac mini 内置扬声器 编辑:程序博客网 时间:2024/05/29 16:20

1.https流程


2.Java SSl

1)javax.net.ssl 包中提供了对SSL的支持。

客户端 SSLSocket  继承Socket,服务器端SSLServerSocket 继承ServerSocket。SSL 是处于TCP和HTTP之间的一层协议,用于保证数据的在网络传输过程的完整、保密、防篡改等安全性。Socket/ServerSocket是对TCP的抽象而SSLSocket/SSLServerSocket在socket的基础上进行扩展实现对SSL协议的支持。

2)应用

大多数web容器(weblogic、tomcat...)都可以通过配置的方式实现对SSL的支持,所以服务器端若没有特殊的要求通过配置容器可以实现http向https的过渡。

通过程序访问https接口的客户端应用,需要代码实现对SSL支持。所以这里着重客户端的应用介绍:

(1)HttpURLConnection和HttpsURLConnection

简单的常采用创建一个URL url 然后通过url.openConnection()的方式打开连接,并强制类型转换到HttpUrlConnection httpUrlConnection 然后通过httpUrlConnection 实现对服务器的访问,此时更低层是使用Socket与服务端进行通信。若要通过SSL层则需要使用HttpsURLConnection它的更低层实现使用SSLSocket并且HttpsURLConnection 是HttpURLConnection的子类是对HttpURLConnection的扩展,所以HttpsURLConnection和HttpURLConnection使用起来是差不多的。

(2)HttpsURLConnection 的使用

HttpsURLConnection 与HttpURLConnection的用法相差不大,同样通过URL 的openConnection()方法创建URLConnection实例并将其强转为HttpsURLConnection的实例。不同之处一是HttpsURLConnection需要设置SSLSockentFactory(用于创建SSLSocket实例),二是需要设置HostnameVerifier(主机认证器)。设置了SSLSocketFactory和HostnameVerifier的HttpsURLConnection实例像HttpURLConnection实例一样使用。

(3)SSLSocketFactory 的获取

SSLSocketFactory 是一个抽象类可以通过SSLContext的getSocketFactory()方法得到。而SSLConetxt 实例可以通过其自身的静态方法getInstance()得到,

其中getInstance()有三个重载的方法,相同的是三个方法都需要一个字符串参数指明使用的SSL协议(SSL、SSL2、SSL3、TLS、TLSv1、TLSv1.1、TLSv1.2)。得到SSLContext后需要对其进行初始化通过init(KeyManager[] km, TrustManager[] tm, SecureRandom random)方法,其中km是秘钥管理数组、tm是信任管理数组、random是安全随机数。KeyManager的实例管理使用哪一个基于 X509 证书的密钥对来验证本地的安全套接字,在安全套接字协商期间实现调用此接口中的方法来完成:1.确定基于现有标准进行协商可以使用的别名集合、2.选择基于现有标准的最好的别名、3.为指定别名获取相应的密钥材料。TrustManager此接口的实例管理使用哪一个 X509 证书来验证远端的安全套接字。SecureRandom 安全随机数用于产生随机秘钥。KeyManager和TrustManager都有对应的工厂类,且都可以用个getInstance()方法获取实例并通过init()方法进行初始化,TrustManager和KeyManager的getInstance()方法需要提供算法名参数algorithm(PKIX)。

(4) 详细的SSL 握手协议(Handshake protocol)、记录协议(Record protocol)、警报协议(Alert protocol) 以及相关的密码学、秘钥交换等知识需要进一步学习。

3.demo

//创建 HttpsURLConnection 实例
URL url = new URL("https://hostname:port/service");
HttpsURLConnection httpsConnection = (HttpsURLConnection) url.openConnection();
//创建SSLContext 实例
SSLContext sslc = SSLContext.getInstance("TLS");//Algorithms:SSL、SSLv2、SSLv3、TLS、TLSv1、TLSv1.1、TLSv1.2
//创建KeyManagerFactory 实例
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());//Algorithms:PKIX
//加载秘钥证书
KeyStore ks = KeyStore.getInstance("pkcs12");//KeyStore Type:jceks、jks、pkcs12
ks.load(new FileInputStream("keystorepath"), "password".toCharArray());//keystorepath-证书路径 password-证书密码
//初始化KeyManagerFactory
kmf.init(ks, "password".toCharArray());
//创建TrustManagerFactory 实例
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());//Algorithms:PKIX
//加载信任证书
KeyStore ts = KeyStore.getInstance("pkcs12");
ts.load(new FileInputStream("keystorepath"), "password".toCharArray());//keystorepath-证书路径 password-证书密码
//初始化TrustManagerFactory
tmf.init(ts);
//初始化SSLContext
sslc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom());
//设置SSLSocketFactory
httpsConnection.setSSLSocketFactory(sslc.getSocketFactory());
//设置HostnameVerifier
httpsConnection.setHostnameVerifier(new HostnameVerifier() {
/* 
*接受主机名返回true否侧false
*/
@Override
public boolean verify(String hostname, SSLSession session) {
if(hostname.equals(session.getPeerHost())) {
return true;
}
return false;
}
});

原创粉丝点击