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

背景

了解阿里云 CDN 架构的朋友应该知道,阿里云 CDN 7层的接入组件是 Tengine,我们知道 Tengine 原生是支持 SSL 的,只需要在配置文件中配置证书和私钥即可。在 CDN HTTPS 产品化以前,要开通 HTTPS 的域名需要把证书私钥给我们,我们在 Tengine 静态配置中配置,然后再同步到所有 CDN 边缘节点,显然这种方式在越来越多的域名开通 HTTPS 后,Tengine 静态配置文件会越来越大,难以管理,同时也会导致 Tengine reload 变得很慢,这样配置生效的时间就很糟糕,还有私钥安全等等一系列问题。所以 CDN HTTPS 产品化时就必须采用动态证书的方式,目前阿里云 CDN HTTPS 证书配置之后1分钟内生效,极大的提高了证书管理效率和用户体验。这两种方式的简单对比如下:

架构

动态配置的同步有两种方式:

1. 主动同步

当用户在用户控制台上配置证书和私钥之后主动向下同步到 CDN 所有节点的 Tengine 中,这样当配置同步成功后用户域名的 https 访问就正常了,但是这种方式有很多缺点,因为 Tengine 机器有几千台,甚至上万台,把证书私钥同步到这么多机器用时较大,生效时间较慢,另外其他一些域名并不是访问到所有的 CDN 机器,如果把证书私钥同步到这台机器并没有什么用,白白浪费内存,以及影响证书的搜索性能。这种方式适合在少量机器群集中使用。

2. Lazy pull

当 https 请求到达 Tengine 后,Tengine 再去拉取配置,这样就只拉取该机器有访问的域名配置,其他域名配置不需要拉取,解决了 Tengine 静态配置过多的问题,也避免了 Tengine reload,从而生效时间更快。

综合以上两种方式的优点,阿里云 CDN 在节点机房内部采用了 Lazy pull 方式拉取配置,在节点机房和中心机房之前采用主动同步的方式。以下是简化的 HTTPS 动态配置架构图。

实现

主动同步有很多种方式可以选择,比如 redis、zoomkeeper等等,这里只讲 Lazy pull 的实现,其关键技术是基于 Tengine 的指令 ssl_certificate_by_lua_file,这个指令是 lua-nginx 模块提供的,其用途就是在 openssl 中查找证书时的一个 lua 回调,然后在 lua 中动态设置证书和私钥。总之,如果 Tengine 的 server 块中配置了这个指令的话,当 openssl 在处理 SSL 握手消息 ClientHello 时会调用到这个指令配置的 lua 代码,在 lua 中我们可以做我们想做的事情,比如发 http 请求去远程拉取证书和私钥,做配置缓存,私钥加解密处理,动态设置证书和私钥等等一系列业务逻辑。

以下是 Tengine 的配置:

server {
    listen  0.0.0.0:443 default_server ssl http2;
    ssl_protocols                     TLSv1 TLSv1.1 TLSv1.2;
    #ssl_ciphers                      [xx];
    ssl_prefer_server_ciphers         on;
    ssl_certificate                   default.crt;
    ssl_certificate_key               default.key;
    ssl_certificate_by_lua_file       dycert.lua;
    include                           dyconf.cfg;
}

如上配置,dycert.lua 是阿里云 CDN 实现的动态证书模块,在 SSL 完整握手时会调用到这个模块,在 Session 复用的握手情况下不会调用到这个模块,这是因为 Session 复用时不需要证书和私钥,这是 openssl 回调接口的官方实现,但是阿里云 CDN 的实现中,还有很多 HTTPS 的动态配置需要在 dycert 模块中来设置,所以我们修改了 openssl,让其在 Session 复用时也调用到 dycert 模块,这为我们实现很多 HTTPS 动态配置(比如: HTTP/2 开关,客户端认证,TLS record size 配置)提供了方便。

如下图所示,dycert 模块是所有 HTTP(S) 业务模块的第一个重要模块,当 https 请求到达 CDN Tengine 时,dycert 模块会去远程拉取 HTTPS 动态配置(证书、私钥、HTTP/2 开关、客户端证书、TLS record size 配置等等),然后解密私钥,将证书和私钥设置到 openssl 中,让其恢复 SSL 握手流程。握手成功后会将该请求交给 Tengine 的后续业务模块处理。

下面是 dycert 模块的实现原理图:

众所周知,Tengine 是多 worker 的,我们需要使用共享内存来缓存拉取到的动态配置,这样可以防止多个 worker 进程同时去远程拉取同一份配置,并且在 worker 进程内存中也同时做了缓存以提高效率。

当一个 https 请求调用到 Tengine dycert 模块时,先在本 worker 缓存中查询是否存在配置,如果没有就去共享内存中查询,如果还是没有就得去远程拉取了(远程拉取采用 http 的 resty api 方式),拉取到动态配置之后在本 worker 中缓存,同时也在共享内存中缓存,为了防止共享内存暴增,加了一个定时器来删除该域名的配置,下次从共享内存中查询不到配置再重新从远程拉取。

另外一个重点就是配置的更新后如何实时生效了:配置管理系统 agent 是可以实时发现域名的配置变化的,并且提供了配置变更注册机制,dycert 会定时的去注册 HTTPS 配置变更,并提供一个 purge resty api,当配置管理系统 agent 发现配置更新之后会回调到该接口,然后该接口会从共享内存中删除该域名的配置,下次该域名的 https 请求到达 dycert 模块后,发现共享内存中没有配置会再去配置管理系统 agent 中拉取,从而解决了配置更新后实时生效的问题。

以上为本文内容。目前,阿里云CDN HTTPS已经全面降价,后付费HTTPS 0.05元/万次请求。下一篇我们将介绍HTTPS最佳实践——HTTP/2,敬请期待。

时间: 2024-10-08 21:58:39

阿里云 CDN HTTPS 最佳实践系列——动态证书(一)的相关文章

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

背景 在 ssllabs 中可以测试域名的 SSL 安全等级: 影响这个测试等级的最主要因素就是密钥套件,在接入阿里云 CDN 的所有域名中,绝大多数域名评级都是 A,但是有少数域名为了兼容一些老浏览器或者客户端,需要支持比如 RC4 这样的加密算法,这样就导致评级为 B,但用户体验更重要,这就需要为这些对密钥套件有特殊需求的域名特殊配置密钥套件. 另外,当我们调试 https 时,比如抓包分析数据包时,发现应用数据都是加密的,无法分析 HTTP 协议的问题,但是如果我们有私钥,那就有办法可以通

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:可以申请放

可视化最佳实践系列白皮书即将发布

最近一段时间到西北流浪了两周,最近在忙着跟FusionCharts原厂整理可视化最佳实践系列白皮书.这些白皮书估计一两周内就能跟大家见面,敬请期待. 整理的过程也是学习的过程,本以为在FusionCharts中浸淫了两年,对可视化这部分已经有了相当的认识,结果却发现真的是学无止境.与诸君共勉. 可视化最佳实践系列白皮书即将发布,布布扣,bubuko.com

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

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