我有一个有效的letsencrypt证书,供apache服务器使用。
<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:来自 tcp://127.0.0.1:46714 的连接在 TLS 握手期间失败:无法完成 TLS 握手:SSL_R_NO_SHARED_CIPHER:无法使用合适的共享密码。这可能是因为服务器缺少 SSL 证书(local_cert 上下文选项)...
这基本上意味着它无法访问证书。如果我将 fullchain8.pem 和 privkey8.pem 文件复制到 www-data 可以访问错误更改的另一个位置(但这是另一个问题:))。
我知道将私钥文件复制到 www-data 可以访问的地方是个坏主意,而且我绝对不希望 Web 套接字服务器以 root 权限运行。所以我的问题是,我怎样才能访问证书?阿帕奇似乎知道它的方式。
如果您运行
ps auxw | grep httpd
,您会看到虽然大多数 apache 网络服务器进程归 www-data 所有,但只有一个进程归 root 所有。这是(除其他外)在启动时读取证书的主进程。此外,如果您查看 /etc/letsencrypt/live 目录,您会发现一个或多个指向文件实际所在位置的同步链接。这种复杂性是有原因的。而且你真的不想改变那里的东西——你不想破坏 certbot。
虽然您向我们介绍了很多有关 Web 服务器的信息,但您并没有告诉我们有关 Web 套接字服务器的任何信息。它可能有一些机制来避免这个问题。
您可以在 certbot 配置中添加部署挂钩脚本,以将证书和密钥从 /etc/letsencrypt/live/mydomain.com/ 复制到具有不同权限的另一个位置(并重新启动 websocket 证书/发出信号以重新加载证书) . 这可以在首次创建证书时在 certbot 命令行上指定,也可以稍后手动添加到 /etc/letsencrypt/renewal/mydomain.com.conf。
我自己没有尝试过,但我相信这只是......
在文件末尾的
[renewalparams]
部分下。(您可以自己编写脚本)。
您真的需要以与 webserver 相同的 uid 运行 websocket 服务器吗?