如何为指向我的服务器的域动态创建新的 LetsEncrypt/Certbot SSL 证书?

Sag*_*til 2 php apache ssl lets-encrypt certbot

我正在构建一个网络应用程序(例如:)www.mywebapp.example,允许用户将他们的域 - www.xyz.example- 指向www.mywebapp.example. 当用户转到 时www.xyz.example,他们的内容将从中提供www.mywebapp.example。用户将被告知如何更新他们的@www A records在他们的域提供商中的 DNS 设置以连接www.xyz.examplewww.mywebapp.example.

我可以./certbot-auto -d <domain-name>为每个域手动创建新的 SSL 证书。我还设置了一个 cron 作业来测试更新。

但是,我想通过运行从 JavaScript 函数触发的 PHP 脚本来自动执行此过程,每次用户将其域连接到www.mywebapp.example. 我的问题是:

  1. 我应该./certbot-auto使用命令从 PHP执行exec()/shell_exec()命令吗?我应该编写一个单独的 bash 脚本并运行 bash 脚本吗?

  2. 我应该使用 LetsEncrypt 推荐的 ACME PHP 库吗? https://letsencrypt.org/docs/client-options/

  3. 我手动为域创建了一个新的 SSL 证书www.xyz2.example,该证书成功指向www.mywebapp.example. 但是,这破坏了对所有现有域的 SSL 支持 - *.mywebapp.example, mywebapp.example, www.xyz.example. 我是否需要为指向的每个域创建虚拟主机www.mywebapp.example

  4. 我是否需要编辑/etc/httpd/conf.d/ssl.conf以添加新的虚拟主机?多个域可以使用相同的DocumentRoot路径吗?

我已经阅读了以下所有链接,但仍然很困惑:

任何帮助是极大的赞赏。如果需要更多信息,请告诉我。

我的服务器设置是:

  • AWS EC2

Pat*_*zek 5

你有很多问题合而为一。

我应该使用 exec()/shell_exec() 命令从 PHP 执行 ./certbot-auto 命令吗?我应该编写一个单独的 bash 脚本并运行 bash 脚本吗?

在一般情况下:否。

一旦访问网页,PHP 就会执行,因此它存在于当前的 HTTP 会话中,另一端的浏览器将在有限的时间内等待某种响应返回(如果不这样做,用户会生气)看到出现“快速”的东西)。

如果你执行东西,你有两个选择:

  1. 你等待外部程序完成:问题,这可能是在“不确定”时间之后,所以如果不考虑这一点,用户将永远不会在他们的浏览器中看到任何东西
  2. 你在后台启动它,你不等待它的完成:问题,你不需要它是否成功,所以即使你能够向浏览器回复“某事”,你将如何处理失败?

此类情况的通用解决方案是:

  1. HTTP 访问触发的动作只是记录请求,比如在数据库中什么的
  2. 一个进程单独轮询 DB 以查找要执行的任务并执行它们;这与任何网络服务器完全分开;当作业完成(成功或失败)时,数据库将以相同的方式更新
  3. 1) 处的过程可以定期轮询 DB 以查看状态(待定或完成或失败)并向用户显示消息,例如在访问期间,具有某种自动刷新,和/或提供特定的单独页面,其中用户将能够跟踪其操作状态

我应该使用 LetsEncrypt 推荐的 ACME PHP 库吗? https://letsencrypt.org/docs/client-options/

您可以使用正确实现 ACME 协议的任何语言的任何库。

Let's Encrypt 只推荐一种软件:certbot. 该页面中列出的所有其余部分都是预期可以工作的客户端库/程序的示例。

我是否需要为每个指向 www.mywebapp.example 的域创建虚拟主机?

是的,特别是如果他们每个人都使用一个特定的证书,否则网络服务器将无法根据浏览器提供的主机名(在开始使用的 SNI 扩展中)识别在 TLS 握手开始时返回的正确证书TLS 握手)

或者您可以使用大规模虚拟主机的一些 Apache 功能,例如https://httpd.apache.org/docs/2.4/mod/mod_vhost_alias.html 然而,这可能意味着添加了所有名称的单个证书,这在技术上可以工作直到一定数量的名称,但可能会产生非技术问题(例如查看所有名称等)

当然,其他软件,例如 Nging/HAProxy 可以提供更高级的功能,您无需为每个虚拟主机配置虚拟主机,即使使用不同的证书,您只需使用特定的命名将东西放在适当的位置,网络服务器就会将其匹配为需要。

我是否需要编辑 /etc/httpd/conf.d/ssl.conf 来添加新的虚拟主机?

是的,或任何其他文件,只要您使用Include或类似。

如果您管理许多不同且独立的网站,则每个网站拥有一个配置文件(包括其证书路径等)可能会更简单,许多 Linux 发行版都/etc/httpd/sites-enabled/以您拥有该功能的方式安装 Apache 。如果没有,您可以自己做同样的事情。

多个域可以使用相同的 DocumentRoot 路径吗?

当然是的。

PS:请不要再说SSL了,这个协议叫TLS,20年前发明的。SSL 早已不复存在,当前的建议是运行 TLS 1.2,除非有充分的理由也允许存在漏洞的 1.1 和 1.0。出于这个原因,也没有“SSL 证书”,因为它们用词不当。TLS 可以在没有证书的情况下工作,并且这些证书可以在 TLS 之外使用,例如在 S/MIME 中。它们是 X.509 证书。