我们经常必须使用SSL证书。 让我们回想一下创建和安装证书的过程(大多数情况下通常是这样)。
- 查找提供商(可以在其上购买SSL的网站)。
- 产生企业社会责任。
- 发送给您的提供商。
- 验证域所有权。
- 获取证书。
- 将证书转换为所需形式(可选)。 例如,从pem到PKCS#12。
- 在Web服务器上安装证书。
相对较快,不复杂也不容易理解。 如果我们最多有十二个项目,则此选项非常合适。 如果还有更多,并且它们至少具有三个环境? 经典开发-演出-生产。 在这种情况下,您应该考虑使此过程自动化。 我建议您深入研究该问题,并找到一种解决方案,以最大程度地减少将来创建和维护证书所需的时间。 本文将提供对该问题的分析以及重复的小指南。
我会提前预约:我们公司的主要专长是.net,因此还有IIS和其他Windows。 因此,ACME客户端及其所有操作也将根据使用窗口进行描述。
与谁相关的一些源数据
作者K代表的公司K。 网址(例如):company.tld
X项目是我们的项目之一,我得出的结论是,同样,在使用证书时,我们需要争取最大的时间节省。 该项目具有四个环境:开发,测试,暂存和生产。 开发和测试在我们这边,暂存和生产在客户端。
该项目的一个特点是它具有大量可用作子域的模块。
也就是说,我们有以下图片:
对于生产,将使用购买的通配符证书,没有问题。 但它仅涵盖子域的第一级。 因此,如果存在用于* .projectX.tld的证书-那么它将对staging.projectX.tld起作用,但对于module1.staging.projectX.tld则没有。 但我不想单独购买一个。
这仅仅是一个公司的一个项目的一个例子。 当然,该项目不是一个。
每个人解决此问题的常见原因如下:
- 最近, 谷歌提出减少SSL证书的最大有效期 。 与所有的后果。
- 为项目和整个公司的内部需求促进发布和维护SSL的过程。
- 证书记录的集中存储,部分解决了使用DNS进行域验证和后续自动更新的问题,还解决了客户端信任问题。 不过,与第三方资源相比,CNAME在合作伙伴/承包商公司的服务器上引起了更多信任。
- 好吧,最后,在这种情况下,短语“要胜于没有”非常合适。
选择SSL提供程序和准备步骤
在免费SSL证书的可用选项中,考虑了cloudflare和letencrypt。 DNS(和其他一些项目)的DNS托管在cloudflare上,但我不喜欢使用其证书。 因此,决定使用letencrypt。
要创建通配符SSL证书,您必须确认域的所有权。 此过程涉及创建一些DNS记录(TXT或CNAME),并在颁发证书时进行后续验证。 Linux有一个称为certbot的实用程序,它使您可以部分(或完全对于某些DNS提供商)自动化此过程。 对于Windows,在找到并测试过的 ACME客户端选项中,我选择了WinACME 。
并创建了该域的记录,我们继续创建证书:

我们对最后一个结论感兴趣,即,用于颁发通配符证书的验证域所有权的可用选项:
- 手动创建DNS记录(不支持自动更新)
- 使用acme-dns服务器创建DNS记录(可在此处找到更多详细信息。
- 使用您自己的脚本(certbot的cloudflare插件模拟)创建DNS记录。
乍一看,第三点很合适,但是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服务器。 我将它放置在docker容器中的ubuntu服务器上,但是您可以在golang所在的任何地方运行它。 Windows也可以,但是我仍然更喜欢Linux服务器。
创建必要的目录和文件:
$ mkdir config $ mkdir data $ touch config/config.cfg
善加利用 vim 您最喜欢的文本编辑器,然后将示例配置插入config.cfg。
要成功,只需调整常规和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
主机应开始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。 我们对选举感兴趣:
在服务器中,客户端发出必须添加到现有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服务器上并使用它。 如果在创建证书时还创建了调度程序中的任务,则将来证书更新过程将自动进行。