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権限で実行されたくありません。だから私の質問は証明書にどのようにアクセスしますか? Apacheはその道を知っているようです。
答え1
これを実行すると、ps auxw | grep httpd
ほとんどのApache Webサーバープロセスはwww-dataに属していますが、ルートに属するプロセスも1つあることがわかります。これは何よりも、基本プロセスが起動時に証明書を読む場所です。
また、/etc/letsencrypt/live ディレクトリを見ると、ファイルが実際に存在する場所への 1 つ以上の同期リンクを見つけることができます。このような複雑さが存在する理由があります。そして、あなたはそこから状況を変えたくありません。あなたはcertbotを破りたくありません。
Webサーバーについてたくさん教えてくれましたが、Webソケットサーバーについては何も教えてくれませんでした。この問題を回避するためのいくつかのメカニズムがあります。
/etc/letsencrypt/live/mydomain.com/の証明書とキーを別の権限を持つ別の場所にコピーする(そしてWebsocket証明書を再起動するか、証明書を再ロードするように指示する)certbot設定に展開フックスクリプトを追加するできます。これは、証明書が最初に生成されたときにcertbotコマンドラインで指定するか、後で/etc/letsencrypt/renewal/mydomain.com.confに手動で追加できます。
自分でやったことはありませんが、そのような気がします...
deploy-hook = /usr/local/sbin/updatewebscoketserver
[renewalparams]
ファイルの末尾の対応するセクションの下にあります。
(スクリプトは直接作成することもできます。)
Webサーバーと同じuidでWebソケットサーバーを実行する必要がありますか?