开发者社区> EdgePlus> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: 阿里云CDN HTTPS最佳实践系列文章,由CDN高防技术专家金九撰写
+关注继续查看

背景

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

https3_1

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

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

原理

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

https3_2

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

http3_3

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

https3_4

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

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

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

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

openssl ciphers 'ALL' -V

https3_6

上面的协议版本就是该密钥套件支持的协议最低版本,比如 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' -V
          0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
          0xC0,0x2B - ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128) Mac=AEAD
          0xC0,0x30 - ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
          0xC0,0x2C - ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
          0xC0,0x28 - ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384
          0xC0,0x24 - ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA384
          0xC0,0x14 - ECDHE-RSA-AES256-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA1
          0xC0,0x0A - ECDHE-ECDSA-AES256-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA1
          0xC0,0x32 - ECDH-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(256) Mac=AEAD
          0xC0,0x2E - ECDH-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(256) Mac=AEAD
          0xC0,0x2A - ECDH-RSA-AES256-SHA384  TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AES(256)  Mac=SHA384
          0xC0,0x26 - ECDH-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AES(256)  Mac=SHA384
          0xC0,0x0F - ECDH-RSA-AES256-SHA     SSLv3 Kx=ECDH/RSA Au=ECDH Enc=AES(256)  Mac=SHA1
          0xC0,0x05 - ECDH-ECDSA-AES256-SHA   SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=AES(256)  Mac=SHA1
          0x00,0x9D - AES256-GCM-SHA384       TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(256) Mac=AEAD
          0x00,0x3D - AES256-SHA256           TLSv1.2 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA256
          0x00,0x35 - AES256-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA1
          0x00,0x84 - CAMELLIA256-SHA         SSLv3 Kx=RSA      Au=RSA  Enc=Camellia(256) Mac=SHA1
          0xC0,0x27 - ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA256
          0xC0,0x23 - ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA256
          0xC0,0x13 - ECDHE-RSA-AES128-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA1
          0xC0,0x09 - ECDHE-ECDSA-AES128-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA1
          0xC0,0x12 - ECDHE-RSA-DES-CBC3-SHA  SSLv3 Kx=ECDH     Au=RSA  Enc=3DES(168) Mac=SHA1
          0xC0,0x08 - ECDHE-ECDSA-DES-CBC3-SHA SSLv3 Kx=ECDH     Au=ECDSA Enc=3DES(168) Mac=SHA1
          0xC0,0x31 - ECDH-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(128) Mac=AEAD
          0xC0,0x2D - ECDH-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(128) Mac=AEAD
          0xC0,0x29 - ECDH-RSA-AES128-SHA256  TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AES(128)  Mac=SHA256
          0xC0,0x25 - ECDH-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AES(128)  Mac=SHA256
          0xC0,0x0E - ECDH-RSA-AES128-SHA     SSLv3 Kx=ECDH/RSA Au=ECDH Enc=AES(128)  Mac=SHA1
          0xC0,0x04 - ECDH-ECDSA-AES128-SHA   SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=AES(128)  Mac=SHA1
          0xC0,0x0D - ECDH-RSA-DES-CBC3-SHA   SSLv3 Kx=ECDH/RSA Au=ECDH Enc=3DES(168) Mac=SHA1
          0xC0,0x03 - ECDH-ECDSA-DES-CBC3-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=3DES(168) Mac=SHA1
          0x00,0x9C - AES128-GCM-SHA256       TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(128) Mac=AEAD
          0x00,0x3C - AES128-SHA256           TLSv1.2 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA256
          0x00,0x2F - AES128-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA1
          0x00,0x96 - SEED-SHA                SSLv3 Kx=RSA      Au=RSA  Enc=SEED(128) Mac=SHA1
          0x00,0x41 - CAMELLIA128-SHA         SSLv3 Kx=RSA      Au=RSA  Enc=Camellia(128) Mac=SHA1
          0x00,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 密钥套件列表的动态配置。

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Serverless架构实现CDN预热最佳实践
预热是源站将会主动将对应的资源缓存到CDN节点,当您首次请求时,就能直接从CDN节点缓存中获取到最新的请求资源,提高缓存命中率。在游戏行业,业务高峰前对热门资源进行预热,提高缓存命中率,降低访问延时。
0 0
【全网首发】听阿里云产品架构师罗小飞解读CDN产品最佳实践
近期,阿里云《极速奔跑吧 2021》首场直播在线开播。此次直播围绕CDN行业最佳实践展开分享,不仅对全网首发的阿里云CDN产品最佳实践图进行了详细解读,还对CDN产品和客户场景如何更高效地匹配、形成最优方案进行了分享,希望基于阿里巴巴及成功客户经验的分享,为客户2021年的企业数字化升级之路加码提速。本文整理自第一个直播议题《CDN行业最佳实践图全解析》,在客户实际应用场景中,介绍了CDN的核心技术功能模块与多年沉淀的大型活动最佳实践。
0 0
阿里云发布CDN产品最佳实践图 全面解析行业应用
2月2日,阿里云发布CDN产品最佳实践图。该图是站在客户视角,基于阿里云CDN多年服务阿里巴巴生态以及数十万家云上企业客户的需求剖析与实战经验,将客户使用CDN的实践路径分解为便捷式扩展、一站式分发和多样化管理三个阶段,旨在帮助客户找到和部署最适合自己的CDN实践之路。
0 0
阿里云Edge Plus私享会正式起航,首场活动聚焦CDN在视频直播领域的最佳实践
近期,阿里云Edge Plus私享会首场活动亮相杭州,来自阿里云的资深/高级技术专家、产品经理与数十位客户代表,围绕“CDN在视频直播领域的最佳实践”这一主题,洞察行业技术趋势,分享落地经验,首次披露全球实时传输网络GRTN在双11淘宝直播中的大规模应用落地细节,同时展开了热烈而深入的讨论。
0 0
最佳实践:使用阿里云CDN加速OSS访问
用户直接访问OSS资源,访问速度会受到OSS的下行带宽以及Bucket地域的限制。如果通过CDN来访问OSS资源,带宽上限更高,并且可以将OSS的资源缓存至就近的CDN节点,通过CDN节点进行分发,访问速度更快,且费用更低。如果采用动静分离的网站架构,就能够解决海量用户访问的性能瓶颈问题。
0 0
【 CDN 最佳实践】CDN 加速 OSS 常见问题及处理思路
CDN加速OSS是常见的站点动静分离的方式,可以实现将静态资源存储在OSS上,并通过CDN加速OSS实现静态资源的访问加速效果。但是在实际使用的过程中可能会出现使用方法以及配置上的问题导致使用上出现难题。本文档主要就CDN加速OSS的配置以及各注意事项进行描述已解决本使用场景中遇到的问题。
0 0
CDN最佳实践之访问慢的分析思路和优化方案
使用CDN加速以后还是存在访问慢的情况,如何去分析定位问题、优化网站速度、解决用户问题是一个十分重要的课题。本文介绍了CDN加速访问慢的分析思路,通过归纳的一些原因结合搜集的信息去进一步判断定位问题,帮助用户在遇到问题时有一个更清晰的思考方法论。同时介绍了一些典型的问题场景,结合这些问题场景可以更快速的去发现问题并优化。
0 0
【最佳实践】CDN访问慢的分析思路和优化方案
使用CDN加速以后还是存在访问慢的情况,如何去分析定位问题、优化网站速度、解决用户问题是一个十分重要的课题。本文介绍了CDN加速访问慢的分析思路,通过归纳的一些原因结合搜集的信息去进一步判断定位问题,帮助用户在遇到问题时有一个更清晰的思考方法论。
1781 0
+关注
EdgePlus
阿里云产品运营,专注边缘计算和视频云产品与技术传播
文章
问答
来源圈子
更多
+ 订阅
相关文档: 边缘节点服务 ENS
文章排行榜
最热
最新
相关电子书
更多
构建智能化的视频系统 阿里云CDN的进化
立即下载
CDN数据化实践
立即下载
阿里云CDN-金融政企CDN最佳实践
立即下载