SSL证书(HTTPS)背后的加密算法
SSL证书(HTTPS)背后的加密算法
之前我们介绍了解到当你在浏览器的地址栏上输⼊https开头的⽹址后,浏览器和服务器之间会在接下来的⼏百毫秒内进⾏⼤量的通信。这些复杂的步骤的第⼀步,就是浏览器与服务器之间协商⼀个在后续通信中使⽤的密钥算法。这个过程简单来说是这样的:
浏览器把⾃⾝⽀持的⼀系列Cipher Suite(密钥算法套件,后⽂简称Cipher)[C1,C2,C3, …]发给服务器;
服务器接收到浏览器的所有Cipher后,与⾃⼰⽀持的套件作对⽐,如果到双⽅都⽀持的Cipher,则告知浏览器;
浏览器与服务器使⽤匹配的Cipher进⾏后续通信。如果服务器没有到匹配的算法,浏览器(以Firefox 30为例,后续例⼦中使⽤的浏览器均为此版本的Firefox)将给出错误信息:
浏览器与服务器使⽤不匹配的Cipher进⾏通信
1. 浏览器
浏览器⽀持哪些Cipher?这取决于浏览器⽀持的SSL/TLS协议的版本。习惯上,我们通常把HTTPS与SSL协议放到⼀起;事实上,SSL 协议是Netcape公司于上世纪90年代中期提出的协议,⾃⾝发展到3.0版本。1999年该协议由ITEL接管,进⾏了标准化,改名为TLS。可以说,TLS 1.0就是SSL 3.1版本。
⽬前TLS最新版本是1.2。互联⽹上有超过99%的⽹站⽀持TLS 1.0,⽽⽀持TLS 1.2的⽹站尚不⾜40%。打开Firefox浏览器,在地址栏中输⼊about:config,然后搜索tls.version,会看到下⾯的选项:
在地址栏中输⼊about:config
其中security.tls.version.min和security.tls.version.max两项决定了Firefox⽀持的SSL/TLS版本,根据的介绍,这两项的可选值及其代表的协议是:
0 – SSL 3.0
1 – TLS 1.0
2 – TLS 1.1
3 – TLS 1.2
因此上图的设置说明当前浏览器⽀持协议的下限是SSL 3.0,上限是TLS 1.2。现在,如果把security.tls.version.min⼀项改为3,那么浏览器就只⽀持TLS 1.2了。前⽂提到,⽬前只有不⾜40%的⽹站⽀持TLS 1.2,⽐如Amazon就不在这40%之列,所以此时访问
amazon,就会收到“Secure Connection Failed”的错误信息,如图1所⽰。
了解了SSL/TLS协议后,可以使⽤Wireshark(或类似的可以抓去⽹络包的⼯具)通过分析⽹络包的信息,来查看浏览器发送给服务器的所有Cipher。
浏览器会⾸先发起握⼿协议,既⼀个“ClientHello”消息,在消息体中,可以到Firefox⽀持的Cipher。在Wireshark 中,按照Protocol协议排序,然后从TLS 1.2协议的报⽂中到⼀个Info为“Client Hello”的。选中这个,然后在下⾯的报⽂信息窗⼝中依次到Secure Sockets Layer -> TLSv1.2 Record Layer -> Handshake Protocal -> Cipher Suites。例⼦中的第⼀个Cipher是
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,⼀共有23个:
查看浏览器发送给服务器的所有Cipher
如果继续⼀个Info为“ServerHello”的报⽂,可以在类似的位置到服务器返回的Cipher,在本例中是
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
关于密钥算法这⼀长串名字的含义,后⾯说明。接下来,浏览器就要等待服务器响应它的请求。我们来看⼀看服务器端都做了些什么。
cipher命令2. 服务器
让我们以Windows为例。若要查看操作系统⽀持哪些密钥算法,可以运⾏gpedit.msc,依次进⼊”Computer Configuration” -> ”Administrative Templates” -> “Network” -> “SSL Configuration Settings”,这时可以在窗⼝右边看到”SSL Cipher Suite Order”项:
运⾏gpedit.msc
点击该项后进⼊”SSL Cipher Suite Order”。这⾥可以看到操作系统⽀持的Cipher的集合,以及对不同Cipher的排序
SSL Cipher Suite Order
如果需要调整这⾥排序,或者去掉⼀些弱的Cipher,可以点击左上⾓的“Enabled”,然后在“Options”中重写编辑Cipher的列表。如果喜欢命令⾏,可以通过下⾯的Powershell命令修改密钥算法套件:
Set-ItemProperty -path HKLM:\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\0001
002 -name Functions -value "XXX,XXX,XXX"
那么Cipher的这⼀长串名字是什么含义呢?其实,每种Cipher的名字⾥包含了四部分信息,分别是
密钥交换算法,⽤于决定客户端与服务器之间在握⼿的过程中如何认证,⽤到的算法包括RSA,Diffie-Hellman,ECDH,PSK 等
加密算法,⽤于加密消息流,该名称后通常会带有两个数字,分别表⽰密钥的长度和初始向量的长度,⽐如DES 56/56, RC2
56/128, RC4 128/128, AES 128/128, AES 256/256
报⽂认证信息码(MAC)算法,⽤于创建报⽂摘要,确保消息的完整性(没有被篡改),算法包括MD5,SHA等。
PRF(伪随机数函数),⽤于⽣成“master secret”。
完全搞懂上⾯的内容似乎还需要⼀本书的介绍(我已经⼒不从⼼了)。不过⼤致了解⼀下,有助于理解Cipher的名字,⽐如前⾯服务器发回给客户端的Cipher,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
从其名字可知,它是
基于TLS协议的;
使⽤ECDHE、RSA作为密钥交换算法;
加密算法是AES(密钥和初始向量的长度都是256);
MAC算法(这⾥就是哈希算法)是SHA。
熟悉了Cipher名字背后的含义后,让我们看看像IIS这样的Web服务器如何选择⼀个密钥算法呢?假如浏览器发来的密钥算法套件为[C1, C2, C3],⽽Windows Server⽀持的套件为[C4, C2, C1, C3]时,C1和C2都是同时被双⽅⽀持的算法,IIS是优先返回C1,还是C2呢?答案是
C2。IIS会遍历服务器的密钥算法套件,取出第⼀个C4,发现浏览器并不⽀持;接下来取第⼆个C2,这个被浏览器⽀持!于是,IIS选择了C2算法,并将它包含在⼀个“ServerHello”握⼿协议中,发回给客户端。这就有了图5中的结果。
3. 选择
作为浏览器的使⽤者,你可以让浏览器只能访问⽀持TLS 1.2协议的站点,以获得更好的安全性,以及更差的体验。作为服务器的维护者,似乎将最强壮的Cipher排在前⾯是正确的选择。SSL证书部署成功后,易维信技术会帮⽤户检查服务器端的加密套件,在我们的安全检查中,常常被报出的问题之⼀就是服务器默认的Cipher太弱(RC4-based),请联系进⾏修复。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论