1월 1일부터 휴가였는데요.
하필 딱 해외에 출국한 그날부터 Lets Encrypt의 SSL 자동 갱신에 오류가 발생하면서
워드프레스 사이트 전체가 다운되었습니다.
SSL이란?
SSL은 SSL(Secure Sockets Layer)의 약자로 일종의 보안 프로토콜로서, 개인정보 보호,
인증, 무결성을 인터넷 통신에 제공합니다. SSL은 TLS(Transport Layer Security)로 발전했습니다.
일반적으로 http로 시작되던 예전의 일반통신에서 인터넷의 해킹 등 위협이 커지면서
보안이 중요하게 되었고, 이에 https라는 규격이 생성되었고, 웹사이트의 표준이 되어가고 있습니다.
일반적으로 개인이 워드프레스와 같은 개인 홈페이지를 만든다면,
예전에는 서버에 웹서버를 올리고 도메인만 달면 됬지만, 이제는 SSL 인증서를 통해서
HTTPS까지 설정해주어야 합니다.
Lets Encrypt
SSL은 SSL 인증서(공식적으로 “TLS 인증서”)가 있는 웹사이트만 실행할 수 있게 되어있습니다.
이 때 SSL 인증서는 사람의 신원을 확인하는 신분증이나 배지와 같은데요.
SSL 인증서는 웹사이트나 애플리케이션 서버가 웹에 저장하고 표시합니다.
이 때 SSL 인증서는 일반적으로 유료로 판매되고 있는데요. Lets Encrypt 사이트에서는
90일 동안 무료로 제공을 해줍니다.
이에 많은 사이트가 Lets Encrypt를 통해서 SSL인증서를 발급받고 있는데요.
일반적으로 Lets Encrypt는 4가지 방법의 인증서 발급을 지원합니다.
- webroot: 사이트 디렉토리 내에 인증서 유효성을 확인할 수 있는 파일을 업로드하여 인증서를 발급하는 방식입니다. 이에 따라서 nginx를 중단시킬 필요가 없지만, 단 인증 명령에 하나의 도메인 인증서만 발급 가능하다는게 단점입니다.
- 웹서버: 웹서버에서 직접 SSL 인증을 실시 하고 웹서버에 맞는 SSL 세팅 값을 부여하는 방법입니다. 발급이나 갱신을 위해 웹서버를 중단시킬 필요가 없고 갱신 시 상황에 맞게 세팅을 자동으로 업데이트할 수 있다는 장점이 있습니다.
- Standalone: 사이트 작동을 멈추고 이 사이트 네트워킹을 이용해 사이트 유효성을 확인해 Let’s Encrypt SSL 인증서를 발급하는 방법입니다. 인증시 80포트로 가상 standalone 웹서버를 띄워 인증서를 발급하며 동시에 여러 도메인을 발급 받을 수 있습니다.
- DNS: 도메인을 쿼리해 확인되는 TXT 레코드로 사이트 유효성을 확인하는 방법입니다.
Lets Encrypt 자동 갱신 오류
한국에 복귀한 다음 오류 로그를 보았더니 자동갱신 스크립트에서 오류가 발생했더라구요.
제가 자동으로 발급받지 않고 수동으로 모든 도메인에 대한 인증서를 발급받아서 발생한 오류였습니다.
아래 블로그의 글을 참고하여 delete 명령어로 Lets Encrypt 인증서를 삭제하고 재설치 했더니 성공적으로 동작하였습니다.
sudo certbot delete –cert-name 도메인.com
위 명령어를 통해서 인증서를 삭제하시면 되구요.
최초 제가 서버를 구축할때 DNS 방식으로 인증을 받아서 이에 따라 자동 갱신이 불가능하더라구요.
DNS 방식의 경우 자동 갱신을 하려면 그에 따라 DNS값도 변경해야 하기 때문입니다.
그래서 이번에는 Webroot 방식으로 인증서를 발급받았습니다.
sudo certbot certonly –webroot -w /var/www/주소 -d 도메인.com
일반적으로 자동인증 확인은 certbot renew –dry-run을 통해서 시뮬레이션 해볼 수 있습니다.
certbot 관련 명령어는 사이트에서 확인 가능합니다.
https://eff-certbot.readthedocs.io/en/stable/using.html
갱신이 잘 되는지 테스트는 아래 명령어를 통해서 해볼 수 있습니다.
sudo certbot certificates
명령어는 상태를 확인하는 것입니다.
sudo certbot renew --dry-run
을 통해서
인증서가 자동 갱신이 가능한지 확인할 수 있습니다.
이상이 없다면 success가 나옵니다.
해당 내용을 Crontab 등으로 등록해놓으면 자동 갱신이 되는데요.
이 때 nginx에서 well-known 사이트를 로케이션에 등록해줘야 합니다.
인터넷에 찾아보니 nginx 기준으로 80포트 설정을 아래와 같이 하면 된다고 합니다.
(멀티 도메인 운용을 위해 letsencrypt.conf로 분리한 것이며, 개별 도메인에 직접 넣으셔도 됩니다).
server {
listen 80;
server_name mydomain.com www.mydomain.com;
access_log /var/log/nginx/access_80.log combined;
include /etc/nginx/snippets/letsencrypt.conf;
location / {
return 301 https://mydomain.com$request_uri;
expires epoch;
}
}
이렇게 하고 /etc/nginx/snippets/letsencrypt.conf 내용은 아래처럼 입력해 줍니다.
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/letsencrypt;
}
보통 /var/www/letsencrypt 사용하는 경우 /var/www/letsencrypt/.well-known/acme-challenge/
를 만들고…/letsencrypt 및 그 아래 퍼미션은 755,
owner는 root:root로 되어 있어야 인증이 된다고 합니다.
sudo nano /etc/nginx/sites-available/default
ubuntu@second-vv:/etc/letsencrypt/renewal$ ls
dorulog.com.conf
nginx의 기본 설정에서 아래를 추가하고 nginx를 재실행 합니다.
sudo service nginx restart
이걸 설정하지 않을 경우 아래와 같이 에러메시지와 함께 갱신이 되지 않습니다.
The Certificate Authority failed to download the temporary challenge files created by Certbot. Ensure that the listed domains serve their content from the provided –webroot-path/-w and that files created there can be downloaded from the internet.
location ~ /\.well-known/acme-challenge/ {
allow all;
root /var/www/letsencrypt;
}
다음번에는 자동 갱신이 잘 동작했으면 좋겠네요.
그럼 잘 사용하시기 바랍니다
3 thoughts on “무료 SSL Lets encrypt 자동 갱신 오류로 인한 워드프레스 다운”