阿里云 CDN HTTPS 最佳实践——动态密钥套件(三)

背景

在 ssllabs 中可以测试域名的 SSL 安全等级:

影响这个测试等级的最主要因素就是密钥套件,在接入阿里云 CDN 的所有域名中,绝大多数域名评级都是 A,但是有少数域名为了兼容一些老浏览器或者客户端,需要支持比如 RC4 这样的加密算法,这样就导致评级为 B,但用户体验更重要,这就需要为这些对密钥套件有特殊需求的域名特殊配置密钥套件。

另外,当我们调试 https 时,比如抓包分析数据包时,发现应用数据都是加密的,无法分析 HTTP 协议的问题,但是如果我们有私钥,那就有办法可以通过 wireshark 来配置解密抓包信息。但是这个有个前提条件是密钥交换算法是 RSA,如果使用 ECDHE 即使有私钥也是无法解密抓包文件的,这就是所谓的 PFS(Perfect Forward Secrecy)。所以当我们想调试 HTTPS 里面的明文信息时,临时调整一下服务器的密钥套件列表中密钥交换算法仅包含 RSA 即可,调试完成之后再恢复成 PFS 密钥套件,这样就很方便的调试 HTTPS 了。

原理

密钥套件也称加密套件、密码套件,是 SSL 中最核心的算法套件,称之为套件是因为其中包含了密钥交换算法、签名算法、加密算法和摘要算法,由两个字节表示。以下是 TLS 密钥套件的语法:

在 Client Hello 中有密钥套件列表,表示客户端所支持的密钥套件:

服务端只能从 Client Hello 的密钥套件列表中选择一个做为本次会话的密钥套件:

那服务端又是怎么选择这个密钥套件呢?这就涉及到密钥套件选择算法了,在 openssl 里面密钥套件的选择与几个因素有关:

1. 服务端配置的密钥套件列表。 
2. 客户端支持的密钥套件列表。 
3. 服务端密钥套件列表优先还是客户端密钥套件列表优先。 
4. 已选择的 SSL 协议版本。 
5. 证书所支持的算法。

如果服务端密钥套件列表优先,则挨个从服务端配置的密钥套件列表中选择一个密钥套件是证书所支持的、已选择的 SSL 协议版本所支持的,并且在客户端密钥套件列表的密钥套件,如果是客户端密钥套件列表优化也是类似,一般都是配置服务端密钥套件优先。

其中最关键的就是服务端配置的密钥套件列表,下面先来看看 openssl 中密钥套件的表达方式:

openssl ciphers ‘ALL‘ -V

上面的协议版本就是该密钥套件支持的协议最低版本,比如 ECDHE-RSA-AES128-GCM-SHA256 的协议版本是 TLSv1.2,那如果握手时选择了 TLSv1.1、TLSv1.0、SSLv3 这些版本则不能使用该密钥套件。

密钥套件之间用4个分隔符之一分开——冒号、分号、逗号或者空格,一般使用冒号。如下密钥套件列表中包含了所有特殊字符:

EECDH+AESGCM:+EECDH+AES256:ALL:-RSA+3DES:!DH:!PSK:!KRB5:!MD5:!RC4:!aNULL:!EXP:!LOW:!SSLV2:!NULL

其说明如下:

EECDH+AESGCM:同时包含EECDH和AESGCM算法的密钥套件,+号相当于『与』操作。 
密钥套件前面+号:将该算法移到算法列表的末尾。这个选项不会添加任何新的算法,它只是紧紧的移动匹配的已经存在的算法。 
密钥套件前面-号:从算法列表中删除该算法。但是可以通过后面的选项将一个或所有的算法可以被再次添加。

通过 openssl ciphers 指令列出来的顺序就是服务端的密钥套件列表顺序:

$openssl ciphers ‘EECDH+AESGCM:+EECDH+AES256:ALL:-RSA+3DES:!DH:!PSK:!KRB5:!MD5:!RC4:!aNULL:!EXP:!LOW:!SSLV2:!NULL‘ -V0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD0xC0,0x2B - ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(128) Mac=AEAD0xC0,0x30 - ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD0xC0,0x2C - ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD0xC0,0x28 - ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA3840xC0,0x24 - ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA3840xC0,0x14 - ECDHE-RSA-AES256-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA10xC0,0x0A - ECDHE-ECDSA-AES256-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA10xC0,0x32 - ECDH-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(256) Mac=AEAD0xC0,0x2E - ECDH-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(256) Mac=AEAD0xC0,0x2A - ECDH-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AES(256) Mac=SHA3840xC0,0x26 - ECDH-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AES(256) Mac=SHA3840xC0,0x0F - ECDH-RSA-AES256-SHA SSLv3 Kx=ECDH/RSA Au=ECDH Enc=AES(256) Mac=SHA10xC0,0x05 - ECDH-ECDSA-AES256-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=AES(256) Mac=SHA10x00,0x9D - AES256-GCM-SHA384 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(256) Mac=AEAD0x00,0x3D - AES256-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA2560x00,0x35 - AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA10x00,0x84 - CAMELLIA256-SHA SSLv3 Kx=RSA Au=RSA Enc=Camellia(256) Mac=SHA10xC0,0x27 - ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA2560xC0,0x23 - ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA2560xC0,0x13 - ECDHE-RSA-AES128-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA10xC0,0x09 - ECDHE-ECDSA-AES128-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA10xC0,0x12 - ECDHE-RSA-DES-CBC3-SHA SSLv3 Kx=ECDH Au=RSA Enc=3DES(168) Mac=SHA10xC0,0x08 - ECDHE-ECDSA-DES-CBC3-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=3DES(168) Mac=SHA10xC0,0x31 - ECDH-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(128) Mac=AEAD0xC0,0x2D - ECDH-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(128) Mac=AEAD0xC0,0x29 - ECDH-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AES(128) Mac=SHA2560xC0,0x25 - ECDH-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AES(128) Mac=SHA2560xC0,0x0E - ECDH-RSA-AES128-SHA SSLv3 Kx=ECDH/RSA Au=ECDH Enc=AES(128) Mac=SHA10xC0,0x04 - ECDH-ECDSA-AES128-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=AES(128) Mac=SHA10xC0,0x0D - ECDH-RSA-DES-CBC3-SHA SSLv3 Kx=ECDH/RSA Au=ECDH Enc=3DES(168) Mac=SHA10xC0,0x03 - ECDH-ECDSA-DES-CBC3-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=3DES(168) Mac=SHA10x00,0x9C - AES128-GCM-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(128) Mac=AEAD0x00,0x3C - AES128-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA2560x00,0x2F - AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA10x00,0x96 - SEED-SHA SSLv3 Kx=RSA Au=RSA Enc=SEED(128) Mac=SHA10x00,0x41 - CAMELLIA128-SHA SSLv3 Kx=RSA Au=RSA Enc=Camellia(128) Mac=SHA10x00,0x07 - IDEA-CBC-SHA SSLv3 Kx=RSA Au=RSA Enc=IDEA(128) Mac=SHA1

实现

在 Tengine 中有两个指令跟密钥套件有关:

ssl_ciphers EECDH+AESGCM:+EECDH+AES256:ALL:-RSA+3DES:!DH:!PSK:!KRB5:!MD5:!RC4:!aNULL:!EXP:!LOW:!SSLV2:!NULL;
ssl_prefer_server_ciphers on;

其中,ssl_ciphers 是配置服务器支持的密钥套件列表,ssl_prefer_server_ciphers 为 on 则指定从服务器支持的密钥套件列表中的优先顺序来选择密钥套件,为 off 则表示从客户端支持的密钥套件列表中的优先顺序来选择密钥套件。

ssl_prefer_server_ciphers 配置为 on 是必须的,因为如果不设置为 on,那意味着优先从客户端支持的密钥套件列表中选择加密套件,这样的话可能导致 SSL 的性能比较低,而且可能导致被攻击。

另外,我们知道 ssl_ciphers 指令是静态配置,想要修改服务器支持的密钥套件列表的话,必须 reload Tengine,对于单台服务器或者少量服务器这么操作是可以的,但是对于阿里云 CDN 上万台机器的集群来 reload Tengine 的话,这么做就不现实了,所以我们也实现了 ssl 密钥套件列表的动态配置,通过修改 openssl 和 提供 lua ffi 接口的方式,这样就可以在 ssl_certificate_by_lua_file 阶段修改域名级别的密钥套件列表。

如下图,可以在阿里云 CDN 管理后台管理系统上根据域名来调整密钥套件。(由于密钥套件的修改是比较底层的配置,非专业人员配置容易出问题,所以没有开放到 CDN 用户控制台。)

时间: 2024-09-29 16:02:07

阿里云 CDN HTTPS 最佳实践——动态密钥套件(三)的相关文章

阿里云 CDN HTTPS 最佳实践系列——动态证书(一)

背景 了解阿里云 CDN 架构的朋友应该知道,阿里云 CDN 7层的接入组件是 Tengine,我们知道 Tengine 原生是支持 SSL 的,只需要在配置文件中配置证书和私钥即可.在 CDN HTTPS 产品化以前,要开通 HTTPS 的域名需要把证书私钥给我们,我们在 Tengine 静态配置中配置,然后再同步到所有 CDN 边缘节点,显然这种方式在越来越多的域名开通 HTTPS 后,Tengine 静态配置文件会越来越大,难以管理,同时也会导致 Tengine reload 变得很慢,这

CDN HTTPS 最佳实践系列——HTTP/2(二)

背景 HTTP/2 是最新的 HTTP 协议,已于2015年5月份正式发布,Chrome. IE11.Safari 以及 Firefox 等主流浏览器已经支持 HTTP/2 协议.阿里云 CDN 在2016年7月份开始全网支持 HTTP/2,是国内第一家全网支持 HTTP/2 的 CDN 提供商. HTTP/2 是新技术,一些底层代码库在实现时可能不完善,在一些特殊场景下可能就出问题,我们遇到过一些 android 库实现有问题,导致开启 HTTP/2 就经常访问失败,关闭 HTTP/2 就完全

破解物联网落地困境-阿里云硬件接入最佳实践

在<剑指物联>第五期中,阿里云IoT事业部总经理库伟曾提到物联网实施过程中的困境.比如在设备厂家层面:智能设备连接不稳定,网络安全差:在ISV层面:标准不统一,集成各厂商的智能设备成本高,时间长,数据打通困难:在用户层面:与产品捆绑紧密,提供的服务割裂,导致用户体验不佳. 库总是从整个物联网全网链路来看物联网实施困境的,而我的着眼点仅是其中一个环节,就是硬件接入层这个环节,由于涉及到软硬结合,对不少人来时是一个难点.此外我们基于设备接入这层,也归纳出如下三条物联网落地难点: (1)   需要接

云计算撑起足球盛宴 阿里云CDN智能调度技术解读

摘要: FIFA世界杯是4年一届的足球盛宴,全球的足球球迷们不管是真球迷还是泛球迷都乐在其中.今年世界杯很大的一个特色就是移动互联网直播,球迷朋友们可以在赛事期间通过手机.PAD.电视大屏来观看看高清比赛直播,特别是今年的优酷世界杯,大部分的用户对直播的清晰度和流畅度表示满意. FIFA世界杯是4年一届的足球盛宴,全球的足球球迷们不管是真球迷还是泛球迷都乐在其中.今年世界杯很大的一个特色就是移动互联网直播,球迷朋友们可以在赛事期间通过手机.PAD.电视大屏来观看看高清比赛直播,特别是今年的优酷世

护航Lazada双11购物节 阿里云CDN全球化火力全开

摘要: Lazada是东南亚最大B2C平台,业务范围覆盖印度尼西亚.马来西亚.菲律宾.新加坡.泰国和越南六个东南亚国家,覆盖大约6亿消费者.在双11期间,阿里云CDN为Lazada电商内容加速,并且通过独家的直播解决方案,帮助Lazada把双11晚会推送到泰国.马来西亚,和东南亚人一起狂欢双11. 2018年11月12日零点--东南亚最大的电子商务公司Lazada 2018双11购物节正式收官.这是一场超过2000万的消费者在Lazada网站上及APP上浏览和疯狂抢购的盛会. Lazada是东南

阿里云CDN实时日志服务是什么?

阿里云CDN实时日志服务重磅发布!在飞天技术汇第43期,阿里云发布了CDN实时日志服务,直播及回看地址:https://yq.aliyun.com/live/699?source=5176.11533457&userCode=ahxhg8oc&type=copy --日志秒级交付.一站式投递.多维数据分析和定制能力.一键配置,业务决策尽在运筹帷幄之中. 下面,我们来看看什么是实时日志? 在借助CDN访问各种的图片.文字或者视频资源时,CDN会产生大量的日志数据,CDN会实时采集这些日志数据

阿里云CDN接入踩坑记录

最近负责的系统安全要求接入CDN,避免DDOS之类攻击,然后华丽丽踩了两个大坑.回顾问题原因后,发现还是相关人员都对CDN原理不够熟悉.了解导致. 坑一:默认支持的文件上传最大是300M 问题现象: 接入CDN后,连续两个用户反馈视频上传失败.系统对视频最大长度有限制,一开始引导用户确认时长,后来给力的用户居然定位到精超过300M就上传失败. 问题原因: 1.除了接入CDN,系统未进行任何变更,因此很快定位到是接入CDN导致. 2.跟阿里云咨询,确认如下:默认支持的最大文件为300M:可以申请放

2018双十一阿里云CDN流量包低至72元/年

2018年双十一阿里云产品优惠活动已经上线了,很多云产品的价格都非常劲爆,除了我们常用的云服务器ECS之外,还有CDN流量包. 本次参与阿里云双十一活动的CDN流量包有2款.10T版和1T版,对于有需求的是个不错的选择,都不贵. 废话不多说了,购买流程: 1.加入拼团(活动规则是加入已满6人团,才能享受最低折扣,本团已经满6人了.注意:别的地方可没有这么高的折扣) 2018双十一阿里云CDN流量包低至72元/年 :http://t.cn/EZBhnoO 2.选择购买"CDN流量包10T版/1T版

云计算之路-阿里云上:消灭“黑色n秒”第三招——禁用网卡的TCP/IP Offload

程咬金有三板斧,我们有三招.在这篇博文中我们要出第三招,同时也意味着昨天在"希望的田野"上的第二招失败了. 前两招打头(CPU)不凑效,这一招要换一个部位,但依然要坚持攻击敌人最弱(最忙最累)部位的原则.那除了CPU,最忙最累的部位是哪里呢?对于Web服务器来说,毫无悬念,当然是网卡.而且阿里云的云服务器,所有的网络负载都集中在一块内网网卡上,SLB(负载均衡)用它,OCS(缓存服务)用它,RDS(数据库服务)也用它.所以,就对它出招! 招式受这篇博文(XenServer – Wind