我正在建立一个网络应用程序(例如: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
时。我的问题是:
./certbot-auto
命令从PHP执行exec()/shell_exec()
命令吗?我应该编写一个单独的bash脚本并运行bash脚本吗?www.xyz2.example
创建了一个新的SSL证书,该证书成功地指向了www.mywebapp.example
。但是,这破坏了对所有现有域的SSL支持 - *.mywebapp.example, mywebapp.example, www.xyz.example
。我是否需要为每个指向www.mywebapp.example
的域创建虚拟主机?/etc/httpd/conf.d/ssl.conf
以添加新的虚拟主机?多个域可以使用相同的DocumentRoot
路径吗?我已经阅读了以下所有链接,但我仍然很困惑:
任何帮助是极大的赞赏。如果需要更多信息,请告诉我。
我的服务器设置是:
你有很多问题。
我应该使用exec()/ shell_exec()命令从PHP执行./certbot-auto命令吗?我应该编写一个单独的bash脚本并运行bash脚本吗?
在一般情况下:没有。
一旦到达网页就会执行PHP,因此它会存在于当前的HTTP会话中,而另一端的浏览器会在某种有限的时间内等待某种响应(如果用户不这样做,用户就会生气看到出现“快”的东西)。
如果你执行的东西你有两个选择:
这种情况的通用解决方案是:
我应该使用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证书。