HTTPS验证过程与HTTP区别

HTTPS概念说明

HTTPS(Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲就是HTTP的安全版。其实现是在HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

SSL协议位于TCP/IP协议与各种应用协议之间,是一种国际标准的加密及身份认证通信协议,为TCP提供一个可靠的端到端的安全服务,为两个通讯个体之间提供保密性和完整性。SSL层所处位置如下

X.509证书

为了保证证书的一致性,国际电信联盟设计了一套专门针对证书格式的标准X.509,其核心提供了一种描述证书的格式。

X.509数字证书不仅包括用户名和密码,而且还包含了与用户有关的其他信息,通过使用证书,CA可以为证书接收者提供一种方法,使他们不仅信任证书主体的公钥,而且还信任有关证书主体的其他信息

X.509证书有有效期限、证书在期满后就会失效。期间CA可能会出于某些原因吊销证书。要吊销证书,CA保存并分发一个吊销证书的列表,即证书吊销列表CRL。网络用户可以访问CRL以确定证书的有效性

目前, X.509标准已在编排公共密钥格式方面被广泛接受,用户许多网络安全的应用程序,其中包括Ipsec, SSL, SET, S/MIME(安全多媒体Internet邮件扩展)

SSL协议特点

①SSL协议可用于保护正常运行与TCP之上的任何应用协议,如HTTP、FTP、SMTP或Telent的通信,最常见的是用户SSL来保护HTTP通信

②SSL协议的优点在于它是应用层协议无关的。高层的应用协议能透明的建立于SSL协议之上

③SSL协议的应用层协议之前就完成加密算法、通信密钥的协商以及服务器的认证工作。在此之后应用层协议所传送的数据都会被加密。从而保证通信的安全性。

④SSL协议使用通信双方的客户证书以及CA根证书。允许客户/服务器应用以一种不能被偷听的方式通信,在通信双方建立起了一条安全的、可信任的通信通道。

⑤该协议使用密钥对传送数据加密,许多网站都是通过这种协议从客户端接收信用卡编号等保密信息。常用于交易过程

SSL协议工作的基本流程

SSL协议既用到了非对称加密技术又用到了对称加密技术。对称加密技术虽然比公钥加密技术的速度快,可是非对称加密技术提供的更好的身份认证技术。SSL的握手协议非常有效的让客户端和服务器之间完成相互之间的身份认证。其主要过程如下:

1)客户端向服务器传输客户端的SSL协议版本号,支持的加密算法的种类,产生的随机数Key1及其他信息

2)服务器在客户端发送过来的加密算法列表中选取一种,产生随机数Key2,然后发送给客户端

3)服务器将自己的证书发送给客户端

4)客户端验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的CA是否可靠,发行者的公钥能否正确解开服务器证书的”发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配,如果合法性验证没有通过,通信将断开,如果合法性验证通过,将继续向下进行;

5)客户端随机产生一个Pre-Master-Key,然后用服务器的公钥(从证书中获得)对其加密,然后将该Pre-Master-Key发送给服务器

6)服务器接收到Pre-Master-Key,则使用协商好的算法(H)计算出真正的用户通信过程中使用的对称加密密钥Master-Key=H(C1+S1+PreMaster);

7)至此为止,服务器和客户端之间都得到Master-Key,之后的通信过程就使用Master-Key作为对称加密的密钥进行安全通信;

中间人攻击原理

针对SSL的中间人攻击方式主要有两类,分别是SSL劫持攻击和SSL剥离攻击

SSL劫持攻击

SSL劫持攻击即SSL证书欺骗攻击,攻击者为了获得HTTPS传输的明文数据,需要先将自己接入到客户端和目标网站之间;在传输过程中伪造服务器的证书,将服务器的公钥替换成自己的公钥,这样,中间人就可以得到明文传输带Key1、Key2和Pre-Master-Key,从而窃取客户端和服务端的通信数据;

但是对于客户端来说,如果中间人伪造了证书,在校验证书过程中会提示证书错误,由用户选择继续操作还是返回,由于大多数用户的安全意识不强,会选择继续操作,此时,中间人就可以获取浏览器和服务器之间的通信数据

SSL剥离攻击

这种攻击方式也需要将攻击者设置为中间人,之后将HTTPS范文替换为HTTP返回给浏览器,而中间人和服务器之间仍然保持HTTPS服务器。由于HTTP是明文传输的,所以中间人可以获取客户端和服务器传输数据。

原文链接:http://www.cnblogs.com/gordon0918/p/5237717.html

Android端补充

当我们使用HttpsURLConnection发起请求的时候,可以使用系统默认的SSLSocketFactory 创建的 SSLSocket,

private synchronized SSLSocketFactory getDefaultSSLSocketFactory() {  
  try {
    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, null, null);
    return defaultSslSocketFactory = sslContext.getSocketFactory();
  } catch (GeneralSecurityException e) {
    throw new AssertionError(); // The system has no TLS. Just give up.
  }
}

默认的 SSLSocketFactory 校验服务器的证书时,会信任设备内置的100多个根证书。

SSL 握手开始后,会校验服务器的证书,那么其实就是通过 X509ExtendedTrustManager 做校验的,更一般性的说是 X509TrustManager :

/**
 * The trust manager for X509 certificates to be used to perform authentication
 * for secure sockets.
 */
public interface X509TrustManager extends TrustManager {

    public void checkClientTrusted(X509Certificate[] chain, String authType)
            throws CertificateException;

    public void checkServerTrusted(X509Certificate[] chain, String authType)
            throws CertificateException;

    public X509Certificate[] getAcceptedIssuers();
}

那么最后校验服务器证书的过程会落到 checkServerTrusted 这个函数,如果校验没通过会抛出 CertificateException。

如果要使用私有CA签发的证书,必须重写校验证书链TrustManager中的方法,否则的话会出现javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found。但是在重写TrustManger中的checkServerTrusted()很多开发者什么也没有做,会导致证书弱校验(没有真正校验证书)。

真正实现TrustManger的checkServerTrusted()代码如下:

文章目录
  1. 1. HTTPS概念说明
  2. 2. X.509证书
  3. 3. SSL协议特点
  4. 4. SSL协议工作的基本流程
  5. 5. 中间人攻击原理
    1. 5.1. SSL劫持攻击
    2. 5.2. SSL剥离攻击
  6. 6. Android端补充
|