文章目录
网银平台通常少不了数字证书,更少不了安全协议–HTTPS协议。HTTPS协议实际上基于SSL/TLS的 HTTP协议,位于应用层,简单地说HTTPS=HTTP+SSL/TLS。
SSL/TLS协议本身是带有加密信息的传输层协议,数字证书正是为这种协议提供相关加密/解密信息。
前置:TCP/IP模型
TCP/IP模型(Transmission Control Protocol/Internet Protocol)是另一种常用的网络体系结构模型,它是实际互联网使用的基础。TCP/IP模型并不是像OSI模型那样严格分为七个层次,而是通常被划分为四个层次。这四个层次从底层到顶层分别是:
-
网络接口层(Network Interface Layer):与OSI模型中的物理层和数据链路层类似,负责处理物理硬件接口和数据链路协议。
-
网络层(Internet Layer):与OSI模型中的网络层对应,负责在不同网络之间进行数据包的路由和转发,使用IP协议。
-
传输层(Transport Layer):与OSI模型中的传输层相对应,负责端到端的通信,提供可靠的数据传输,使用TCP或UDP协议。
-
应用层(Application Layer):与OSI模型中的应用层对应,提供网络应用服务,包括HTTP、FTP、SMTP等协议。
值得注意的是,TCP/IP模型中的网络接口层通常包含了OSI模型中的物理层和数据链路层的功能,而且应用层可能会涵盖OSI模型中的会话层、表示层和应用层的功能。
TCP/IP模型是实际互联网所采用的网络协议体系结构,它的设计更加简洁灵活,符合实际应用的需求。在实际网络中,TCP/IP模型是更为常见和广泛使用的。
安全协议
HTTPS协议和SSL/TLS协议分属TCP/IP参考模型中的应用层和传输层。
简单地说,HTTPS就是附加了SSL/TLS协议的HTTP协议。HTTPS协议为数字证书提供了最佳的应用环境。
HTTPS协议
HTTPS ( Hypertext Transfer Protocol over Secure SocketLayer) 协议是Web上最为常用的安全访问协议。
简单地说HTTPS就是HTTP安全版,HTTPS是基于SSL/TLS的 HTTP协议,或者说HTTPS=SSL/TLS+HTTP
相比于SSL/TLS协议,HTTPS协议我们更为熟悉。在生活中,我们常常需要访问基于HTTPS协议的Web网站。
查看网站证书
我们已edge浏览器为例,展示如何查看网站的证书。
我们点击一下浏览器的小锁图标,可以看到显示 “连接安全”。
点击“连接安全”,再点击右上角小图标:
可以看到证书:
HTTPS协议常常在服务器中配置,如HTTP服务器Apache(http://httpd.apache.org/)和JSP服务器Tomcat (http://tomcat.apache.org/),通过配置SSL/TLS协议构建基于HTTPS协议的服务器。
SSL/TLS协议
SSL/TLS协议包含两个协议: SSL (Secure Socket Layer,安全套接字层)和TLS (Transport Layer Security,传输层安全) 协议。
-
SSL ( Secure Socket Layer,安全套接字层) : 由Netscape (网景)公司研发,位于TCP/IP参考模型中的网络传输层,作为网络通讯提供安全及数据完整性的一种安全协议。
-
TLS (Transport Layer Security,传输层安全): 基于SSL协议之上的通用化协议,它同样位于TCP/IP参考模型中的网络传输层,作为SSL协议的继任者,成为下一代网络安全性和数据完整性安全协议。
目前,SSL共有3个版本: SSL1.0、SSL2.0和SSL3.0。SSL3.0规范在1996年3月正式发布,较之前2个版本提供了更多的算法支持和安全特性。
1999年,IETF(The Internet Engineering Task Force,互联网工程任务组)在基于SSL3.0协议的基础上发布了TLS1.0。
TLS1.0与SSL3.0几乎是兼容的。
因此,通常意义上我们提到的SSL/TLS协议指的是SSL3.0或TLS1.0的网络传输层安全协议。
SSL/TLS协议可分为两层:记录协议 (Record Protocol) 和握手协议 (Handshake Protocol)。
- 记录协议 (Record Protocol) :建立在可靠的传输协议 (如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
- 握手协议 (Handshake Protocol) :建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
握手协议较为底层,目前主流计算机语言(如Java语言)的开发者已经将这些协议的处理封装得透明,无需我们关心。
SSL/TLS协议涉及多种加密算法,包含消息摘要算法、对称加密算法、非对称加密算法,以及数字签名算法。
- 消息摘要算法:MD5和SHA1
- 对称加密算法: RC2、RC4、IDEA、DES、TripleDES和AES。
- 非对称加密算法: RSA和Diffie-Hellman (DH)
- 数字签名算法:RSA和DSA。
SSL/TLS协议利用密码学算法在互联网上提供端点身份认证和通信保密,完全基于PKI,有较高的安全性。
因此,SSL/TLS协议成了网络上最常用的网络传输层安全保密通讯协议。
通信模型
经过SSL/TLS握手协议交互后,数据交互双方确定了本次会话使用的对称加密算法以及密钥,由此开始基于对称加密算法的加密数据交互。
对等协商加密算法
服务器端和客户端在进行握手协议第一阶段时主要是商榷加密算法,主要包含以下几个步骤:
1 ) 客户端产生随机数RNC (Random Number Client) ,这个随机数将为后续构建密钥做准备。
2 )客户端将自身支持的SSL信息 (版本和种类)、算法信息和随机数RNC发送到服务器端
3 )服务器端得到客户端请求后,产生相应的随机数RNS(Random Number Server) ,这个随机数为后续构建密钥做准备。
4 )服务器端将自身支持的SSL信息 (版本和种类)、算法信息、随机数RNS和其他信息回应到客户端。其他信息包括服务器证书,甚至包含获取客户端证书的请求。
这时,服务器端和客户端已经确认两方交互时所使用的加密算法。
验证证书
如果服务器端回复客户端时带有其他信息,则进入数字证书验证阶段。
客户端验证服务器证书
服务器端下发服务器证书给客户端后,由客户端验证该证书主要包含以下几个步骤:
1)服务器回复客户端响应时带有服务器证书
2)客户端将该证书发送至认证机构。
3)认证机构鉴别该证书
4)认证机构回应客户端验证结果,如果验证失败将同时得到警告信息。
这时,服务器端身份得以认证,客户端和服务器端可以进行以服务器端单向认证为基础的加密交互。
服务器端验证客户证书
如果服务器端对于客户端身份有要求,下发服务器证书的同时要求客户端提供证书。
服务器端要求客户端提供客户证书,将构建基于客户端和服务器端两方的双向认证基础。
服务器端验证客户证书,主要包含以下几个步骤:
1)服务器端请求客户证书
2)客户端发送客户证书
3)服务器将客户证书发送至认证机构验证
4)认证机构验证证书
5)认证机构返回验证结果
通常,客户证书认证不一定必需。
如果客户端和服务器端两方都可以确认,就可进行以双向认证为基础的加密交互。
双向认证是电子商务确保安全的必要环节。
产生密钥
当服务器端和客户端经过上述一系列操作后,开始密钥构建交互。
构建主密钥MS
服务器端和客户端最初需要建立主密钥为构建会话密钥做准备,主要包含以下几个步骤:
1 ) 客户端产生随机数,作为预备主密钥 (Pre-MasterSecret,PMS)
2)客户端使用服务器证书中的公钥对随机数PMS加密
3)客户端将PMS加密信息发送到服务器端
4)服务器使用私钥对信息解密获得PMS信息
5 ) 客户端使用随机数RNC、RNS和PMS构建主密钥 (MasterSecret,MS)
6 ) 服务器端使用随机数RNC、RNS和PMS构建主密钥MS
上述步骤5、6不存在次序关系,实际操作中异步完成。
完成主密钥构建操作后,服务器端和客户端将建立会话密钥即将完成握手协议。
构建会话密钥
服务器端和客户端分别构建主密钥后将构建会话密钥,并终止握手协议交互,主要步骤包括:
1)客户端使用主密钥构建会话密钥。会话密钥即对称加密算法中的秘密密钥。
2)客户端通知服务器端未来的信息将使用会话密钥加密
3)客户端发送使用会话密钥加密的信息,终止握手
4)服务器端使用主密钥构建会话密钥
5)服务器端通知客户端未来的信息将使用会话密钥加密
6 )服务器发送使用会话密钥加密的信息,终止握手
至此,服务器端和客户端完成了握手协议,开始进入正式会话阶段。
如果上述一系列操作中有任何一端受到外界因素干扰发生异常,则重新进入协商算法阶段
加密交互
进入正式会话阶段后,服务器端和客户端将使用会话密钥进行加密交互。
正式会话阶段的加密交互实际上是基于对称加密算法信息交互,会话密钥即秘密密钥,主要步骤如下:
1 )客户端使用会话密钥对信息加密
2 ) 客户端向服务器端发送加密信息。
3 )服务器使用会话密钥对请求信息解密
4 )服务器处理请求
5 ) 服务器完成请求处理,使用会话密钥对回复信息加密
6 ) 服务器回复加密信息
7)客户端使用会话密钥对信息解密
握手协议交互着实让人难以理解,理解上述协议交互尚有难度,更别说这些协议的具体实现。
智慧的先驱者早就想到了这一点,将上述实现封装在SSL(Security Socket Layer)层,我们只需要调用相应的API即可构建HTTPS协议。
参考
《Java加密与解密艺术》