我有一个 apache 服务器使用的有效的 LetsEncrypt 证书。
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName mydomain.com
SSLCertificateFile /etc/letsencrypt/live/mydomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mydomain.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
该证书使用 certbot 自动续订:
sudo ls /etc/letsencrypt/mydomain.com/live/ -al
lrwxrwxrwx 1 root root 41 Dec 31 08:46 fullchain.pem -> ../../archive/mydomain.com/fullchain8.pem
lrwxrwxrwx 1 root root 39 Dec 31 08:46 privkey.pem -> ../../archive/mydomain.com/privkey8.pem
Apache 在 www-data 用户帐户下运行。
www-data 6452 0.0 0.4 472056 41852 ? S 01:44 0:11 /usr/sbin/apache2 -k start
我还有一个需要使用此证书的 Web 套接字服务器。当我使用 www-data 用户运行 Web 套接字服务器时,出现以下错误:
RuntimeException:在 TLS 握手期间来自 tcp://127.0.0.1:46714 的连接失败:无法完成 TLS 握手:SSL_R_NO_SHARED_CIPHER:无法使用合适的共享密码。这可能是因为服务器缺少 SSL 证书(local_cert 上下文选项)...
这基本上意味着它无法访问证书。如果我将 fullchain8.pem 和 privkey8.pem 文件复制到 www-data 可以访问的另一个位置,错误就会更改(但这是另一个问题:))。
我知道将私钥文件复制到 www-data 可以访问的地方是一个坏主意,而且我绝对不希望 Web 套接字服务器以 root 权限运行。所以我的问题是,如何访问证书?阿帕奇似乎知道它的出路。
答案1
如果你运行ps auxw | grep httpd
你会发现,虽然大多数 apache web 服务器进程都属于 www-data,但也有一个进程属于 root。这是主进程(除其他外)在启动时读取证书。
此外,如果您查看目录 /etc/letsencrypt/live,您会发现一个或多个指向文件实际所在位置的同步链接。这种复杂性的存在是有原因的。而且你真的不想改变那里的事情 - 你不想破坏 certbot。
虽然您告诉我们很多有关网络服务器的信息,但您没有告诉我们有关网络套接字服务器的任何信息。它可能有某种机制来避免这个问题。
您可以在 certbot 配置中添加部署挂钩脚本,将证书和密钥从 /etc/letsencrypt/live/mydomain.com/ 复制到具有不同权限的另一个位置(并重新启动 Websocket 证书/指示其重新加载证书) 。这可以在首次创建证书时在 certbot 命令行上指定,也可以稍后手动添加到 /etc/letsencrypt/renewal/mydomain.com.conf 中。
我自己没有尝试过,但我相信这只是......
deploy-hook = /usr/local/sbin/updatewebscoketserver
在文件末尾的该[renewalparams]
部分下。
(您可以自己编写脚本)。
你真的需要以与 Web 服务器相同的 uid 来运行 websocket 服务器吗?