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
또한 이 인증서를 사용해야 하는 웹 소켓 서버도 있습니다. www-data 사용자를 사용하여 웹 소켓 서버를 실행하면 다음 오류가 발생합니다.
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에 액세스할 수 있는 위치에 복사하는 것이 좋지 않다는 것을 알고 있으며 웹 소켓 서버가 루트 권한으로 실행되는 것을 원하지 않습니다. 그래서 내 질문은 인증서에 어떻게 액세스합니까?입니다. 아파치는 그 길을 알고 있는 것 같습니다.
답변1
이를 실행하면 ps auxw | grep httpd
대부분의 Apache 웹 서버 프로세스가 www-data에 속하지만 루트에 속한 프로세스도 하나 있다는 것을 알 수 있습니다. 이곳은 무엇보다도 기본 프로세스가 시작 시 인증서를 읽는 곳입니다.
또한 /etc/letsencrypt/live 디렉터리를 살펴보면 파일이 실제로 있는 위치에 대한 하나 이상의 동기화 링크를 찾을 수 있습니다. 이러한 복잡성이 존재하는 데에는 이유가 있습니다. 그리고 당신은 거기에서 상황을 바꾸고 싶지 않습니다. 당신은 certbot을 깨뜨리고 싶지 않습니다.
웹 서버에 대해 많이 알려주셨지만 웹 소켓 서버에 대해서는 아무 것도 알려주지 않으셨습니다. 이 문제를 방지하기 위한 몇 가지 메커니즘이 있을 수 있습니다.
/etc/letsencrypt/live/mydomain.com/의 인증서와 키를 다른 권한이 있는 다른 위치로 복사하는(그리고 Websocket 인증서를 다시 시작하거나 인증서를 다시 로드하도록 지시하는) certbot 구성에 배포 후크 스크립트를 추가할 수 있습니다. 이는 인증서가 처음 생성될 때 certbot 명령줄에서 지정하거나 나중에 /etc/letsencrypt/renewal/mydomain.com.conf에 수동으로 추가할 수 있습니다.
직접 해보진 않았지만 그냥 그런 것 같아요...
deploy-hook = /usr/local/sbin/updatewebscoketserver
[renewalparams]
파일 끝의 해당 섹션 아래에 있습니다.
(스크립트는 직접 작성하셔도 됩니다.)
웹 서버와 동일한 uid로 웹 소켓 서버를 실행해야 합니까?