Linux/Unix/BSD2019.04.15 14:19

Let's Encrypt 소개

Let's Encrypt (https://letsencrypt.org/)에서 무료로 SSL 서버 인증서를 발급받을 수 있습니다.
무료로 발급받은 SSL 서버 인증서는 3개월간 유효하고, 이후에는 재발급을 받아서 기간을 연장해야만 합니다.

SSL 인증서 설치 방법

도메인 등록자 이메일을 통해서는 계정당 1개의 인증서만 무료로 받을 수 있습니다.
하지만, "certbot"을 이용하면 서버에 직접 설치하여 간단하게 서버별로 SSL 인증서를 발급받고, 주기적으로 재발급 처리가 가능합니다.

"certbot"의 설치

설치하기에 앞서 반듯이 EPEL repository가 활성화 되어 있어야 합니다.

yum -y install yum-utils epel-release

yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional

아파치 서버 플러그인과 함께 certbot을 설치합니다.

sudo yum install -y certbot python2-certbot-apache ```

외부 인터넷을 사용할 수 없는 서버를 위하여 certbot 설치에 필요한 rpm들을 다운로드 받을 수 있습니다.

sudo yum install certbot python2-certbot-apache --downloadonly --downloaddir=/root/certbot ```

SSL 서버 인증서 발급

인증서 발급을 위해서는 당연한 것이지만, 외부에서 해당 웹서버에 접속이 가능해야 하고, 웹서버에서는 다음 두 곳에 대하여 https (443) 포트로 접속이 가능해야만 합니다.

173.239.79.196  supporters.eff.org
# 인증서 발급
114.108.191.65  acme-v02.api.letsencrypt.org
# 인증서 재발급
114.108.191.65  acme-staging-v02.api.letsencrypt.org

인증서를 발급받기 전에 "httpd.conf" 및 가상 호스트 설정에서 "ServerName"의 설정이 신청하려는 호스트 이름과 동일하게 설정되었는지 확인이 필요합니다.

"certbot" 명령을 이용하여 다음과 같이 인증서를 발급받습니다.

certbot --apache certonly -d wb.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): hanwh@wb.com
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for wb.com
Waiting for verification...
Cleaning up challenges
Resetting dropped connection: acme-v02.api.letsencrypt.org

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/wb.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/wb.com/privkey.pem
   Your cert will expire on 2019-07-10. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

첫 번째에서 서버 관리자 이메일 주소를 입력합니다.
두 번째 질문은 약관 동의하는 것으로 "A" 응답합니다.
세 번째는 입력한 서버 관리자 이메일로 EFF 뉴스 등의 뉴스레터 수신 동의를 묻는 것으로 "N"으로 응답합니다.
이후 웹서버를 자동으로 확인하여 인증서를 발급받게 됩니다.

아래는 "httpd.conf" 파일의 "ServerName" 등이 신청한 호스트 이름과 맞지 않는 경우 발생하는 오류입니다.

certbot --apache certonly -d wb.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for wb.com
Cleaning up challenges
Unable to find a virtual host listening on port 80 which is currently needed for Certbot to prove to the CA that you control your domain. Please add a virtual host for port 80.

apache에 SSL 서버 인증서 적용하기

SSL 서버 인증서 적용

앞서 발급된 SSL 서버 인증서를 apache에 적용하기 위하여 "ssl.conf" 파일을 수정합니다.

vi /etc/httpd/conf.d/ssl.conf

ServerName wb.com:443

SSLCertificateFile /etc/letsencrypt/live/wb.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/wb.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/wb.com/fullchain.pem

수정을 완료한 후에 apache 서비스를 재시작합니다.

systemctl restart httpd

SNI (Server Name Indication) 설정

당연하게도 SSL 인증서는 2차 서브 도메인당 1개만 유효합니다.
따라서, 한 IP에 여러 도메인 이름이 할당된 경우에는 각 도메인별로 SSL 인증서를 생성하여 적용해야만 합니다.

각 2차 도메인별로 VirtualHost를 구성하는 것은 문제가 되지 않지만, 최근에는 SNI (Server Name Indication)를 이용하여 요청된 서버 이름과 일치하는 인증서를 사이트 방문자에게 보내도록 간소화된 프로세스가 지원된다.

ssl.conf 파일에 다음 내용이 적용되어 있어야만 한다.

# Ensure that Apache listens on port 443
Listen 443

# Listen for virtual host requests on all IP addresses
NameVirtualHost *:443

# Accept connections for these vhosts from non-SNI clients
SSLStrictSNIVHostCheck off

Forward Secrecy 설정

보안성 향상을 위한 "Forward Secrecy"를 설정하려면 다음과 같은 추가 설정이 필요합니다.

SSLHonorCipherOrder on
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"

SSL 서버 인증서 검증하기

아파치에 적용한 SSL 서버 인증서를 https://www.ssllabs.com/ssltest/analyze.html 에서 검증하여 볼 수 있습니다.

https://www.ssllabs.com/ssltest/analyze.html?d=wb.com&latest

아래는 SSL 서버 인증서 검증 결과 화면 예입니다.

!web_ssl05.png!

"A" 등급이 나오지 안았다면, 보고서 화면의 링크를 클릭하여 상세한 정보를 확인 후, 관련 설정 등을 수정하여 "A" 등급으로 만들 수 있습니다.

SSL 서버 인증서 갱신하기

인증서 갱신 시험하기

인증서 발급을 받은 후, 60일 이전에 갱신을 시도하면 아래와 같이 정상적으로 갱신이 가능한지 확인이 불가능합니다.

certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/wbimage.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/wbimage.com/fullchain.pem expires on 2019-07-10 (skipped)
No renewals were attempted.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

인증서 갱신이 가능한지 확인하기 위하여 아래와 같이 "--dry-run" 옵션을 추가하여 실행합니다.

certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/wbimage.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator apache, Installer apache
Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for wbimage.com
Waiting for verification...
Cleaning up challenges
Resetting dropped connection: acme-staging-v02.api.letsencrypt.org

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed with reload of apache server; fullchain is
/etc/letsencrypt/live/wbimage.com/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/wbimage.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.

인증서 자동 갱신 설정

앞에서와 같이 인증서 갱신 시험이 성공적으로 완료되면, "crontab"에 2달마다 자동으로 인증서가 갱신되도록 다음과 같이 설정합니다.

crontab -e
0 4 15 */2 * certbot renew

위와 같이 설정하면 2개월마다 15일 새벽 4시에 인증서 갱신 작업을 처리하게 됩니다.

참고자료



Posted by 채윤아빠