如何在本地訪問 TSL 證書
我有一個有效的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 伺服器嗎?