SSL证书(HTTPS)背后的加密算法

之前我们介绍SSL工作原理了解到当你在浏览器的地址栏上输入https开头的网址后,浏览器和服务器之间会在接下来的几百毫秒内进行大量的通信。这些复杂的步骤的第一步,就是浏览器与服务器之间协商一个在后续通信中使用的密钥算法。这个过程简单来说是这样的:

浏览器把自身支持的一系列Cipher Suite(密钥算法套件,后文简称Cipher)[C1,C2,C3, …]发给服务器;

服务器接收到浏览器的所有Cipher后,与自己支持的套件作对比,如果找到双方都支持的Cipher,则告知浏览器;

浏览器与服务器使用匹配的Cipher进行后续通信。如果服务器没有找到匹配的算法,浏览器(以Firefox 30为例,后续例子中使用的浏览器均为此版本的Firefox)将给出错误信息:

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,会看到下面的选项:

其中security.tls.version.min和security.tls.version.max两项决定了Firefox支持的SSL/TLS版本,根据Firefox文档的介绍,这两项的可选值及其代表的协议是:

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%之列,所以此时访问https://amazon.com,就会收到“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个:

如果继续找一个Info为“ServerHello”的报文,可以在类似的位置找到服务器返回的Cipher,在本例中是TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:

关于密钥算法这一长串名字的含义,后面说明。接下来,浏览器就要等待服务器响应它的请求。我们来看一看服务器端都做了些什么。

2. 服务器

让我们以Windows为例。若要查看操作系统支持哪些密钥算法,可以运行gpedit.msc,依次进入”Computer Configuration” -> ”Administrative Templates” -> “Network” -> “SSL Configuration Settings”,这时可以在窗口右边看到”SSL Cipher Suite Order”项:

点击该项后进入”SSL Cipher Suite Order”。这里可以看到操作系统支持的Cipher的集合,以及对不同Cipher的排序

如果需要调整这里排序,或者去掉一些弱的Cipher,可以点击左上角的“Enabled”,然后在“Options”中重写编辑Cipher的列表。如果喜欢命令行,可以通过下面的Powershell命令修改密钥算法套件:

Set-ItemProperty -path HKLM:\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\0001002 -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),请联系易维信技术支持进行修复。

SSL证书(HTTPS)背后的加密算法的更多相关文章

  1. 免费SSL证书(https网站)申请

    如何拥有一个自己的免费的SSL证书,并且能够长期拥有.这篇文章让你找到可用的免费证书o(* ̄︶ ̄*)o 各厂商提供的免费SSL基本是Symantec(赛门铁克),申请一年,不支持通配符,有数量限制. ...

  2. 微信小程序免费SSL证书https、TLS版本问题的解决方案

    微信小程序与第三方服务器通讯的域名5个必要条件1.一个已备案的域名,不是localhost.也不是127.0.0.1,域名不能加端口2.加ssl证书,也就是https://~~~4.HTTPS 服务器 ...

  3. 免费获取SSL证书/一键安装SSL证书/https加密

    因为我用的是恒创的香港服务器 虽然价格相较于大促的阿里云贵一些,但是有一个有点不用备案... 安装步骤: 1.登录云主机控制面板, 在 其他管理 中找到并进入 SSL证书 设置. 注意:如拥有多个域名 ...

  4. [从零开始搭网站六]为域名申请免费SSL证书(https),并为Tomcat配置https域名所用的多SSL证书

    点击下面连接查看从零开始搭网站全系列 从零开始搭网站 由于国内的网络环境比较恶劣,运营商流量劫持的情况比较严重,一般表现为别人打开你的网站的时候会弹一些莫名其妙的广告...更过分的会跳转至别的网站. ...

  5. linux下nginx配置ssl证书(https)

    nginx配置ssl很简单,首先需要两个文件,一个是crt文件,另一个是key文件,如下所示: xxx.crt;  #(证书公钥)xxx.key; #(证书私钥) 把这两个文件放到nginx的conf ...

  6. 在iis上部署ssl证书 https

    1.取走证书下载下来的文件.解压iis的压缩包. 2.打开internet信息服务iis管理器 3.双击打开后,选择导入,导入我们刚刚解压得到的pfx文件,这个pfx文件就是你需要部署域名的那个文件. ...

  7. nginx安全:配置ssl证书(https证书)

    一,配置https证书的意义 https协议是由SSL+http协议构建的安全协议,支持加密传输和身份认证, 安全性比http要更好,因为数据的加密传输,更能保证数据的安全性和完整性 例如:不使用ht ...

  8. HTTPS背后的加密算法

    当你在浏览器的地址栏上输入https开头的网址后,浏览器和服务器之间会在接下来的几百毫秒内进行大量的通信.InfoQ的这篇文章对此有非常详细的描述.这些复杂的步骤的第一步,就是浏览器与服务器之间协商一 ...

  9. HTTPS背后的加密算法(转)

    当你在浏览器的地址栏上输入https开头的网址后,浏览器和服务器之间会在接下来的几百毫秒内进行大量的通信.InfoQ的这篇文章对此有非常详细的描述.这些复杂的步骤的第一步,就是浏览器与服务器之间协商一 ...

随机推荐

  1. 一篇关于Asp.Net Model验证响应消息的问题处理

    之前,我做过Asp.Net Core的Model验证,在Core中过滤器对响应的处理很简单 context.Result = new JsonResult(ErrorMsg); 但是,在Asp.Net ...

  2. LOJ-10104(割点+dfs)

    题目链接:传送门 思路: 求割点的同时求割点删除后所剩的不连通的点的对数,在遍历完成后回溯统计点的个数,具体操作见代码: 注意:结果是long long 类型. #include<iostrea ...

  3. media 标签解释

    一:常用标签这句话是自动设置缩放,然而,它并不能完全适应所有的手机,并且你在用浏览器手机模式调试的时候可能正常,但是换到真实的手机端其实是不正常的.所以我们还要进行改动. <meta name= ...

  4. 在ExtJS中查看视频

    listeners: { render: function() { win.update( '<video src="' + path+ '" width="100 ...

  5. 初探ansible

    Ansible 基于ssh的自动化运维工具 ansible 配置文件详解 ansible.cfg 文件 文件默认放置在/etc/ansible下,ansible读取配置文件的顺序是: 当前命令执行目录 ...

  6. DNS: Internet’s Directory

    关于DNS 互联网上几乎一切活动都以DNS请求开始.DNS(Domain Name System)是Internet的目录.访问URL时,设备所要做的第一件事就是询问目录,根据域名查出IP地址. 查询 ...

  7. Javascript Engine, Java VM, Python interpreter, PyPy – a glance

    提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...

  8. Python核心团队计划2020年停止支持Python2,NumPy宣布停止支持计划表

    Python核心团队计划在2020年停止支持Python 2.NumPy项目自2010年以来一直支持Python 2和Python 3,并且发现支持Python 2对我们有限的资源增加了负担:因此,我 ...

  9. js读取txt文件

    $('#selectAreaFile').on('change',function(e){//用户区域的文件选择        var files=e.target.files;        if ...

  10. MQTT协议学习总结

    一.MQTT介绍 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通 ...