HTTPS相关原理

HTTPS相关原理

20161211

19:49

 

在互联网安全通信方式上,目前用的最多的就是HTTPS配合SSL和数字证书来保证传输和认证安全了。本文追本溯源围绕这个模式谈一谈。

 

1 名词解释

首先解释一下上面的几个名词:

· HTTPSHTTP(超文本传输协议)基础上提出的一种安全的HTTP协议,因此可以称为安全的超文本传输协议。HTTP协议直接放置在TCP协议之上,而HTTPS提出在HTTP和TCP中间加上一层加密层。从发送端看,这一层负责把HTTP的内容加密后送到下层的TCP,从接收方看,这一层负责将TCP送来的数据解密还原成HTTP的内容。

· SSL(Secure Socket Layer):Netscape公司设计的主要用于WEB的安全传输协议。从名字就可以看出它在HTTPS协议栈中负责实现上面提到的加密层。因此,一个https协议栈大致是这样的:

 

· 数字证书一种文件的名称,好比一个机构或人的签名,能够证明这个机构或人的真实性。其中包含的信息,用于实现上述功能。

· 加密和认证加密是指通信双方为了防止敏感信息在信道上被第三方窃听而泄漏,将明文通过加密变成密文,如果第三方无法解密的话,就算他获得密文也无能为力;认证是指通信双方为了确认对方是值得信任的消息发送或接受方,而不是使用假身份的骗子,采取的确认身份的方式。只有同时进行了加密和认真才能保证通信的安全,因此在SSL通信协议中这两者都被应。

    因此,这三者的关系已经十分清楚了:https依赖一种实现方式,目前通用的是SSL,数字证书是支持这种安全通信的文件。另外有SSL衍生出TLS和WTLS,前者是IEFT将SSL标准化之后产生的(TSL1.0),与SSL差别很小,后者是用于无线环境下的TSL。

 

2 如何加密

2.1 常用的加密算法

· 对称密码算法:是指加密和解密使用相同的密钥,典型的有DES、RC5、IDEA(分组加密),RC4(序列加密);

· 非对称密码算法:又称为公钥加密算法,是指加密和解密使用不同的密钥(公开的公钥用于加密,私有的私钥用于解密)。比如A发送,B接收,A想确保消息只有B看到,需要B生成一对公私钥,并拿到B的公钥。于是A用这个公钥加密消息,B收到密文后用自己的与之匹配的私钥解密即可。密钥是B生成的。反过来也可以用私钥加密公钥解密。也就是说对于给定的公钥有且只有与之匹配的私钥可以解密,对于给定的私钥,有且只有与之匹配的公钥可以解密。典型的算法有RSA,DSA,DH;


 

· 散列算法:散列变换是指把文件内容通过某种公开的算法,变成固定长度的值(散列值),这个过程可以使用密钥也可以不使用。这种散列变换是不可逆的,也就是说不能从散列值变成原文。因此,散列变换通常用于验证原文是否被篡改。典型的算法有:MD5,SHA,Base64,CRC等。

    在散列算法(也称摘要算法)中,有两个概念,强无碰撞和弱无碰撞。弱无碰撞是对给定的消息x,伪造出摘要信息相同的明文。强无碰撞是指在不知道被伪造的明文是什么的情况下,也能伪造出具有相同摘要信息的明文。

已知HASH函数f(x),单向是指已知x可以求出f(x),但是从f(x)无法推断x。

弱无碰撞是指已知x,要找出y使得f(y)=f(x)是不可行的。

强无碰撞是指想找出数对x,y,使得f(x)=f(y)是不可行的。

 

2.2 SSL协议通信流程

    需要注意的是非对称加解密算法的效率要比对称加解密要低的多。所以SSL在握手过程中使用非对称密码算法来协商密钥,实际使用对称加解密的方法对http内容加密传输

客户端向服务器端发起对话,协商传送加密算法。例如:对称加密算法有DES、RC5,密钥交换算法有RSA和DH,摘要算法有MD5和SHA。

服务器向客户端发送服务器数字证书。比如:使用DES-RSA-MD5这对组合进行通信。客户端可以验证服务器的身份,决定是否需要建立通信。

客户端向服务器传送本次对话的密钥。在 检查服务器的数字证书是否正确、通过CA机构颁发的证书验证了服务器证书的真实有效性之后,客户端生成利用服务器的公钥加密的本次对话的密钥发送给服务器。

服务器用自己的私钥解密,获取本次通信的密钥。

双方的通信正式开始。

 

详细通信过程见SSL握手阶段详细过程

从上面的过程可以看到,SSL协议是如何用非对称密码算法来协商密钥,并使用密钥加密明文并传输的。还有以下几点补充:

· B使用数字证书把自己的公钥和其他信息包装起来发送A,用于A验证B的身份。

· A生成的加密密钥、加密初始化向量和hmac密钥是双方用来将明文摘要和加密的。加密初始化向量和hmac密钥首先被用来对明文摘要(防止明文被篡改),然后这个摘要和明文放在一起用加密密钥加密后传输。

· 由于只有B有私钥,所以只有B可以解密ClientKeyExchange消息,并获得之后的通信密钥。

· 上述过程B没有验证A的身份,如果需要的话,SSL也是支持的,此时A也需要提供自己的证书。

2.3 数字证书

    由上面的讨论可以知道,数字证书在SSL传输过程中扮演身份认证和密钥分发的功能。究竟什么是数字证书呢?

    简而言之数字证书是一种网络上证明持有者身份的文件,同时还包含有公钥,数字证书=身份文件+公钥。一方面,既然是文件那么就有可能“伪造”,因此,证书的真伪就需要一个验证方式;另一方面,验证方需要认同这种验证方式。

    对于第一个需求,目前的解决方案是,证书可以由国际上公认的证书机构颁发,这些机构是公认的信任机构,一些验证证书的客户端应用程序:比如浏览器,邮件客户端等,对于这些机构颁发的证书完全信任。当然想要请这些机构颁发证书可是要付钱的,通常在windows部署系统的时候会让客户端安装我们自己服务器的根证书,这样客户端同样可以信任我们的证书。

    对于第二个需求,客户端程序通常通过维护一个“根受信任机构列表”,当收到一个证书时,查看这个证书是否是该列表中的机构颁发的,如果是则这个证书是可信任的,否则就不信任。

2.3.1 证书的信任

    因此作为一个https的站点需要与一个证书绑定,无论如何,证书总是需要一个机构颁发的,这个机构可以是国际公认的证书机构,也可以是任何一台安装有证书服务的计算机。客户端是否能够信任这个站点的证书,首先取决于客户端程序是否导入了证书颁发者的根证书。下图说明了这个流程:

 

    有时一个证书机构可能授权另一个证书机构颁发证书,这样就出现了证书链。IE浏览器在验证证书的时候主要从下面三个方面考察,只要有任何一个不满足都将给出警告

· 证书的颁发者是否在“根受信任的证书颁发机构列表”中

· 证书是否过期

· 证书的持有者是否和访问的网站一致

    另外,浏览器还会定期查看证书颁发者公布的“证书吊销列表”,如果某个证书虽然符合上述条件,但是被它的颁发者在“证书吊销列表”中列出,那么也将给出警告。证书与密钥

    ssl的加密过程一节中,我们知道要实现ssl加密通信,必须要双方协商密钥,ssl采用的是非对称加密来实现密钥交换。在这个过程中,服务端向客户端发送的公钥就包含在证书中。客户端将自己生成的密钥用公钥加密,服务端用于公钥匹配的私钥解密。因此,可以想到的是,服务端保存了一个私钥,并且也与https的站点绑定了。

你可能感兴趣的:(HTTPS相关原理)