选择你喜欢的标签
我们会为你匹配适合你的网址导航

    确认 跳过

    跳过将删除所有初始化信息

    您的位置:0XUCN > 资讯 > 技术
    新闻分类

    Let's Encrypt 证书签发限速机制的技术优化与演进

    技术 PRO 稿源:虞大胆的叽叽喳喳 2025-04-07 06:25

    Let's Encrypt 为 5.5 亿个网站提供 TLS 证书,每小时要签发 34 万个证书,为避免滥用签发证书,使用了限速功能(rate limiting)。

    最近 Let's Encrypt 官方分享了相关的技术演化,非常值得学习,需要说明的是 Let's Encrypt 并没有几个专职的开发工程师,所以整优化时间也非常长。

    1:2015 年,Let's Encrypt 开始提供免费证书,最初基于域名进行限速,key = label + eTLD 顶级域,比如 http://new.blog.example.co.uk 申请证书,那么 key 就是 http://example.co.uk。

    为了实现限速功能,Let's Encrypt 在 MariaDB 授权表中(authorizations table)中存储证书签发信息(包括域名、日期等关键字段),限速的时候在特定时间窗口扫描符合条件的行数。

    2:2019年,证书签发越来越多,Let's Encrypt新增了 6 个限速标准,本意是为了减少证书的请求,减少对系统的保护,但由于对授权表的大量扫描,负载反而标高了。

    这种技术方案很快就遇到瓶颈了,是使用现有的方式优化索引,还是设计专用的表?需要在性能、复杂性和长期可维护性之间取得平衡。

    3:2021年底的时候,MariaDB 使用主从的架构,限速功能的读取就路由到了从库,虽然减低了主库的负载,但高峰时间会出现主从的延迟,导致限速功能会受到影响。

    4:最初限速功能设计的比较粗暴,一旦用于触发了速率限制,就会好几天无法申请证书,就算扩大限制串口时间,这一问题还是会存在,这种解决方案非常不灵活而且具有破坏性。

    2022年 Let's Encrypt 开始使用令牌桶(token-bucket)的解决方案,就是动态调整颁发证书的频率,而且一旦受限,API会返回 Retry-After 信息,告诉用户多久再去签发证书。

    5:2023年,限速带来的负载会极大影响 MariaDB 可靠性了,授权表比其他表的读取多出一个数量级,Let's Encrypt 评估了多种技术方案,但大多行不通。

    比如虽然授权表的旧记录可以删除,但 MariaDB 删除性能很差,而且删除数据的时候,InnoDB 存储引擎需要维护索引、外键、事务日志,导致删除操作开销非常大,特别在高并发环境下删除更慢了。

    Let's Encrypt 在非授权表中通过 PARTITION 命令来清除分区表旧数据,但对于授权表却行不通,因为它使用了 ON DUPLICATE KEY UPDATE 机制,而分区表要求要求主键必须包含在分区键中,两者不兼容。

    另外授权表的索引非常大,甚至比数据表本身还大,内存占用非常大,导致数据库压力太大,不得不经常删除旧数据。

    2023 年底,Let's Encrypt 决定彻底重构限速系统!

    6:Redis 替换 MariaDB

    为什么选择 Redis 呢,结合限速系统,它有几个优势,首先 Redis 支持高并发、高吞吐、低延迟。

    其次限速存储的数据是暂时的,过一段时间就可以删除,而 Reids 的 TTL 机制可以主动清除旧数据,从而 Reids 存储的数据比数据库少了非常多。

    最后 Redis 支持原子性,也不会产生数据竞争,通过 SETNX 命令可以原子且不会重复写入,再加上 Pipeline 功能,可以一次性读取和更新多个键,可以说限速功能特别适合使用 Redis,简单、灵活、高效!

    7:GCRA

    有了 Redis,Let's Encrypt 最后采用GCRA(Generic Cell Rate Algorithm)算法进行限速,它最早用于电信网络流量控制。

    上述提到的令牌桶算法相对来说有几个缺点,第一它的滑动窗口是固定的,如果某个桶的token没有消耗完,则后续也无法使用,显得不太公平,其次在具体实现上不是特别高效和优雅,比如需要考虑桶更新的并发问题,存储和计算效率并不高。

    而 GCRA 可以优雅解决这两个问题,仅需维护最近请求的 TAT 时间点,并用突发容忍度(burst tolerance)控制并发,当请求时间 >= TAT,则允许请求,且 TAT 更新为当前时间;如果请求时间 + 突发容忍度 >=TAT,则也允许请求,TAT 更新为当前时间, 突发容忍度减一。

    好处是什么呢?能够平滑的控制签发证书的时间,而突发容忍度是为了避免并发带来的问题,最后只需要维护一个 TAT ,存储和计算效率更高。

    8:效果

    最后效果肯定非常好,比如数据库的延迟大大减少了,而且即使流量很大的情况,整体负载也很平稳,下图就是各个表改造前后的延迟情况对比,值越小越好。

    再比如数据库操作也更加监控了,下图可以看出数据库操作非常平稳。

    8:思考

    最后说说给我的几个启示,很多技术解决方案并不是一蹴而就的,首先不能因为改造影响现有业务,其次也不能立刻就去改造,必须思考成熟,考虑效率、可维护性、可扩展性,最终就是一个平衡。

    具体技术上,Let's Encrypt 选择了一个很好的存储和计算系统,再加上优雅的算法,最终让核心业务能够平稳支撑!

    0XU.CN

    [超站]友情链接:

    四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
    关注数据与安全,洞悉企业级服务市场:https://www.ijiandao.com/

    图库
    公众号 关注网络尖刀微信公众号
    随时掌握互联网精彩
    赞助链接