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

또한 이 인증서를 사용해야 하는 웹 소켓 서버도 있습니다. 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로 웹 소켓 서버를 실행해야 합니까?

관련 정보