HTTP的缺点
- 通行使用明文
- 不验证通行方身份
- 无法证明报文的完整性
HTTPS并非是一种新的协议,而是将HTTP协议的通信接口部分用SSL(SecureSocket Layer,安全套接字层,保障数据传输过程中不被截取和窃听的一种协议)或TLS(Transport Layer Security,安全传输层协议,用来确保通信双方传递数据的保密性和完整性)协议代替而已
对称加密和非对称加密
- 对称加密:指的是加密数据用的密钥,跟解密数据用的密钥是一样的。
优点:加密速度快
缺点:双方需要协商密钥,确保密钥不泄漏给其他人
非对称加密: 非对称加密指的是加密数据用的密钥(公钥),跟解密数据用的密钥(私钥)是不一样的。公钥就是公开的密钥,谁都可以查到;私钥就是非公开的密钥,一般是由网站的管理员持有。公钥与私钥之间有一定联系:简单来说就是,通过公钥加密的数据,只能通过私钥解开;通过私钥加密的数据,只能通过公钥解开。
HTTPS流程
浏览器需要先与服务端进行握手,将自己支持的加密算法发送给服务端(默认端口号443);
- 服务端从中选出一组加密算法,并将自己的SSL证书和公钥发会给浏览器 (证书里面包含了公钥);
- 客户端检查证书,如果证书没有问题,浏览器里面会显示一个小锁头,否则会给出证书不受信任的提示;
- 如果证书受信任,浏览器会生成一串随机数的密码,并使用证书公钥加密发送给服务端(非对称加密);
- 服务端用私钥解密后,得到了客户端传过来的随机密码,然后使用密码加密一段握手信息,发送给浏览器,告诉浏览器握手过程结束;
- 后期的数据传输都是基于该随机密码并利用对称加密算法进行加解密的加解密了;
总结起来就是服务端发送SSL证书给客户端进行校验,校验通过后客户端生成随机密钥发给服务端,双方用该密钥进行加解密通信。
密码学基础
密码学密码学粗略地可以分为古典密码学和现代密码学。其中最核心的区别就是古典密码学的安全依赖于加密方式,现代密码学的安全依赖于密钥。直白地说就是使用古典密码学加密,如果加密方式被人知道了,那么密文很容易被破解,而使用现代密码学加密,即使把加密算法明确地公布,只要没有获得密钥,那么也无法在有效的时间内破解密文。
现代密码学大体上可以分为两种加密方式:对称加密(如AES、DES)和非对称加密(如RSA)。
对称加密速度较快,加密和解密都使用同一个密钥。非对称加密会产生两个成对的密钥,用其中一个密钥加密后只能由另一个密钥解开。
HTTPS协议中使用的就是现代密码学中的两种加密方式。
摘要与签名
大多数人认为加密的作用主要就是防止信息被第三方获取,但其实还有另一个功能,那就是生成数字签名。理解数字签名之前需要先了解一下消息摘要。
消息在网络传输中由于各种原因导致数据丢失,怎么确保接收方收到的消息是完整的呢?人们想出了一种方法:将消息内容传入哈希函数,这个函数的神奇之处在于不管接收多少数据都可以生成一个唯一的长度相等的字符串,常用的哈希函数有两种:MD5和 SHA。这个通过哈希函数生成的字符串称为“消息摘要”,接收方只要将接收到的数据通过哈希函数进行计算,就可以得到一个消息摘要,然后和接收到的消息摘要进行比对,从而判断消息是否完整。
但是如果消息在中途被篡改,然后重新生成消息摘要,我们就无法得知了。所以为了防止这种情况,发送方会将生成的消息摘要加密,生成“数字签名”发送出来。只要接收方持有密钥即可对其进行解密,然后验证消息摘要内容。数字签名在消息摘要的基础上保证了消息的“不可篡改性”
相关问题
SSL证书是怎么生成的?
SSL证书是由被称作CA(认证中心)的机构签发的,CA在收到制作证书的请求之后,会生成一对非对称加密算法的密钥,其中公钥被保存在新生成的SSL证书中,同时用CA自己的私钥进行签名后,将新生成的证书和私钥一起返回给申请者。申请者拿到证书和私钥后部署到对应的服务中即可。
SSL 证书的签发过程是逐级的,一般是根证书签发 CA 证书,CA 证书签发终端证书。根证书比较特殊,没有上级颁发者,是自签名证书。
我们可以看到SSL证书在签发的时候是逐级向下的,而验证证书的时候又是从下至上的,这个过程通常称为“证书链”或“信任链”。
SSL证书在HTTPS协议中起到了两个作用:
(1)身份认证,帮助客户端校验服务端身份。
(2)SSL证书中的公钥用来加密传递数据(对称算法密钥)。
客户端是怎么通过SSL证书验证服务端端合法性的?
客户端在拿到证书之后会将数字签名进行解密,并根据证书信息生成消息摘要,解密后的摘要与生成的摘要进行对比,如果一致则证明证书未被修改。然后校验主题、有效期、颁发者等信息。当这些校验都通过之后客户端就认定服务端是安全可信的。
解密数字签名的密钥从哪里来?
上面提到对证书的数字签名进行解密,这个解密的密钥从哪里来呢?要回答这个问题我们必须知道,这个签名是证书的颁发者通过非对称算法用私钥生成的,所以客户端要解密就必须得到公钥,这个公钥就放在颁发者的SSL证书中。这些SSL证书是大型IT公司和政府机构约定生成并植入操作系统中的。所以通过本地查找就能找到颁发者的SSL证书及其中的公钥,用来解密前面提到的签名。
证书的格式
HTTPS协议使用的是SSL数字证书(最早在SSL协议中使用),它遵循的是X.509格式标准,具体格式如下:
证书
版本号
序列号
签名算法
颁发者
证书有效期
此日期前无效
此日期后无效
主题
主题公钥信息
公钥算法
主题公钥
颁发者唯一身份信息(可选项)
主题唯一身份信息(可选项)
扩展信息(可选项)
...
证书签名算法
数字签名