作者:王继波 野狗科技运维总监,曾在360、TP-Link从事网络运维相关工作,在网站性能优化、网络协议研究上经验丰富。 野狗官博:https://blog.wilddog.com/ 野狗官网:https://www.wilddog.com/ 公众订阅号:wilddogbaas
当你访问一个网站时,有没有想过这个问题:如何保证我的访问能直达目标网站,而没有被中间人攻击和劫持。想要解决这个问题,就得依靠HTTPS中的身份认证机制。
HTTPS的基本概念,我在前面的文章介绍过,可以理解为HTTP+TLS。TLS协议是HTTPS的关键,其设计目标是构建安全的传输层,主要通过数据加密、身份认证、数据完整性来实现,同时还具备高扩展性、兼容性的特点。
本文将介绍HTTPS功能中的身份认证,及其工作机制。
X.509v3证书 X.509是PKI体系中的一个证书标准,PKI体系将在后面的文章中再介绍。RFC文档中有对X.509的详细描述[RFC文档] ( <a href=“https://tools.ietf.org/html/rfc5280#section-4.1.1.2”>https://tools.ietf.org/html/rfc5280#section-4.1.1.2</a> ) 。当前野狗官网(<a href=“https://www.wilddog.com”> https://www.wilddog.com</a> ) 使用的证书格式正是X.509v3。
X.509v3证书由三部分组成:
- tbsCertificate (to be signed certificate),待签名证书。
- SignatureAlgorithm,签名算法。
- SignatureValue,签名值。
tbsCertificate又包含10项内容,在HTTPS握手过程中以明文方式传输:
- Version Number,版本号。
- Serial Number,序列号。
- Signature Algorithm ID,签名算法ID。
- Issuer Name,发行者。
- Validity period,有效时间。
- Subject name ,证书主体名称。
- Subject Public Key Info ,证书主体公钥信息,包含公钥算法和公钥值。
- Issuer Unique Identifier (optional),发行商唯一ID。
- Subject Unique Identifier (optional),主体唯一ID。
- Extensions (optional),扩展。
SignatureAlgorithm是指定对tbsCertificate签名使用的算法。SignatureValue是使用SignatureAlgorithm指定的哈希和签名算法对tbsCertificate进行哈希和签名后的签名值。
可以使用Wireshark抓包查看这些字段信息,结果如下:
如果觉得wireshark操作太复杂,也可以在浏览器上点击导航栏https小图标查看。
如何进行身份认证? 我们以某用户访问野狗官网为例,分析身份认证的过程(以下过程并非完整HTTPS握手过程,只是身份认证相关的过程)。
浏览器向Server发送请求; Server返回野狗官网的X.509v3证书,其包含三部分:tbsCertificate、SignatureAlgorithm、SignatureValue; 浏览器读取证书中的tbsCertificate部分(明文),使用SignatureAlgorithm中的散列函数计算得到信息摘要,并利用tbsCertificate中的公钥解密SignatureValue得到信息摘要,然后对比双方的信息摘要,判断是否一致;如果一致,则成功;如果不一致,则失败。
虽然野狗官网的认证完成,但整个身份认证过程并没有结束,因为还需要认证证书链,这在文章后面将介绍。
身份认证算法 身份认证算法有多种,最常见的是RSA。通过openssl命令可以查看到:
openssl ciphers –V | column –t
我截取了部分输出结果,其中加密套件是认证、加密、MAC、密钥交换、密钥衍生的组合,如 ECDHE-RSA-AES256-GCM-SHA384,ECDHE做密钥交换、RSA做身份认证、AES256-GCM做加密算法、SHA384做摘要。
RSA如何保证安全性 更直接的说:私钥加密、公钥解密,如何保证整个过程的安全。引用维基百科对RSA的描述:对极大整数做因素分解难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。我们来看下RSA的过程:
随机选择两个大的质数p和q,p不等于q,计算N=pq; 根据欧拉函数,求得r=φ(N) = φ§φ(q)=(p-1)(q-1); 选择一个小于r的整数e,使e与r互质。并求得e关于r的模反元素d,ed ≡ 1 (mod r); 将p和q的记录销毁。 最后得到:(N,e)是公钥,(N,d)是私钥。 使用公钥(N,e)加密明文m,得到密文c me ≡ c (mod N) 使用私钥(N,d)解密密文c,得到明文m cd ≡ m (mod N)
真正安全的保证是N不能被分解得到q和p。实际通信中,N通常非常大,比如2的2048次方,这在目前是不能被破解的。
在生成证书时,可以指定RSA的密钥长度;证书使用后,在证书信息中也可以查看。
证书信任链机制 实际上,在HTTPS通信中,Server下发给Client的不仅仅是对端网站的证书,而是一个证书链。这个证书链是从网站证书开始,逐级往上,到根证书。每个证书都被下个证书的私钥签署,每个证书的 Issuer 就是下个证书的 Subject,root CA内置在浏览器中,是被浏览器所信任的。
那么为什么会使用证书链?使用证书链的好处有两个:1.安全,2.保持CA的私钥离线,方便部署和撤销。如果没有证书链,那么当由CA来验证网站的证书时,如何保障这个过程中的CA是可靠的而不是伪造的。这就是证书链的作用。证书链的顶端是内置在浏览器或操作系统中的rootCA,一级一级的信任,保证了最后网站身份的可靠认证。每个证书的证书链往往是多条的,野狗官网证书的证书链有两条。
我们以野狗官网证书的三级证书链为例,wilddog.com证书 –> Go Daddy Secure Certificate Authority证书 –> Go Daddy Root Certificate Authority证书 。浏览器在接收到wilddog.com网站的证书链后,首先会对wilddog.com网站证书认证:
验证完wilddog.com证书后,向上验证中间证书GoDaddy Secure证书,过程与之类似;验证完GoDaddy Secure证书后,继续验证GoDaddy Root证书,因为GoDaddy Root证书是自签名的,是浏览器内置的CA证书,所以是被浏览器所信任的。 这就是证书的信任链,浏览器信任内置CA证书–Go Daddy Root证书,Go Daddy Root证书信任Go Daddy Secure证书,Go Daddy Secure证书信任wilddog.com证书,所以浏览器信任wilddog.com证书。
当然每个浏览器内置的CA列表存在差异,Mozilla的CA证书列表: http://mxr.mozilla.org/mozilla-release/source/security/nss/lib/ckfw/builtins/certdata.txt
Go Daddy Root证书在Chrome浏览器内置的CA列表中看到。
关注微信公众号,及时获取技术干货