Blog categories

Comments

[SSL] 워드프레스에 Let’s Encrypt 적용

[SSL] 워드프레스에 Let’s Encrypt 적용

시작하기 전에

sudo apt-get update && sudo apt-get upgrade

Let’s Encrypt 설치

1. git 설치

sudo apt-get install git

2. Git에서 letsencrypt 저장소 복제

sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

3. 폴더로 이동

cd /opt/letsencrypt

Let’s Encrypt SSL 인증서 생성

일반적인 방법

sudo -H ./letsencrypt-auto certonly --standalone -d example.com -d www.example.com

주의할 점은 let’s encrypt SSL의 경우 wildcard (*) 를 지원하지 않기 때문에 -d 옵션을 사용하여 모든 sub-domain을  등록해주어야 한다.

인터넷에 따르면 등록은 20개 까지 가능한데, 문자열에 길이에 따라 등록 가능 수는 달라질 수 있다고 한다.

아파치 서버 사용 시

sudo -H ./letsencrypt-auto certonly --apache -d example.com -d www.example.com

Nginx 사용 시

sudo -H ./letsencrypt-auto certonly --nginx -d example.com -d www.example.com
Image module

관리자 이메일 주소 입력

Image module

약관 동의

Image module
Image module

SSL 발급이 성공적으로 이루어졌습니다.

Let’s Encrypt SSL 인증서 확인

rony@sangron:~$ sudo ls /etc/letsencrypt/live
sangron.com
rony@sangron:~$ sudo ls /etc/letsencrypt/live/sangron.com
cert.pem  chain.pem  fullchain.pem  privkey.pem  README

아파치 서버와 SSL 연동

1. conf 파일 생성

root@sangron:/etc/apache2/sites-available# cp default-ssl.conf example.com.conf

2. conf 파일 편집

<IfModule mod_ssl.c>
    <VirtualHost *:443>
        SSLEngine On
        SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
        SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

        ServerAdmin example@example.com
        ServerName example.com
        ServerAlias *.example.com

        ...
    </VirtualHost>
</IfModule>

3. conf 파일 연결

root@sangron:/etc/apache2/sites-available# cd ../site-enable
root@sangron:/etc/apache2/sites-enable# ln -s ../site-avaiable/example.com.conf example.com.conf

Apache2.conf 파일에서 실제 설정은 enable 폴더에 값을 가져옴.

4. Apache SSL 사용

rony@sangron:~/letsencrypt$ a2enmod ssl
Considering dependency setenvif for ssl: Module setenvif already enabled Considering dependency mime for ssl: Module mime already enabled Considering dependency socache_shmcb for ssl: Enabling module socache_shmcb. Enabling module ssl. See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates. To activate the new configuration, you need to run: service apache2 restart root@li-01:~/letsencrypt#
rony@sangron:~/letsencrypt$ a2ensite example.com

5. Apache 재시작

root@sangron:/etc/apache2# service apache2 restart

워드프레스 SSL 인증서 연동

SSL 인증서 지원 플러그인 설치

플러그인 활성화

Image module

인증서 연동 확인

Openssl 사용

openssl s_client -CApath /etc/ssl/certs/ -connect example.com:443

웹사이트를 이용한 SSL Server Test

웹브라우저에서 확인

Image module

크롬 브라우저 사용 시 주소창 앞에 초록색 자물쇠 아이콘과 함께 안전함 글자 표기됨을 볼 수 있다.

Image module

다음과 같이 인증서 내용을 볼 수 있습니다.

Letsencrypt에서 certbot 사용

root@sangron:/opt/letsencrypt# ./certbot-auto certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Found the following certs:
  Certificate Name: sangron.com
    Domains: sangron.com tech.sangron.com www.sangron.com
    Expiry Date: 2018-00-00 00:00:00+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/sangron.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/sangron.com/privkey.pem
-------------------------------------------------------------------------------

SSL 자동 갱신

Let’s Encrypt 인증서의 경우 무료로 제공되는 대신 90일 마다 인증서 갱신이 필요하다. 리눅스의 crontab을 이용하여 매달 주기적으로 인증서 갱신 작업을 예약하면, 관리자가 매번 수동으로 인증서를 갱신할 필요가 없다.

echo '@monthly root /opt/letsencrypt/letsencrypt-auto certonly --quiet --standalone --renew-by-default -d example.com -d www.example.com >> /var/log/letsencrypt/letsencrypt-auto-update.log' | sudo tee --append /etc/crontab

Apache 사용자의 경우

echo '@monthly root /opt/letsencrypt/letsencrypt-auto certonly --quiet --apache --renew-by-default -d example.com -d www.example.com >> /var/log/letsencrypt/letsencrypt-auto-update.log' | sudo tee --append /etc/crontab

전체 갱신

/opt/letsencrypt/letsencrypt-auto renew

아래는 crontab에서 쓰일 수 있는 키워드 목록이다.

string meaning
@reboot Run once, at startup.
@yearly Run once a year, “0 0 1 1 *”.
@annually (same as @yearly)
 @monthly  Run once a month, “0 0 1 * *”.
 @weekly  Run once a week, “0 0 * * 0”.
 @daily  Run once a day, “0 0 * * *”.
 @midnight  (same as @daily)
 @hourly  Run once an hour, “0 * * * *”.

2023-07-31

앞서 작성한 아래의 방식대로 SSL 인증서 갱신 작업 시 다음과 같은 오류가 발생하여 갱신이 진행되지 않음.

Requesting to rerun /opt/letsencrypt/letsencrypt-auto with root privileges…
Your system is not supported by certbot-auto anymore.
certbot-auto and its Certbot installation will no longer receive updates.
You will not receive any bug fixes including those fixing server compatibility
or security problems.
Please visit https://certbot.eff.org/ to check for other alternatives.

대신에 /usr/bin 의 certbot을 사용하여 갱신을 진행할 수 있다.

sudo certbot renew

주기적으로 인증서를 갱신하기 위하여 Crontab을 이용하여 갱신 작업을 예약한다.
자세한 사용 방법은 상단에 crontab 키워드를 참고할 수 있다.

먼저 Crontab 에 새로운 작업을 추가하기 위해서 crontab 작업 문서를 연다.

sudo crontab -e

매월 1일 2시에 인증서 갱신 예약

0 1 2 * * /usr/bin/certbot renew --renew-hook="sudo systemctl restart apache2"

Crontab 작업 목록 보기

sudo crontab -l

갱신 도중 다음과 같은 애러가 발생할 수 있다.

Attempting to renew cert (sangron.com) from /etc/letsencrypt/renewal/sangron.com.conf produced an unexpected error: Problem binding to port 443: Could not bind to IPv4 or IPv6.. Skipping.

이는 인증서 초기 발급 시 standalone으로 발급받아서 발생하는 애러이다. 실제 인증서의 내용을 살펴보면 아래와 같다.

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/sangron.com.conf
-------------------------------------------------------------------------------
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator standalone, Installer None
Renewing an existing certificate
Performing the following challenges:
tls-sni-01 challenge for sangron.com
tls-sni-01 challenge for tech.sangron.com
Cleaning up challenges

대신에 인증서를 해당하는 서버 버전으로 적용하여 재발급 하면 갱신이 가능하다.

apache 서버를 사용한다고 가정한다면 인증서의 내용이 아래와 같이 출력되어야 한다.

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/sangron.com.conf
-------------------------------------------------------------------------------
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator apache, Installer apache
Renewing an existing certificate
Performing the following challenges:
tls-sni-01 challenge for sangron.com
tls-sni-01 challenge for tech.sangron.com
tls-sni-01 challenge for www.sangron.com
Waiting for verification...
Cleaning up challenges

인증서 자동 갱신이 수행되지 않을 경우 Let’sencrypt renewal 폴더의 configure 파일내에 인증서 관련 정보가 정확히 작성되어 있는지 확인한다.

root@sangron:~# cd /etc/letsencrypt/renewal
root@sangron:/etc/letsencrypt/renewal# cat sangron.com.conf
version = ~~
archive_dir = ~~
cert = ~~
privkey = ~~
chain = ~~
fullchain = ~~

# Options used in the renewal process
[renewalparams]
authenticator = apache
installer = apache
account = ~~
server = https://~~

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

div#stuning-header .dfd-stuning-header-bg-container {background-image: url(https://tech.sangron.com/wp-content/uploads/sites/2/2018/04/ubuntu_wallpaper_background.jpg);background-color: #3f3f3f;background-size: cover;background-position: top center;background-attachment: initial;background-repeat: no-repeat;}#stuning-header div.page-title-inner {min-height: 350px;}