연구실 홈페이지를 Docker에 WordPress를 올려 운영하고 있다.
다행히 어렵지 않다.
많은 부분이 이전의 WebDAV 작업과 겹쳐서 상당수 내용을 그대로 사용하되 지엽적인 부분은 생략하였다.
(2020. 10. 18. 현재 인증서 자동갱신 관련해 변한 부분이 이 글에 적용되지 않았다.
이 글이 수정되기 전 까지는 위의 링크에서 확인하기 바란다)
순서는 다음과 같다.
- DNS를 통한 DNS Challenge 수행
- 인증서 자동갱신 설정
- 웹서버에 SSL 인증서 등록
- HTTPS Redirection
1. DNS Challenge 수행
일반적인 Challenge는 certbot에서 자동으로 수행되지만 DNS Challenge는 사용자가 직접 DNS에 Challenge용 Record를 등록한 후에야 Challenge가 수행된다.
아래는 certbot을 이용해 DNS Challenge를 수행하는 커맨드이다.
물론 apt-get install certbot으로 먼저 프로그램을 설치해야 한다.
$ certbot certonly --manual \ --preferred-challenges dns \ --server https://acme-v02.api.letsencrypt.org/directory \ --agree-tos -m <E-mail@add.ress> \ -d <Doname.Name>
위 과정에서 다음과 같은 결과가 나오는데
다음과 같이 _acme-challenge.<Domain.name>.com의 내용을 DNS의 TXT 레코드로 넣어주면 된다.
그 이후 계속 인증을 진행하면 된다.
방화벽 등에 문제가 없다면 다음과 같이 인증이 잘 되어있을 것이다.
그 결과 /etc/letsencrypt/live/<Domain> 디렉터리에는 다음의 네 가지 pem (Private Encrypted Mail) 파일이 생성된다.
- cert.pem – 인증서
- privkey.pem – 개인키
- chain.pem – 인증서 발급자의 인증서
- fullchain.pem – cert + chain
2. 인증서 자동갱신 설정
crontab을 통해 인증서를 자동갱신하도록 설정한다.
물론 컨테이너에 crontab이 설치되어있지 않을테니 다음과 같이 crontab을 먼저 설치한다.
$ apt-get install cron
이후에는 다음과 같은 방법으로 짝수달의 15일 새벽 4시마다 인증서를 갱신하고 웹서버를 재시작할 수 있다 (예시).
본인의 인증 프로그램이나 경로, OS, 웹서버에 맞추어 수정해 사용하면 된다.
Docker에서 제공하는 WordPress 이미지를 사용한 경우는 거진 Debian Linux에 Apache2를 사용하고 있을 것이다.
$ sudo crontab -e > 0 4 15 */2 * /usr/bin/certbot renew --renew-hook="sudo service apache2 reload"
3. 웹서버에 SSL 인증서 등록
아무래도 Apache다보니 방법은 크게 어렵지 않다.
/etc/apache2/sites-available에 위치한 default-ssl.conf를 복사해 letsencrypt-ssl.conf(예시)를 만들어 내용을 수정한 뒤 enable해주면 된다.
편의를 위해 아래에는 수정한 내용만 기록하였다.
(중략) ServerAdmin <이메일> (중략) SSLCertificateFile /etc/letsencrypt/live/<도메인>/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/<도메인>/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/<도메인>/chain.pem SSLCACertificateFile /etc/letsencrypt/live/<도메인>/fullchain.pem
다 끝이 났다면 작성한 conf를 활성화하고 ssl 모듈을 enable하여 SSL을 적용해야 한다.
$ a2ensite > letsencrypt-ssl (예시) $ a2enmod ssl $ service apache2 reload
4. HTTPS Redirection
/etc/apache2/sites-available/000-default.conf에서 트래픽을 HTTPS로 리다이렉션하는 코드를 추가하면 된다.
코드는 다음과 같다.
RewriteEngine On RewriteCond "%{HTTPS}" !=on RewriteRule "^/(.*)" "https://%{SERVER_NAME}/$1" [R=301,L]
이후 아파치 서비스를 재시작하면 된다.
$ service apache2 reload
cf. Real Simple SSL 플러그인
여기까지 잘 됐으면 WordPress를 https로 서비스할 수 있다.
하지만 필자는 여기에 Real Simple SSL 프,ㄹ러그인을 추가로 설치하고 운용하는 것을 추천한다.
이 플러그인은 SSL 설정과 관련한 것들을 관리해준다.
예를 들어 .htaccess 수정을 막는다든가 하는 것들이다.