如何在本地访问TSL证书

如何在本地访问TSL证书

我有一个 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 服务器吗?

相关内容