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

时间:2019-03-28 01:07:16

标签: php apache ssl lets-encrypt certbot

我正在构建一个Web应用程序(示例: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工作来测试更新。

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

  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。但是,这破坏了对所有现有域-*.mywebapp.example, mywebapp.example, www.xyz.example的SSL支持。我是否需要为每个指向www.mywebapp.example的域创建虚拟主机?

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

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

任何帮助将不胜感激。如果需要更多信息,请告诉我。

我的服务器设置为:

  • AWS EC2

1 个答案:

答案 0 :(得分:1)

一个问题中有很多问题。

  

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

在一般情况下:否。

一旦到达网页,便会执行PHP,因此它将驻留在当前的HTTP会话中,并且另一端的浏览器将在某种有限的时间内等待某种形式的响应(如果这样,用户会生气他们看不到出现“快速”的东西。)

如果执行事务,则有两个选择:

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

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

  1. 由HTTP访问触发的操作仅记录请求,例如在数据库中或其他内容中
  2. 另外,进程会轮询数据库以查找要执行的任务并执行它们;这与任何Web服务器完全分开;作业完成(成功或失败)后,数据库将以相同的方式更新
  3. 1)中的过程可以定期轮询数据库以查看其状态(挂起,完成或失败),并向用户显示某种消息(例如在访问过程中),并具有某种自动刷新的功能,和/或提供特定的单独信息用户可以在其中跟踪其操作状态的页面
  

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

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

我们的加密仅推荐一种软件:certbot。该页面中列出的所有其余示例都是预期会起作用的客户端库/程序的示例。

  

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

是的,特别是如果他们正在使用每个证书中的特定证书,否则Web服务器将无法根据浏览器给出的主机名(在SNI扩展名之内)识别出正确的证书以在TLS握手开始时返回在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发行版都以/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证书。