Apache-Httpd

如何在本地訪問 TSL 證書

  • February 24, 2022

我有一個有效的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。

我自己沒有嘗試過,但我相信這只是……

deploy-hook = /usr/local/sbin/updatewebscoketserver

在文件末尾的[renewalparams]部分下。

(您可以自己編寫腳本)。

您真的需要以與 webserver 相同的 uid 執行 websocket 伺服器嗎?

引用自:https://unix.stackexchange.com/questions/692048