迈向SSL自动化

我们经常必须使用SSL证书。 让我们回想一下创建和安装证书的过程(大多数情况下通常是这样)。


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

相对较快,不复杂也不容易理解。 如果我们最多有十二个项目,则此选项非常合适。 如果还有更多,并且它们至少具有三个环境? 经典开发-演出-生产。 在这种情况下,您应该考虑使此过程自动化。 我建议您深入研究该问题,并找到一种解决方案,以最大程度地减少将来创建和维护证书所需的时间。 本文将提供对该问题的分析以及重复的小指南。


我会提前预约:我们公司的主要专长是.net,因此还有IIS和其他Windows。 因此,ACME客户端及其所有操作也将根据使用窗口进行描述。


与谁相关的一些源数据


作者K代表的公司K。 网址(例如):company.tld


X项目是我们的项目之一,我得出的结论是,同样,在使用证书时,我们需要争取最大的时间节省。 该项目具有四个环境:开发,测试,暂存和生产。 开发和测试在我们这边,暂存和生产在客户端。


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


也就是说,我们有以下图片:


开发人员测验分期生产量
projectX.dev.company.tldprojectX.test.company.tldstaging.projectX.tldprojectX.tld
module1.projectX.dev.company.tldmodule1.projectX.test.company.tldmodule1.staging.projectX.tldmodule1.projectX.tld
module2.projectX.dev.company.tldmodule2.projectX.test.company.tldmodule2.staging.projectX.tldmodule2.projectX.tld
............
moduleN.projectX.dev.company.tldmoduleN.projectX.test.company.tldmoduleN.staging.projectX.tldmoduleN.projectX.tld

对于生产,将使用购买的通配符证书,没有问题。 但它仅涵盖子域的第一级。 因此,如果存在用于* .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


并创建了该域的记录,我们继续创建证书:


图片


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


  1. 手动创建DNS记录(不支持自动更新)
  2. 使用acme-dns服务器创建DNS记录(可在此处找到更多详细信息。
  3. 使用您自己的脚本(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。 我们对选举感兴趣:


  • M:创建新证书(完整选项)
  • 2:手动输入
  • 2:[dns-01]使用acme-dns( https://github.com/joohoi/acme-dns )创建验证记录
  • 当被问及到ACME-DNS服务器的链接时,我们将输入创建的服务器(https)的URL作为响应。 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服务器上并使用它。 如果在创建证书时还创建了调度程序中的任务,则将来证书更新过程将自动进行。

Source: https://habr.com/ru/post/zh-CN483770/


All Articles