만족

[Apache] Letsencrypt로 ssl 인증서 발급 및 등록하기와 인증서 갱신 문제 본문

[Apache] Letsencrypt로 ssl 인증서 발급 및 등록하기와 인증서 갱신 문제

Backend/기타 Satisfaction 2021. 11. 8. 00:13

Attempting to renew cert (secret.kr) from /etc/letsencrypt/renewal/secret.kr.conf produced an unexpected error: The manual plugin is not working; there may be problems with your existing configuration. The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.',). Skipping.
sudo certbot renew

인증서 유효 기간이 30일도 남지 않아 갱신을 해 주려 했는데 위와 같은 오류가 발생했다.

 

원인

처음 인증서를 생성할 때 나는 DNS의 TXT형식에 특정한 문자열을 집어넣는 방식(manual)으로 도메인 소유를 인증했다.

 

그런데 인증서를 재 갱신할때는 이 과정을 다시 반복해야 하는데,

서버는 내 DNS 수정 권한이 없다.

 

따라서 이 방법으로 소유를 인증하지 않고, 자동으로 특정 파일을 생성하여 인증하는 방식으로 바꿔야 한다.

 

해결법: 재발급

안타깝게도 인증서는 재발급 받아야 한다.

 

sudo certbot certonly --webroot -w [웹루트경로] -d [도메인명]

위 명령어를 이용해 자동인증을 거쳐 인증서를 새로 발급받을 것이다.

(맨 위의 auth 오류가 뜨는 이유는 --manual 옵션과 함께 생성했기 때문이다)

(manual로 인증서를 설치하지 않고 자동으로 인증과 설치를 완료해야 renew를 사용할 수 있다)

 

웹루트경로는 만약 test.com 에서 접근하는 폴더가 /var/www/html/test/일 경우

/var/www/html/test로 하고, 도메인명은 test.com을 입력하면 된다.

 

sudo certbot certonly --webroot -w /var/www/html/test -d test.com

 

이제 certbot이 자동으로 /var/www/html/test에 특정 파일을 생성하고 인증하여, 인증서 발급 작업을 마칠 것이다.

 

그런데 위 명령어가 오류가 날 수도 있다.

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: 비밀입니다
   Type:   unauthorized
   Detail: Invalid response from
   http://비밀입니다/.well-known/acme-challenge/sadfgslaiewu5o23i4uw
   [IP ADDRESS]: "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML
   2.0//EN\">\n<html><head>\n<title>403
   Forbidden</title>\n</head><body>\n<h1>Forbidden</h1>\n<p"

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A/AAAA record(s) for that domain
   contain(s) the right IP address.

기본 보안 설정에서 숨김 파일(.로 시작하는 파일)에는 접근하지 못하게 해 두었다면,

.well-known에 대해서는 허용해주어야 정상적으로 인증할 수 있다.

 

/etc/apache/apache.conf

...

<FilesMatch "^\.ht">
        Require all denied
</FilesMatch>
<DirectoryMatch "^\.|\/\.(?!(well-known))">
        Require all denied
</DirectoryMatch>

...

 

DirectoryMatch부분을 찾아 금지할 경로 정보를 위와 같이 변경한다.

 

기존: ^\.|\/\.
변경: ^\.|\/\.(?!(well-known))

 

이렇게 변경하고 아파치를 재시작한다.

 

sudo service apache2 restart

 

.으로 시작하는 경로는 접근하지 못하게 하되, 단 .well-known이라는 경로는 허용하겠다는 의미이다.

 

정상적으로 .well-known만 필터링하지 않게 변경되었다.

 

sudo certbot certonly --webroot -w /var/www/html/test -d test.com

 

다시 인증서 발급을 시작하면 403 응답은 발생하지 않을 것이다.

 

sudo certbot certificates

위 명령어를 통해 현재 발급된 인증서 목록을 확인할 수 있다.

 

여기까지 잘 따라왔다면 이제 발급한 인증서를 apache에 연동시켜줘야 한다.

 

https는 443포트를 사용하므로 해당 포트에 대해 추가로 설정을 해줘야 한다.

 

sudo nano /etc/apache2/sites-available/000-default.conf

 

기존에 http(80번 포트)에 설정된 값이 다음과 같다고 하면,

<VirtualHost *:80>
        ServerName [DOMAIN]
        DocumentRoot [PATH]
</VirtualHost>

 

다음 내용을 추가한다

 

<VirtualHost *:443>
        ServerName [DOMAIN]
        DocumentRoot [PATH]

        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/[DOMAIN]/cert.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/[DOMAIN]/privkey.pem
        SSLCACertificateFile /etc/letsencrypt/live/[DOMAIN]/fullchain.pem
</VirtualHost>

이렇게 하면 https 연결에 대해서 지정한 ssl 인증서를 사용할 수 있게 된다.

 

이 부분을 설정하지 않으면 https연결이 불가능하거나,

가능은 하지만 '인증서를 신뢰할 수 없음' 오류가 날 수 있으므로 반드시 설정해줘야 한다.

 

sudo service apache2 restart

이제 아파치를 재시작해주면 인증서 적용이 완료된다.

 

만약 여기서 오류가 난다면, 에러 메시지에 표시되는 명령어의 내용을 통해 원인을 파악하고 수정해보자.

 

자동으로 인증서 갱신하기

sudo certbot renew

위 명령어를 이용해 인증서를 업데이트할 수 있다.

 

기간은 90일이고, 남은 기간이 30일 이내일 때 갱신할 수 있다.

 

이걸 손으로 매번 해주기는 귀찮으므로,

crontab으로 자동화해보자.

 

https://jdm.kr/blog/2

 

리눅스 크론탭(Linux Crontab) 사용법 :: JDM's Blog

* 이 포스팅은 네이버 블로그에서 작성(2013.04.01)한 내용을 옮겨온 것입니다. 오늘은 리눅스 크론탭에 대해 알아볼까 합니다. 음, 윈도우에서는 스케줄러와 비슷하다고 보면 되겠네요. "특정 시간

jdm.kr

 

crontab의 기본 사용법은 위 링크를 참조하자.

 

sudo crontab -e

>에디터가 열리면 맨 아래에 다음 명령어 추가
0 4 * * 1 certbot renew
5 4 * * 1 service apache2 restart

위의 두 줄을 추가함으로써,

매주 월요일 새벽 4시에는 인증서 갱신, 새벽 4시 5분에는 아파치 재시작이 이루어진다.

 

물론 이렇게 하면 아파치가 재시작 되는 동안 (짧은 시간이긴 하지만)
유저는 서버와 통신할 수 없게 된다.

 

서비스 중단 없이 인증서를 교체할 수 있는 방법에 대해서는 조금 더 생각해 봐야겠다.



Comments