迈向 SSL 发行自动化

我们经常需要使用 SSL 证书。 让我们记住创建和安装证书的过程(在大多数情况下)。

  • 查找提供商(可以购买 SSL 的网站)。
  • 生成企业社会责任。
  • 将其发送给您的提供商。
  • 验证域所有权。
  • 获得证书。
  • 将证书转换为所需的形式(可选)。 例如,从 pem 到 PKCS #12。
  • 在 Web 服务器上安装证书。

比较快,不复杂,容易理解。 如果我们最多有十个项目,则此选项非常合适。 如果它们更多,并且它们至少有三个环境怎么办? 经典的开发-分期-生产。 在这种情况下,值得考虑使该过程自动化。 我建议更深入地研究这个问题,并找到一个解决方案,进一步减少创建和维护证书所花费的时间。 本文将包含对问题的分析和重复的小指南。

让我提前预约一下:我们公司的主要专业是.net,相应地,还有IIS 和其他Windows 相关产品。 因此,ACME客户端及其所有操作也将从使用Windows的角度进行描述。

这与谁相关以及一些初始数据

笔者代理的K公司。 URL(例如):company.tld

X 项目是我们的项目之一,在研究该项目时我得出的结论是,在处理证书时我们仍然需要最大限度地节省时间。 该项目有四个环境:开发、测试、登台和生产。 开发和测试在我们这边,登台和生产在客户端。

该项目的一个特点是它具有大量可作为子域使用的模块。

也就是说,我们有如下图:

开发
测试
分期
生产

projectX.dev.company.tld
项目X.test.company.tld
登台.projectX.tld
项目X.tld

module1.projectX.dev.company.tld
module1.projectX.test.company.tld
module1.staging.projectX.tld
module1.projectX.tld

module2.projectX.dev.company.tld
module2.projectX.test.company.tld
module2.staging.projectX.tld
module2.projectX.tld

...
...
...
...

moduleN.projectX.dev.company.tld
moduleN.projectX.test.company.tld
moduleN.staging.projectX.tld
moduleN.projectX.tld

对于生产,使用购买的通配符证书,这里不会出现任何问题。 但它只覆盖了子域的第一级。 因此,如果有 *.projectX.tld 的证书,那么它将适用于 staging.projectX.tld,但不适用于 module1.staging.projectX.tld。 但不知怎的,我不想单独买一个。

而且这只是以一家公司的一个项目为例。 当然,项目不止一个。

每个人解决此问题的常见原因如下:

  • 最近 谷歌建议缩短SSL证书的最长有效期。 伴随着所有的后果。
  • 促进 SSL 的发布和维护过程,以满足项目和整个公司的内部需求。
  • 证书记录集中存储,部分解决了使用DNS进行域名验证以及后续自动续订的问题,同时也解决了客户端信任的问题。 尽管如此,合作伙伴/执行者公司服务器上的 CNAME 比第三方资源上的 CNAME 更值得信赖。
  • 好吧,最后,在这种情况下,“有总比没有好”这句话非常适合。

选择 SSL 提供商和准备步骤

在免费 SSL 证书的可用选项中,考虑了 cloudflare 和 LetsEncrypt。 此项目(以及其他一些项目)的 DNS 由 cloudflare 托管,但我不喜欢使用他们的证书。 因此,决定使用LetsEncrypt。
要创建通配符 SSL 证书,您需要确认域所有权。 此过程涉及创建一些 DNS 记录(TXT 或 CNAME),然后在颁发证书时对其进行验证。 Linux 有一个实用程序 - certbot,它允许您部分(或对于某些 DNS 提供商而言完全)自动化此过程。 对于 Windows 从 发现并验证 我选择的 ACME 客户端选项 WinACME.

域的记录已经创建,让我们继续创建证书:

迈向 SSL 发行自动化

我们对最后一个结论感兴趣,即确认域所有权以颁发通配符证书的可用选项:

  1. 手动创建DNS记录(不支持自动更新)
  2. 使用 acme-dns 服务器创建 DNS 记录(您可以阅读更多关于 这里.
  3. 使用您自己的脚本创建 DNS 记录(类似于 certbot 的 cloudflare 插件)。

乍一看,第三点很合适,但是如果DNS提供商不支持这个功能怎么办? 但我们需要一个一般情况。 一般情况是 CNAME 记录,因为每个人都支持它们。 因此,我们在第 2 点停止并配置我们的 ACME-DNS 服务器。

设置 ACME-DNS 服务器和证书颁发流程

例如,我创建了域2nd.pp.ua,并将在将来使用它。

强制性要求 为了使服务器正常工作,需要为其域创建NS和A记录。 而我遇到的第一个不愉快的时刻是cloudflare(至少在免费使用模式下)不允许你同时为同一主机创建NS和A记录。 这并不是一个问题,但在绑定中这是可能的。 支持人员回复说他们的小组不允许这样做。 没问题,让我们创建两条记录:

acmens.2nd.pp.ua. IN A 35.237.128.147
acme.2nd.pp.ua. IN NS acmens.2nd.pp.ua.

在这个阶段,我们的主机应该解决 acmens.2nd.pp.ua.

$ ping acmens.2nd.pp.ua
PING acmens.2nd.pp.ua (35.237.128.147) 56(84) bytes of data

acme.2nd.pp.ua 它不会解析,因为为其提供服务的 DNS 服务器尚未运行。

记录已创建,我们继续设置并启动 ACME-DNS 服务器。 它将存在于我的 ubuntu 服务器上 搬运工人 容器,但您可以在任何可用 golang 的地方运行它。 Windows也相当适合,但我还是更喜欢Linux服务器。

创建必要的目录和文件:

$ mkdir config
$ mkdir data
$ touch config/config.cfg

让我们将 vim 与您最喜欢的文本编辑器一起使用,并将示例粘贴到 config.cfg 中 组态.

为了成功运行,纠正 General 和 api 部分就足够了:

[general]
listen = "0.0.0.0:53"
protocol = "both"
domain = "acme.2nd.pp.ua"
nsname = "acmens.2nd.pp.ua" 
nsadmin = "admin.2nd.pp.ua" 
records = 
    "acme.2nd.pp.ua. A 35.237.128.147",
    "acme.2nd.pp.ua. NS acmens.2nd.pp.ua.",                                                                                                                                                                                                  ]
...
[api]
...
tls = "letsencrypt"
…

另外,如果需要,我们将在主服务目录中创建一个 docker-compose 文件:

version: '3.7'
services:
  acmedns:
    image: joohoi/acme-dns:latest
    ports:
      - "443:443"
      - "53:53"
      - "53:53/udp"
      - "80:80"
    volumes:
      - ./config:/etc/acme-dns:ro
      - ./data:/var/lib/acme-dns

准备好。 你可以运行它。

$ docker-compose up -d

在这个阶段主机应该开始解决 acme.2nd.pp.ua,并且 404 出现在 https://acme.2nd.pp.ua

$ ping acme.2nd.pp.ua
PING acme.2nd.pp.ua (35.237.128.147) 56(84) bytes of data.

$ curl https://acme.2nd.pp.ua
404 page not found

如果没有出现 - docker logs -f <container_name> 幸运的是,日志非常可读。

我们可以开始创建证书了。 以管理员身份打开 powershell 并运行 winacme。 我们对选举感兴趣:

  • M:创建新证书(完整选项)
  • 2:手动输入
  • 2: [dns-01] 使用 acme-dns 创建验证记录 (https://github.com/joohoi/acme-dns)
  • 当询问有关 ACME-DNS 服务器的链接时,请在答案中输入已创建服务器的 URL (https)。 acme-dns 服务器的 URL: https://acme.2nd.pp.ua

首先,客户端发出一条需要添加到现有 DNS 服务器的记录(一次性过程):

[INFO] Creating new acme-dns registration for domain 1nd.pp.ua

Domain:              1nd.pp.ua
Record:               _acme-challenge.1nd.pp.ua
Type:                   CNAME
Content:              c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua.
Note:                   Some DNS control panels add the final dot automatically.
                           Only one is required.

迈向 SSL 发行自动化

我们创建必要的记录并确保其创建正确:

迈向 SSL 发行自动化

$ dig CNAME _acme-challenge.1nd.pp.ua +short
c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua.

我们确认已经在 winacme 中创建了所需的条目,并继续创建证书的过程:

迈向 SSL 发行自动化

描述了如何使用 certbot 作为客户端 这里.

这样就完成了证书的创建过程;您可以将其安装在 Web 服务器上并使用它。 如果在创建证书时,您还在调度程序中创建了任务,那么将来证书续订过程将自动发生。

来源: habr.com

添加评论