SSL证书管理:从数以百计的服务器混乱到集中式解决方案

“欧洲最大的在线学校”一词背后会有什么?一方面,这是每小时一千堂课,一万名教师,十万名学生。对我来说,基础架构工程师也包括200多台服务器,数百种服务(微服务和非微服务)以及第2级到第6级的域名。您需要在任何地方使用SSL以及相应的证书。



在大多数情况下,我们使用“让我们加密”证书。它们的优点是它们是免费的,并且收据是全自动的。另一方面,它们有一个特点:有效期短(只有三个月)。因此,它们必须经常更新。我们试图以某种方式使它自动化,但是仍然有大量的手工工作,并且某些事情一直在中断。一年前,我们想出了一种简单而可靠的方法来更新这堆证书,从那时起,我们就忘记了这个问题。

从一台服务器上的一个证书到多个数据中心的数百个证书


从前,只有一台服务器。在它上面住着一个certbot,它从树冠下开始工作。然后,一台服务器停止处理负载,因此出现了另一台服务器。然后越来越多。他们每个人都有自己的证书和一组独特的名称,并且在任何需要配置其更新的地方。在扩展过程中的某个地方,他们复制了现有证书,但忘记了更新。

为了获得Let's Encrypt证书,您必须确认证书中指定的域名的所有权。通常,这是通过反向HTTP请求完成的。


这是我们成长过程中遇到的一些标准困难:

  • : . .
  • HTTP. , . . - LDAP. - . .

自签名证书在某些地方已经使用了相当长的时间,对于那些不需要身份验证的地方(例如,用于内部测试),这似乎是一个很好的解决方案。为了防止浏览器不断报告“可疑站点”,您只需将我们的根证书添加到受信任证书的列表中,这很重要。但是后来这里也出现了困难。



问题在于,在测试人员使用的BrowserStack中,无法为至少iPad,Mac,iPhone的可信列表添加证书。因此测试人员不得不忍受不断弹出有关危险场所的警告。

寻找解决方案


当然,首先,您需要进行监视以便找出即将结束的证书,而不是已经结束的证书,而是更早的证书。那好吧。监视是,我们现在知道证书将很快在这里和那里结束。现在我能做什么?


Big Ear是一款不会破坏证书的旧机器人。

让我们使用通配符证书吗?让我们!让我们加密已经发出了它们。没错,您将必须配置通过DNS进行域所有权的确认。我们的DNS位于AWS Route53中。而且,您必须在所有服务器中分解AWS中的访问详细信息。随着新服务器的出现,所有的经济情况也都复制到那里。

好吧,第3级名称被通配符覆盖。第四级及更高级别的名称该怎么办?我们有许多团队从事各种服务的开发。现在习惯将前端和后端分开。并且,如果前端获得了诸如service.skyeng.ru之类的三级名称,则后端会尝试使用api.service.skyeng.ru这个名称。嗯,也许他们禁止他们继续这样做?好点子!以及如何处理几十个现有的?可能会全力以赴地将它们全部合并为一个域名吗?将所有这些不同级别的名称替换为skyeng.ru/service之类的URL。从技术上讲,这是一个选择,但是需要多长时间?企业如何证明采取此类行动的必要性?我们拥有30多个开发团队,说服所有人-至少需要六个月的时间。而且我们正在创建一个单点故障。是否喜欢,这是一个有争议的决定。

还有什么其他想法?..也许可以在所有包括所有内容的地方制作一张证书?并且我们将其安装在所有服务器上。这可能是解决我们问题的方法,但是“让我们加密”仅允许您在证书中使用100个名称,而且我们已经拥有多个微服务。

与测试员怎么办?他们什么都没想,但他们不断抱怨。除蜜蜂外的所有废话。蜜蜂也是垃圾,但是有很多。每个开发人员或测试人员都有一个测试服务器-我们称它们为测试。测试不是蜜蜂,但是已经有一百多种了。并且每个项目都被部署。就这样。如果要出售,您需要N个证书,那么每次测试的金额是相同的。到目前为止,它们是自签名的。用真实的替换它们会很棒...

两本剧本和一个真理来源


天鹅,癌症和长矛不会将购物车带到任何地方。我们需要一个服务器控制中心。在我们的情况下,这是Ansible。每台服务器上的Certbot都是邪恶的。让所有证书都存储在一个地方。如果某人需要证书,请到这个地方从架子上获取最新版本。并且我们将确保该商店中的证书始终是最新的。

AWS访问详细信息也仅出现在一个地方。因此,问题消失了,例如,在有权访问Route53的新服务器上设置AWS CLI等。

所有必需的证书在一个文件中以YAML格式在Ansible中进行了描述:

    certificates:
      - common_name: skyeng.ru
        alt_names:
          - *.skyeng.ru
      - common_name: olympiad.skyeng.ru
        alt_names:
          - *.olympiad.skyeng.ru
          - api.content.olympiad.skyeng.ru
          - games.skyeng.ru
      - common_name: skyeng.tech
        alt_names:
          - *.skyeng.tech

      .  .  .

定期启动一本剧本,遍历此列表并进行艰苦的工作-与certbot所做的基本上相同:

  • 使用“让我们加密证书颁发机构”创建一个帐户
  • 生成私钥
  • 生成一个(尚未签名的)证书-所谓的证书签名请求
  • 发送签名请求
  • 收到DNS挑战
  • 将收到的记录放入DNS
  • 再次发送签名请求
  • 最后收到签名的证书,然后将其放入商店中。

剧本每天执行一次。如果他由于任何原因而不能续订任何证书(无论是网络问题还是Let's Encrypt方面的某些错误),这都不是问题。下次会更新。

现在,当某些服务主机上需要SSL时,您可以转到该存储库并从那里获取一些文件-第二个剧本执行的最简单的操作...此主机上需要哪些证书的信息在此主机的参数中,在清单/ host_vars /服务器中进行了描述。 .yml

    certificates:
      - common_name: skyeng.ru
        handler: reload nginx
      - common_name: crm.skyeng.ru

      .  .  .

如果文件已更改,则Ansible会挂勾-通常重新启动Nginx(在我们的情况下,这是默认操作)。同样,您可以从其他使用ACME协议的CA获得证书。


  • 我们有许多不同的配置。不断发生故障。通常,我不得不爬上服务器,弄清楚什么又掉了。
  • 现在我们有两本剧本,所有内容都记录在一个地方。一切都像一个时钟。生活变得越来越无聊。

测试中


是的,测试人员如何进行测试?每个开发人员或测试人员都有一个个人测试服务器-测试。当前大约有200个,它们的名称形式为test-y123.skyeng.link,其中123是测试编号。创建和删除测试是自动化的。该操作的组成部分之一是在其上安装SSL证书。预先生成一个SSL证书,其名称由模板组成:

    ssl_cert_pattern:
      - *
      - *.auth
      - *.bill

      .  .  .

只有大约30个名字。因此证书带有名称

    test-y123.skyeng.link
    *.test-y123.skyeng.link
    *.auth.test-y123.skyeng.link
    *.bill.test-y123.skyeng.link

等等

解雇开发人员或测试人员后,其测试将被删除。证书仍然可以使用。它全部存储了,您自己知道它在哪里分解为宿主;您自己知道如何。

聚苯乙烯


带有代码的存储库

在本主题上阅读Stack Overflow如何切换到HTTPS可能也很有趣

  • 数百个不同级别的域
  • 网络套接字
  • 许多HTTP API(代理问题)
  • 尽一切努力而不降低性能

如果您有任何疑问,请在评论中写,我很乐意回答。

All Articles