我们经常需要使用 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 有一个实用程序 -
域的记录已经创建,让我们继续创建证书:
我们对最后一个结论感兴趣,即确认域所有权以颁发通配符证书的可用选项:
- 手动创建DNS记录(不支持自动更新)
- 使用 acme-dns 服务器创建 DNS 记录(您可以阅读更多关于
这里 . - 使用您自己的脚本创建 DNS 记录(类似于 certbot 的 cloudflare 插件)。
乍一看,第三点很合适,但是如果DNS提供商不支持这个功能怎么办? 但我们需要一个一般情况。 一般情况是 CNAME 记录,因为每个人都支持它们。 因此,我们在第 2 点停止并配置我们的 ACME-DNS 服务器。
设置 ACME-DNS 服务器和证书颁发流程
例如,我创建了域2nd.pp.ua,并将在将来使用它。
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 服务器上
创建必要的目录和文件:
$ 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.
我们创建必要的记录并确保其创建正确:
$ dig CNAME _acme-challenge.1nd.pp.ua +short
c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua.
我们确认已经在 winacme 中创建了所需的条目,并继续创建证书的过程:
描述了如何使用 certbot 作为客户端
这样就完成了证书的创建过程;您可以将其安装在 Web 服务器上并使用它。 如果在创建证书时,您还在调度程序中创建了任务,那么将来证书续订过程将自动发生。
来源: habr.com