SSL 보안 인증서 무료 발급 받기 [Let's Encrypt] + 자동 갱신

    Get SSL Security Certificate Free [Let's Encrypt]

    SSL [Secure Socket Layer]

    서버와 사용자(브라우저) 간의 통신을 할 경우 정보를 함호화 하고 도중에 해킹을 통해 정보가 유출이 된다고 하더라도 정보의 내용을 보호할 수 있는 보안 인증 솔루션 기술이라고 생각하시면 됩니다.

    최근 브라우저 제공하는 업체마다 보안 인증서(SSL)가 적용된 [HTTPS(443)://도메인 주소]를 이용하지 않을 경우 사이트의 이미지나 확장자, 첨부파일 등이 제대로 작동되지 않도록 보안 업데이트를 하고 있으며 선택사항이 아닌 이미 강제로 적용을 하고 있습니다. [스크린샷 참고]

    이전에는 [SSL For Free] / [ZeroSSL]에서 무료로 발급해주는 인증서를 이용했다면 이번에는 [Let's Encrypt]에서 무료로 발급해주는 인증서를 이용해보도록 하겠습니다.

    □ Let's Encrypt

    공식 사이트 : https://letsencrypt.org

    간단하게 소개하면 일반의 이익을 위해 실행되는 무료, 자동화된 개방형 인증서(SSL/TLS)를 발급해주는 인증 기관(CA)입니다. 해당 사이트는 "비영리 인터넷 보안 연구 그룹 - ISRG(Internet Security Research Group)"에서 후원받고 제공하는 서비스로 개인 사용자 및 소중 소기업들에게는 매우 고마운 분들입니다.

     

    Let's Encrypt에서는 일반적으로 웹 호스트에서 실행되는 "자동 인증서 관리 환경 - ACME(Automatic Certificate Management Environment)" 프로토콜를 이용합니다. 즉 웹 사이트에서 HTTPS를 사용하기 위해 인증기관(CA)에서 인증서(파일 유형)를 가져와야 하는데 인증서를 받기 위해서는 도메인 소유권을 확인하기 위한 이메일 확인, DNS(CNAME), HTTP(Webroot) 복잡한 과정을 제외하고 Certbot과 같은 클라이언트와 상호 작용하여 쉽게 자동으로 발급 및 갱신을 처리할 수 있는 방식을 말합니다.

     

    □ 인증서 종류

    ※ 인증서에도 종류가 많지만 일반적으로 가장 많이 사용하는 인증서는 3가지 종류가 있습니다. [표 참고]

    종류 영문 표기 사용 용도 도메인(CN) 표시 예
    단일 인증서 Single-Domain SSL 하나의 도메인에만 적용 가능 CN=foxydog.co.kr
    OR www.foxydog.co.kr
    와일드카드 인증서 WildCard SSL 하나의 인증서로 서브 도메인 무제한
    SSL적용 가능, 여러개의 서브도메인을 서버를 나눠서 운영해도 무제한 적용 가능
    CN=*.foxydog.co.kr
    www.foxydog.co.kr
    mail.foxydog.co.kr
    m.foxydog.co.kr...
    ※ 형태로 뒤에 .도메인만 같다면 앞 서브도메인은 무제한 이용 가능
    멀티도메인 인증서 Multi-Domain SSL 하나의 인증서로 여러 도메인 등록가능
    단, 무제한은 아니며 대체로 99개까지 등록 가능
    CN=foxydog.co.kr
    CN=testfoxy.co.kr
    CN=foxytest.com...
    ※ 전혀 다른 도메인으로 등록 가능

     

    □ Certbot

    공식 사이트 : https://certbot.eff.org/

    Let's Encrypt 인증서를 자동으로 발급 및 사용하는 무료 오픈 소스 소프트웨어 도구입니다. 비영리 단체인 Electronic Frontier Foundation (EFF)에서 제작을 하였습니다. 웹서비스, OS별로 설치 및 자동화 매뉴얼을 제공하고 있습니다.


    ※ 테스트(실서버) 환경

    OS : CentOS Stream release 8 (CentOS 8)

    WEB : Server version: Apache/2.4.37 (centos)

    인증서 : certbot을 이용한 단일 인증서(Single-Domain SSL) 발급, 자동 갱신 테스트

     

    STEP01 →EPEL 저장소 추가(또는 업데이트)

    [root@localhost ~]# dnf install epel-release
    Upgraded: epel-release-8-9.el8.noarch

     

    STEP02→필요한 패키지 설치

    ※ 저는 아파치를 이용하므로 아래와 같이 진행 [nginx를 이용한다면 python3-certbot-(nginx) 부분만 변경]

    [root@localhost ~]# dnf install certbot python3-certbot-apache mod_ssl

     

    STEP03 →인증서 받기 [수동 진행]

    ※ 만약 본인이 서버 관리자라면 자동은 되도록 피하는 것이 좋습니다. 자동으로 설정을 변경하기 때문에 예외 변수가 발생할 수 있습니다. 그러므로 인증서 파일만 발급받는 수동 옵션인 [certonly] 이용하는 게 좋습니다.

    ※ 제가 사용하는 메일서버 도메인[mail.foxydog.co.kr]을 예시로 발급받아보겠습니다.

    순서대로 진행

    [root@mail ~]# certbot certonly -d mail.foxydog.co.kr
    Saving debug log to /var/log/letsencrypt/letsencrypt.log
    Error while running apachectl configtest.

    AH00526: Syntax error on line 85 of /etc/httpd/conf.d/ssl.conf: (에러 무시)
    SSLCertificateFile: file '/etc/pki/tls/certs/localhost.crt' does not exist or is empty


    How would you like to authenticate with the ACME CA?
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    1: Apache Web Server plugin (apache) [Misconfigured]
    2: Spin up a temporary webserver (standalone)
    3: Place files in webroot directory (webroot)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Select the appropriate number [1-3] then [enter] (press 'c' to cancel): 2
    Plugins selected: Authenticator standalone, Installer None
    Enter email address (used for urgent renewal and security notices)
    ▷ 긴급 갱신 및 보안 공지에 사용되므로 수신받을 수 있는 이메일 주소를 입력
     (Enter 'c' to cancel): foxydog@foxydog.co.kr

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    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. Do you agree?
    ▷ 서비스 약관 읽고 ACME 서버에 등록하기 위한 절차
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    (Y)es/(N)o: Y (동의)

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Would you be willing, once your first certificate is successfully issued, 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: Y (동의)

    Account registered.
    Requesting a certificate for mail.foxydog.co.kr
    Performing the following challenges:
    http-01 challenge for mail.foxydog.co.kr
    Waiting for verification...
    Cleaning up challenges
    Subscribe to the EFF mailing list (email: foxydog@foxydog.co.kr).

    IMPORTANT NOTES:
     - Congratulations! Your certificate and chain have been saved at:
    ▷ 축하합니다! 인증서와 체인이 다음 위치에 저장되었습니다. (메시지가 나와야 정상 생성)
       /etc/letsencrypt/live/mail.foxydog.co.kr/fullchain.pem
       Your key file has been saved at:
       /etc/letsencrypt/live/mail.foxydog.co.kr/privkey.pem
       Your certificate will expire on 2021-08-12. To obtain a new or
    ▷ 인증서 만료일은 [2021-08-12] (무료 인증서이기 때문에 3개월 기준으로 새로 발급받아야 한다.)
       tweaked version of this certificate in the future, simply run
       certbot again. To non-interactively renew *all* of your certificates, run "certbot renew"
    ▷ 인증서가 만료되면 "certbot renew" 통해 갱신이 가능합니다.
     - 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

    [참고] ※ 에러 발생 시

    ① 방화벽에 의한 실패 [국가]

    에러 메시지 : An unexpected error occurred:

    ValueError: Requesting acme-v02.api.letsencrypt.org/directory: Network is unreachable

    해결방안 : acme-v02.api.letsencrypt.org 사이트 IP가 해외이므로 요청을 처리하기 위해서는 앞단 방화벽이 있을 시 국가일 경우는 미국(US)을 허용할 것

     

    ② 80 포트 사용으로 인한 실패

    에러 메시지 : Problem binding to port 80: Could not bind to IPv4 or IPv6.

    해결방안 : 사이트 요청 처리하기 위해서는 80 포트를 사용, 다만 중복이 불가하므로 이미 사용 중인 해당 포트 아파치(Apache), Nginx 프로세스가 실행되고 있다면 중지 후 진행

     

    ③ 잘못된 도메인 주소 또는 A(AAAA) 레코드 응답 실패

    에러 메시지 : Challenge failed for domain mail.foxydog.com, Some challenges have failed.

    해결방안 : 인증을 받기 위해서는 실제 존재하는 도메인으로 연결이 되어야 합니다. 본인이 사용하는 도메인을 잘못 적었거나 혹은 레코드 연결이 A(AAAA) IP 연결이 제대로 되어 있지 않아 홈페이지 연결이 되지 않으면 해당 에러 메시지가 발생할 수 있습니다.

     

    STEP04 →인증서 파일 생성 확인

    [root@mail ~]# ls -al /etc/letsencrypt/live/mail.foxydog.co.kr/ | grep pem
    lrwxrwxrwx 1 root root  42 May 14 14:08 cert.pem -> ../../archive/mail.foxydog.co.kr/cert1.pem
    lrwxrwxrwx 1 root root  43 May 14 14:08 chain.pem -> ../../archive/mail.foxydog.co.kr/chain1.pem
    lrwxrwxrwx 1 root root  47 May 14 14:08 fullchain.pem -> ../../archive/mail.foxydog.co.kr/fullchain1.pem
    lrwxrwxrwx 1 root root  45 May 14 14:08 privkey.pem -> ../../archive/mail.foxydog.co.kr/privkey1.pem

    ※ 소프트 링크로 걸려있으며 실제 파일 경로는 아래와 같습니다. Certbot을 이용하여 자동으로 연장 설정하기 위해서 다음과 같은 방식을 사용하는 것 같습니다. 만약 다른 서버에 인증서를 설치해야 할 경우는 아래 파일을 복사하여 사용하시면 됩니다.

    [root@mail ~]# ls -al /etc/letsencrypt/archive/mail.foxydog.co.kr/ | grep pem
    -rw-r--r-- 1 root root 1850 May 14 14:08 cert1.pem
    -rw-r--r-- 1 root root 3749 May 14 14:08 chain1.pem
    -rw-r--r-- 1 root root 5599 May 14 14:08 fullchain1.pem
    -rw------- 1 root root 1704 May 14 14:08 privkey1.pem

     

    STEP05 인증서 적용

    ※ 인증서가 문제없는지 개인적인 테스트 화면입니다.

     

    ① Apache ssl.conf 인증서 설정하기

    [root@mail ~]# vim /etc/httpd/conf.d/ssl.conf

     

      5 Listen 443 https  [수정 X]

     40 <VirtualHost _default_:443>  [▷ 시작 지점]

     43 DocumentRoot "/home/roundcube"  [홈페이지 경로 변경]
     44 ServerName mail.foxydog.co.kr  [도메인 네임 이름 변경]

     54 SSLEngine on
     85 SSLCertificateFile /etc/letsencrypt/live/mail.foxydog.co.kr/cert.pem  [인증서(CRT) 경로 변경]
     93 SSLCertificateKeyFile /etc/letsencrypt/live/mail.foxydog.co.kr/privkey.pem  [인증서(KEY) 경로 변경]

    102 SSLCertificateChainFile /etc/letsencrypt/live/mail.foxydog.co.kr/chain.pem  [체인 인증서(CA) 경로 변경]

    202 </VirtualHost>  [◀끝 지점(이 범위 안에 각 옵션 포함 적용)]

     

    ② Apache 재시작

    [root@mail ~]# systemctl restart httpd

     

    ③ 웹 HTTPS://도메인주소 접속 확인, 브라우저는 에지(Edge)에서 접속

     

    STEP06 인증서 만료 시 갱신 및 (Crontab) 자동 갱신 등록 (정상 확인)

     

    ① 인증서 만료 시 갱신 (renew 명령어 이용)

    [root@mail ~]# certbot renew

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

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Processing /etc/letsencrypt/renewal/mail.foxydog.co.kr.conf
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Cert not yet due for renewal

    ▷ 인증서 갱신 기간이 아닙니다.

     

    ※ 실제로 기간이 만료되어 정상 갱신이 되었을 경우

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Congratulations, all renewals succeeded:

      /etc/letsencrypt/live/mail.foxydog.co.kr/fullchain.pem (success)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    The following certificates are not due for renewal yet:
      /etc/letsencrypt/live/mail.foxydog.co.kr/fullchain.pem expires on 2021-08-12 (skipped)
    No renewals were attempted.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    ※ 명령어는 제대로 실행되었지만 발급받은 지 얼마 되지 않았기 때문에 "인증서 갱신 기간이 아닙니다."라는 메시지가 호출이 되네요. 인증서를 처음 발급받았을 때 자동으로 등록되는 환경설정(파라미터) 값을 확인해봅니다.

    [root@mail ~]# vi /etc/letsencrypt/renewal/mail.foxydog.co.kr.conf

    # renew_before_expiry = 30 days (만료 전 갱신일이 30일로 되어 있음)
    version = 1.14.0
    archive_dir = /etc/letsencrypt/archive/mail.foxydog.co.kr
    cert = /etc/letsencrypt/live/mail.foxydog.co.kr/cert.pem
    privkey = /etc/letsencrypt/live/mail.foxydog.co.kr/privkey.pem
    chain = /etc/letsencrypt/live/mail.foxydog.co.kr/chain.pem
    fullchain = /etc/letsencrypt/live/mail.foxydog.co.kr/fullchain.pem

    # Options used in the renewal process
    [renewalparams]
    account = 개인 값
    authenticator = standalone
    server = https://acme-v02.api.letsencrypt.org/directory

    즉, 발급받은 날 3개월 기준으로 최소 60일이 경과되어야 재발급을 받을 수 있다는 뜻이 됩니다. 물론 강제로 재발급받는 명령어가 있지만 신용도에는 좋지 않으므로 권고하지 않습니다.

     

    ② (Crontab) 자동 갱신 등록

    먼저 자동 실행 스크립트 파일을 하나 만듭니다. 저는 별도의 경로를 만들어서 저장하겠습니다.

    [root@mail ~]# mkdir /root/script

    [root@mail ~]# vi /root/script/letsencrypt.sh

    !/bin/sh
    systemctl stop httpd
    sleep 10
    certbot renew
    sleep 10
    systemctl start httpd

    :wq (값 입력 후 저장)

    ※ 혹시나 중간에 행 걸리는 것을 막기 위해 약간의 텀을 주었으며, 아파치를 재시작하는 이유는 앞서 말씀드렸듯이 발급 또는 갱신 시 80 포트를 중복으로 사용하지 못하므로 아파치 중지-인증서 갱신-아파치 시작 순으로 작성합니다. 다른 웹서비스일 경우도 동일합니다. 또한 리눅스 방화벽에 80 포트를 오픈 해야 합니다.

     

    Crontab 이 실행할 수 있도록 권한을 부여합니다.

    [root@mail ~]# chmod +x /root/script/letsencrypt.sh

    [root@mail ~]# ls -al /root/script/ | grep letsencrypt.sh
    -rwxr-xr-x  1 root root  84 May 20 14:33 letsencrypt.sh

    Crontab 편집 모드 에서 만들었던 스크립트를 등록 합니다.

    [root@mail ~]# crontab -e

    01 00 */80 * * /root/script/letsencrypt.sh

    :wq (값 입력 후 저장)

    [root@mail ~]# crontab -l
    01 00 */80 * * /root/script/letsencrypt.sh

    ※ 제대로 등록 되었는지 확인을 하시고, 저의 경우는 80일마다 오전 00시 01분에 실행되도록 등록, 안전하게 [70 초과~90 미만] 일 사이의 숫자로 사용자에 맞게 등록하시면 될 것 같습니다.

     

    ③ Crontab 정상 실행 확인 (80일 경과 후 확인 예정)

    [root@mail ~]# cat /var/log/cron-(로테이션) | grep letsencrypt.sh

    cron-20210801:Aug  1 00:01:02 mail CROND[33847]: (root) CMD (/root/script/letsencrypt.sh)

    정상 실행

     

    STEP07 인증서 갱신 모의 테스트

    renew 갱신이 제대로 작동이 되지는 테스트할 수 있는 --dry-run 기능 옵션이 있습니다.

    [root@mail log]# certbot renew --dry-run
    Saving debug log to /var/log/letsencrypt/letsencrypt.log

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Processing /etc/letsencrypt/renewal/mail.foxydog.co.kr.conf
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Cert not due for renewal, but simulating renewal for dry run
    Plugins selected: Authenticator standalone, Installer None
    Simulating renewal of an existing certificate for mail.foxydog.co.kr
    Performing the following challenges:
    http-01 challenge for mail.foxydog.co.kr
    Waiting for verification...
    Cleaning up challenges

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    new certificate deployed without reload, fullchain is
    /etc/letsencrypt/live/mail.foxydog.co.kr/fullchain.pem
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Congratulations, all simulated renewals succeeded:

    ▷ 축하합니다. 모든 시뮬레이션된 갱신이 성공했습니다. (메시지가 나와야 정상)
      /etc/letsencrypt/live/mail.foxydog.co.kr/fullchain.pem (success)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

     

    마치며

    ZeroSSL(SSL For Free) 보다는 훨씬 간편하며, 무료 인증서이지만 스크립트를 설정하면 자동으로 갱신까지 가능합니다. 최근 보안 감사에서 HTTPS 사용을 권고 시 하고 있기 때문에 많은 업체들이 인증서 관련 문의가 많아지고 있습니다. 개인적인 사이트 또는 호스팅 서비스를 받고 있다면 굳이 비용을 들이지 말고 무료 인증서를 사용해보는 것은 어떨까요?

    Designed by JB FACTORY