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

问题描述 投票:0回答:1

我正在建立一个网络应用程序(例如:www.mywebapp.example),允许用户将他们的域名 - www.xyz.example - 指向www.mywebapp.example。当用户访问www.xyz.example时,他们的内容将由www.mywebapp.example提供。用户将被告知如何在他们的域名提供商DNS设置中更新他们的@www A records以将www.xyz.example连接到www.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. 我手动为域www.xyz2.example创建了一个新的SSL证书,该证书成功地指向了www.mywebapp.example。但是,这破坏了对所有现有域的SSL支持 - *.mywebapp.example, mywebapp.example, www.xyz.example。我是否需要为每个指向www.mywebapp.example的域创建虚拟主机?
  4. 我是否需要编辑/etc/httpd/conf.d/ssl.conf以添加新的虚拟主机?多个域可以使用相同的DocumentRoot路径吗?

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

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

我的服务器设置是:

  • AWS EC2
php apache ssl lets-encrypt certbot
1个回答
1
投票

你有很多问题。

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

在一般情况下:没有。

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

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

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

这种情况的通用解决方案是:

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

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

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

我们的加密只推荐一个软件:certbot。该页面中列出的所有其余部分都是预期可以工作的客户端库/程序的示例。

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

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

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

当然,其他软件,如Nging / HAProxy可以提供更多高级功能,您不需要为每个虚拟主机配置虚拟主机,即使使用不同的证书,您只需使用特定命名就可以实现,而Web服务器将匹配需要。

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

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

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

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

当然是的。

PS:请停止说SSL,该协议名为TLS,发明于20年前。 SSL早已不复存在,目前的建议是运行TLS 1.2,除非有充分理由允许1.1和1.0存在漏洞。由于这个原因,没有“SSL证书”,因为它们是一个误解者。 TLS可以在没有证书的情况下工作,这些证书可以在TLS之外使用,就像在S / MIME中一样。它们是X.509证书。

© www.soinside.com 2019 - 2024. All rights reserved.