HTTP是明文传输,存在安全隐患,因此需要加密方案。
为了解决这个问题,HTTPS就是在协议栈中,在HTTP和TCP之间插入一个安全层,对HTTP发起的请求进行加密,对接收到的HTTP响应进行解密。
名词解释:
- 加密套件:指加密的方法。
- 对称加密:加密和解密使用相同的密钥。
- 非对称加密:有A/B两把密钥,A密钥加密只能B密钥来解密,B密钥加密只能A密钥来解密。服务器使用一对公钥和私钥来进行非对称加密。公钥是公开的,私钥不公开。
- 数字证书(Digital Certificate):一个权威机构——CA(Cetificate Authority)给服务器颁发的证书。 数字证书有两个作用:证明服务器身份,包含服务器公钥。
传输数据阶段使用对称加密,对称加密的密钥使用非对称加密来传输。
完整的握手流程:
- 浏览器向服务器发送对称加密套件列表、非对称加密套件列表和随机数client-random;
- 服务器选择一个对称加密套件和一个非对称加密套件,和一个自己生成的随机数service-random、连同数字证书一起返回给浏览器;
- 浏览器验证数字证书合法性,如果合法,使用client-random和service-random生成第三个随机数pre-master,使用证书中的公钥加密,发送给服务器;
- 服务器使用自己的私钥解密出pre-master数据,并返回确认消息。
- 浏览器和服务器利用client-random、service-random、pre-master三组随机数,使用同一套方法生成对称密钥master secret,之后双方使用这个密钥进行数据传输。
申请数字证书流程:
- 准备一套公钥和私钥
- 向CA机构提交自己的身份信息包括公钥、公司、站点等信息并等待认证,认证过程可能会收费
- CA通过线上、线下多种渠道验证该信息真实性,如公司是否存在、企业是否合法、域名是否归属该企业等;
- 审核通过后,CA会签发一个认证的数字证书,包含申请信息中的公钥、组织信息、CA的信息、有效时间、证书序列号、数字签名等明文信息。
数字签名过程:
- CA使用Hash函数计算申请信息得出摘要信息
- CA使用自己的私钥对信息摘要进行加密,生成数字签名
浏览器验证数字证书流程:
- 浏览器会验证证书的有效期;
- 验证证书是否被吊销:有两种方式:一种是下载吊销证书列表CRL(Certificate Revocation Lists),一种是在线验证OCSP(Online Certificate Status Protocol);
- 验证证书是不是CA颁发的:
- 浏览器读取证书中的相关明文信息,使用CA签名时相同的Hash函数计算的到信息摘要A
- 使用对应CA的公钥解密数字签名得到信息摘要B
- 对比信息摘要AB是否一致
- 验证CA机构的合法性:浏览器会继续查找给这个CA颁发证书的CA,再以同样的方式验证它上级CA的可靠性。通常操作系统中会内置信任的顶级CA证书信息(包括公钥),如果这个CA链中没有找到浏览器内置的顶级CA,证书也会被判定非法。内置CA对应的证书称为根证书,根证书是最权威的机构,它们自己为自己签名,被称为自签名证书。
浏览器如何获取CA公钥:
部署HTTP服务器时,除了要部署当前的数字证书之外,还要部署CA机构的数字证书,CA机构的数字证书包括了CA的公钥和CA机构的一些基础信息。
建立HTTPS链接时,服务器会将两个证书一起发送给浏览器。 如果服务器没有部署CA的数字证书,浏览器还可以通过网络下载CA证书,这种方式多了一次证书下载流程,会拖慢首次打开页面的请求速度,一般不推荐使用。
关于CA:
颁发证书的机构分为两种类型:根CA和中间CA,一般申请者都是向中间CA申请证书。一个根CA可以认证很多中间CA,这些中间CA又可以去认证其他中间CA,形成一个树状结构的数字证书链。可以沿着证书链从用户证书追溯到根证书。
浏览器验证服务器证书,如果合法,再验证CA证书,如果合法再验证这个中间CA的根证书。 判断根证书合不合法,只需判断这个根证书在不在操作系统里。
如果一个机构想成为根CA,并让它的根证书内置到操作系统中,需要先通过WebTrust国际安全审计认证。
WebTrust 是由两大著名注册会计师协会 AICPA(美国注册会计师协会)和 CICA(加拿大注册会计师协会)共同制定的安全审计标准,主要对互联网服务商的系统及业务运作逻辑安全性、保密性等共计七项内容进行近乎严苛的审查和鉴证。
只有通过 WebTrust国际安全审计认证,根证书才能预装到主流的操作系统,并成为一个可信的认证机构。
目前通过 WebTrust 认证的根 CA 有 Comodo、geotrust、rapidssl、symantec、thawte、digicert 等。也就是说,这些根 CA 机构的根证书都内置在各大操作系统中,只要能从数字证书链往上追溯到这几个根证书,浏览器就会认为使用者的证书是合法的。