做者:王继波 野狗科技运维总监,曾在360、TP-Link从事网络运维相关工做,在网站性能优化、网络协议研究上经验丰富。
野狗官博:https://blog.wilddog.com/
野狗官网:https://www.wilddog.com/
公众订阅号:wilddogbaashtml
当你访问一个网站时,有没有想过这个问题:如何保证个人访问能直达目标网站,而没有被中间人攻击和劫持。想要解决这个问题,就得依靠HTTPS中的身份认证机制。算法
HTTPS的基本概念,我在前面的文章介绍过,能够理解为HTTP+TLS。TLS协议是HTTPS的关键,其设计目标是构建安全的传输层,主要经过数据加密、身份认证、数据完整性来实现,同时还具有高扩展性、兼容性的特色。浏览器
本文将介绍HTTPS功能中的身份认证,及其工做机制。安全
X.509是PKI体系中的一个证书标准,PKI体系将在后面的文章中再介绍。RFC文档中有对X.509的详细描述[RFC文档] ( https://tools.ietf.org/html/rfc5280#section-4.1.1.2 ) 。当前野狗官网( https://www.wilddog.com ) 使用的证书格式正是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的过程:
随机选择两个大的质数p和q,p不等于q,计算N=pq;
根据欧拉函数,求得r=φ(N) = φ(p)φ(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列表中看到。
关注微信公众号,及时获取技术干货