1. 对称加密与非对称加密
在介绍https加密过程前,需要先简单了解下其中用到的加密算法。
对称加密算法:用该密钥加密的数据,可以再用该密钥解密。性能高,速度快。常见的对称加密算法有DES,AES。
非对称加密算法:生成一对密钥对,分别称为公钥、私钥。用公钥加密的数据只能由私钥解密。用私钥加密的数据只能由公钥解密。公钥信息是公开的,私钥由自己保管。性能低,速度慢,安全性高。常见的非对称加密算法有RSA。
2. https与加密
https与http相比,最大的不同就是保证了数据加密传输,保证信息不被泄露,不被篡改(中间人攻击)。这就涉及到加密算法的选型。
对称加密:
- 浏览器与网站服务器双方都需要共同持有密钥。这就需要密钥由任意一端生成,再传输给另一端。由于密钥的传输过程没有加密策略,就会产生泄露风险。该方案不可取。
非对称加密:
- 由网站服务器生成一对公私钥,在处理请求时,对请求数据用私钥加密。浏览器接受数据时用公钥解密。由于公钥是公开的,任意一方都能够获取。所以除了浏览器,其他人也可以破戒该数据。该方案不可取。
- 网站服务器生成公钥A,私钥A'。浏览器生成公钥B,私钥B'。服务器处理请求时候,用浏览器的公钥B加密。浏览器接受请求时,用私钥B'解密。同理,浏览器发起请求时用公钥A加密,服务器用A'解密。这种方案理论上是可行的,但由于非对称加密速度很慢,这会导致每一个请求响应时间都变长。该方案不可取。
对称加密 + 非对称加密:
- 利用对称加密的高性能,与非对称加密的安全性,完成https加密过程。网站服务器生成公钥A,私钥A'。将公钥A明文传输给浏览器。浏览器生成密钥X,并用公钥A对密钥X加密,传输给网站服务器。网站服务器用私钥A'解密。这样浏览器与网站服务器就都拥有了密钥X,接下来用密钥X做对称加密,处理请求即可。这种方案是可行的,但是存在中间人攻击风险。
- 中间人会在网站服务器明文传输公钥A的过程中,篡改请求,将公钥A替换为自己生成的公钥F。浏览器拿到公钥F后对密钥X加密,传输给网站服务器。中间人在该传输过程中再用自己的私钥F'对数据解密,拿到密钥X。再用网站的公钥A加密该数据,传输给网站服务器。这样在浏览器和网站服务器毫不知情的情况下,密钥X就被中间人获取。
对称加密 + 非对称加密 + 站点证书:
- 上述方案最大的问题在于,浏览器无法得知公钥A是由该网站服务器发送而来,还是由中间人发来的。为了证明公钥A确实属于该网站,就需要一份“数字证书”,来证明该公钥确实属于该网站。该种方案就是现在的https加密过程。
3. ca机构与数字证书
颁发数字证书的机构称作ca机构。ca机构与数字证书的关系,就像政府与身份证。政府是可信的,政府颁发出的身份证也是可信的。
摘要算法(又称哈希算法、杂凑算法):
- 摘要算法的目的,是将不同长度的原文(数据),整理计算成长度相同的数据。长度相同的好处在于,后续对其签名的效率提升。摘要算法还用于防原文篡改的场景中。即使只对原文添加了一个空格,都会导致重新摘要后的值发生很大不同。
- 常见的摘要算法有:md5,sha1,sha256。md5计算出的数据长度为128,sha1为160,sha256为256位。长度越短,越容易产生数据碰撞(不同的原文计算出了相同的哈希值)。由于md5与sha1已被技术破解,2015年12月31号后,浏览器已不再信任非sha256摘要颁发出的证书。
数字证书:
-
申请数字证书需要csr文件。目前主流的csr文件数据结构为PKCS10(简称P10)。P10结构体为:
certificationRequestInfo // 证书请求体,包括使用人名称、主体公钥 signatureAlgorithm // 签名算法 signature // 用主体私钥对证书请求体做的签名,加密算法为上一个值
-
每个ca机构都有自己的一对公私钥。当ca机构接收到csr请求后,将csr与证书有效期、证书序列号等信息一起,包装为证书体,最后用自己的私钥对其进行签名,完成证书颁发。最后的证书结构体为(X509结构体):
tbsCertificate // to be signed 证书体,包括证书有效期、序列号、申请人信息、申请人公钥等数据 signatureAlgorithm // 签名算法 signatureValue // 用ca私钥对to be signed数据做的签名,加密算法为上一个值
-
浏览器(或adobe reader等pdf阅读器)都安装了全球可信的ca机构根节点。当网站服务器未用可信根机构的ca证书时,浏览器会有警告提示。国内常见的ca机构有:上海ca、cfca、广东ca。
4. https加密全过程
-
网站服务器生成一对公钥A,私钥A'。用公钥A制作成csr请求,向ca机构申请一份站点证书。ca机构用自己的私钥,对证书体签名,完成证书制作,颁发给该网站。
-
浏览器尝试与服务器构建SSL连接。服务器将自己的站点证书发送给浏览器。服务器对证书进行验证:
- 用颁发该证书的ca机构公钥,对证书签名进行解密,得到解密原文S'。
- 用证书中提到的哈希算法,对证书体进行摘要算法,得到摘要H'。
- 判断S' == H'。若相等,证明证书确实由该ca机构颁发。
- 站点证书中包含了域名等信息,即使中间人也有该ca机构颁发的证书,也无法进行调包。证明证书确实是该网站服务器的。
-
验证完毕,拿到证书中的网站公钥A。浏览器再生成密钥X,用公钥A对密钥X加密,传输给网站服务器。服务器用私钥A'对其解密,拿到密钥X。
-
服务器为每一个浏览器维护一个session id。当获取密钥X后,将其保存在session中。浏览器后续请求都会携带session id,服务器直接从session中拿到密钥X即可,不需要每次都做上述传输工作。
-
后续所有请求传输都用密钥X进行对称加密。
5. 是否存在他人伪造浏览器,与服务端交互的情况
中间人可以拿到服务器的证书公钥,自己包装一个对称密钥X,直接与服务器交互。但这并没有意义,因为服务器总是会校验请求的异常情况,所以不需要考虑这种场景。
标签:公钥,浏览器,证书,密钥,https,服务器,加密,过程 From: https://www.cnblogs.com/sumray/p/18104388