Web Server/HTTPS

[Certbot / Let's encrypt] CentOS7 - SSL인증서 적용하기

일편나루 2019. 5. 20. 14:21
반응형

목차 (INDEX)

     

    개요

    Certbot이라는 툴을 사용하여 Let’s Encrypt의 SSL인증서를 발행하고, HTTP통신을 HTTPS로 암호화합니다.

     

    준비

    적용할 독자적인 도메인과 DNS설정이 필요하므로, 아래(⬇)글을 참고해서 사전에 설정을 해주어야 합니다

    CentOS7 - 무료도메인 취득/설정하기 (freenom) (3/10)

     

    설치환경

    CentOS7.3 / Apache

     

    ❶ HTTP / HTTPS란?

    Hypertext Transfer Protocol(HTTP)는 인터넷상의 무수히 존재하는 웹사이트의 데이터를 송수신하는데 필요한 통신 프로토콜입니다.
    이 http통신을 보다 안전하게 수행하기 위한 프로토콜 및 URI스킴을 https라고 하는데, 엄밀하게 말하면 https 자체는 프로토콜이 아니고, SSL/TLS프로토콜에 의해 제공되는 시큐어한 접속상태에서 http통신을 수행하는 것을 말합니다. 이렇게 시큐어한 접속상태를 유지하기 위하여 SSL인증서의 발행이 필요하게 됩니다.

     

    ❷ SSL인증서란?

    서버정보와 서버의 공개키, 인증서를 발행한 인증국의 정보가 서명되어 있는 파일입니다.

    • 서버의 공개키(CSR)와 비밀키(Key)
    • 인증국(CA)가 전자서명한 SSL인증서(CRT)와 중간CA인증서

    서버의 공개키는 클라이언트와의 통신을 암호화하는데 사용하고, 서명은 위조방지를 위해 사용하며 인증서를 발행하는 CA라 불리는 제3자기관이 CSR의 정보를 바탕으로 서명합니다. 중간 CA인증서는 SSL인증서를 발행하는 인증국 또는 그 아래에 있는 별도의 인증국에 의해 서명된 파일인데 필수는 아니지만, 시큐리티 레벨 향상을 위하여 중간CA를 1개이상 사용하는 계층구조를 취하는 인증을 추천합니다.

     

    ❸ SSL인증서 발행과 설정의 흐름

    다음과 같은 순서로 진행됩니다.

    1. 적용할 (웹)서버에서 CSR과 KEY를 작성
    2. CSR을 CA에 송신해서 인증서의 발행을 신청
    3. CA로부터 전자서명된 CRT와 중간CA인증서를 수령
    4. 수령한 인증서류를 웹서버에 설치

     

    ❹ Certbot이란?

    https://certbot.eff.org/

     

    Certbot

    Trying to get a wildcard certificate? Please use the dropdown menus below to get instructions specific to your system, and read those instructions carefully.

    certbot.eff.org

    Certbot은 무료이면서 자동으로 SSL인증서를 발행할수 있는 툴입니다. CSR과 KEY파일 작성부터 웹서버 설정까지 자동으로 처리할 수 있습니다. CRON을 사용하면, 인증서의 갱신작업까지도 완전히 자동화가 가능합니다. 인증서의 서명과 발행은 Let’s Encrypt라고 불리우는 인증국에 의해 처리됩니다.

     

    ❺ Let’s Encrypt란?

    https://letsencrypt.org/

     

    Let's Encrypt - Free SSL/TLS Certificates

     

    letsencrypt.org

    미국의 ISRG(Internet Security Research Group)가 운영하는 무료 SSL인증 서명 및 발행하는 기관이며,
    Cisco, OVH, Mozilla, Google Chrome, Electronic Frontier Foundation, Internet Society, facebook 등 유명기업이 지원하는 비영리단체입니다. (https://letsencrypt.org/sponsors/)
    Let’s Encrypt 인증서의 유효기간이 90일인데, 스크립트설정을 통해서 자동으로 갱신 가능하므로 반영구적으로 유지가능한 인증서라고 할 수 있습니다. 서버상에 스크립트설정이 필요하므로 일반적인 렌털 서버에서의 이용은 어려운 경우가 많거나, 렌털서버업체에서 부가서비스로 제공하기도 합니다. Let’s Encrypt의 발표에 따르면 2019년에 루트인증서는 1억2천만개이상, FQDN은 2억1500만개이상까지 성장할 것이라고 분석하고 있는데, 내용을 보면 SSL인증서 적용이 엄청난 속도로 증가하고 있음을 알 수 있습니다.
    ※ 자세한 내용은 여기 참고: https://letsencrypt.org/2018/12/31/looking-forward-to-2019.html

     

    ❻ 무료인증서와 유료인증서 간단 비교

    무료라고 해서 해독하기 쉬운 암호화방식을 쓴다거나 하는 일은 없으며, 유료/무료와 상관없이 암호화강도는 동일합니다.

    ■ 무료인증서

    ✔︎ 메리트

      - 비용이 들지 않는다
      - Let’s Encrypt의 경우, 스크립트설정으로 자동갱신이 가능(반영구적)

    ✔︎ 디메리트
      - 블랙리스트에 포함되어 기계적으로 발행 불가할 경우 등을 포함 일체의 서포트를 받을 수 없다.
      - 무료로 취득가능하므로 피싱사이트등에서 악용되는 일이 많다
      - 스크립트 설정이 가능할 정도의 전문지식이 있어야 한다.
      - 운영기반의 자금이 기부로 유지되고 있어, 일반적인 인증국에 비해 서비스를 종료할 수 있는 리스크가 높다. (일반적으로..)
      - 부가서비스가 없다(예: 웹사이트보호, 인증국의 과실로 발생한 보안사고에 대한 손해보상 등)

     

    ■ 유료인증서

    ✔︎ 메리트
      - 블랙리스트에 포함되어 기계적으로 발행 불가시 수동으로 대응해주는 등의 서포트를 받을 수 있다.
      - 보다 신뢰성이 높은 인증방식(OV/EV)의 인증서를 선택할 수 있다
      - 유효기간이 최장 2년인 인증서를 구입할 수 있다
      - 부가서비스를 받을 수 있다(예: 웹사이트보호, 인증국의 과실로 발생한 보안사고에 대한 손해보상 등)

    ✔︎ 디메리트
      - 비용이 든다
      - 자동갱신은 거의 대응하지 않는다.


    반응형

     

    이제 실제로 Certbot을 사용하여, Let’s Encrypt에서 발행한 SSL인증서를 우리의 웹서버에 설정합니다.

     

    ❼ 설정

    ■ Certbot의 설치와 SSL인증서 발행

    그럼 Certbot을 사용하여 인증서를 발행해 봅니다.

    https://certbot.eff.org/ 에 접속하여, 자신에게 맞는 software와 system을 선택합니다.

    기본적으로 선택후 나타나는 화면의 지시대로 설치/설정해 나갑니다. (Apache / CentOS/RHEL7)

    Certbot의 설치와 SSL인증서 발행
    Certbot의 설치와 SSL인증서 발행

    Certbot은 EPEL (Enterprise Linux 용 추가 패키지)에 패키지되어 있습니다. Certbot을 사용하려면 먼저 
    EPEL 저장소를 활성화 해야 합니다 . RHEL 또는 Oracle Linux에서는 선택적 채널을 활성화해야 합니다.

    ※ 필요시 아래와 같이 활성화해 줍니다.
    [root@centos7 ~]# yum install epel-release

    ✔︎ Certbot을 인스톨합니다.

    [root@centos7 ~]# yum install certbot python2-certbot-apache

    ...

    Installed:

      certbot.noarch 0:0.31.0-2.el7                     python2-certbot-apache.noarch 0:0.31.0-1.el7  

    ...

    ✔︎  인증서를 설치합니다.

     

    Apache의 설정이 자동으로 검출되어 아래와 같이 도메인이 리스트업되므로 설치할 대상 도메인의 번호를 선택합니다.

    발행된 인증서는 /etc/letsencrypt/live/디렉토리 밑에 위치합니다.

    ※ 이 명령을 실행하면 인증서가 생기고 Certbot이 Apache 구성을 자동으로 편집하여 서비스를 제공 (참고용)
    [root@centos7 ~]# certbot --apache

    Apache구성을 수동으로 편집하기 위해서 certonly옵션으로 인증서를 설치합니다.

    [root@centos7 ~]# certbot --apache certonly
    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): naru@naruhodo.cf         << 관리자용 이메일주소를 입력합니다 (최초 1회만)
    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     << 동의합니다  (최초 1회만)

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    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      <<    뉴스,캠페인등 소식은 받지 않는걸로;  (최초 1회만)

    Which names would you like to activate HTTPS for?      
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    1: naruhodo.cf              <<    아파치에 설정된 도메인 리스트가 자동으로 나열됩니다.
    2: www.naruhodo.cf
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Select the appropriate numbers separated by commas and/or spaces, or leave input
    blank to select all options shown (Enter 'c' to cancel): 1       << 콤마 또는 스페이스로 구분해서 여러개를 입력해도 첫번째만 유효 (여러개의 인증서를 발급할 경우, 하나씩 인증서를 설치합니다)
    Obtaining a new certificate
    Performing the following challenges:
    http-01 challenge for naruhodo.cf
    http-01 challenge for www.naruhodo.cf
    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/naruhodo.cf/fullchain.pem          <<       인증서와 체인이 저장된 곳
       Your key file has been saved at:
       /etc/letsencrypt/live/naruhodo.cf/privkey.pem             <<    개인키 저장된 곳
       Your cert will expire on 2019-08-18. To obtain a new or tweaked              << 유효기간은 2019-08-18일까지
       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

    생성된 인증서를 확인합니다.

    [root@centos7 live]# tree

    /etc/letsencrypt/live

    |--naruhodo.cf

    |  |--cert.pem

    |  |--chain.pem

    |  |--fullchain.pem

    |  |--privkey.pem

    |  |--README

    |--README

    ■ Apache설정

    ✔︎ VirtualHost의 설정

     

    먼저, /etc/httpd/conf.d/ssl.conf파일에서 SSL관련 글로벌 설정을 확인합니다.

    [root@centos7 ~]# vi /etc/httpd/conf.d/ssl.conf
    ...
    Listen 443 https    <<    확인

    #<VirtualHost _default_:443>
    ↓↓↓↓ 아래와 같이 수정합니다.
    <VirtualHost *:443>

    DocumentRoot "/var/www/html/"     <<     확인
    ServerName YOUR_MAIN_DOMAIN:443     <<    확인
    SSLEngine on         << 확인
    ...

    https통신에서 사용하는 443/tcp포트를 오픈합니다.

    [root@centos7 ~]#  firewall-cmd --add-service=https --permanent  && firewall-cmd --reload

    발행한 SSL인증서를 도메인별로 설정합니다.

    [root@centos7 ~]# vi /etc/httpd/conf.d/vhost-ssl-naruhodo.cf.conf      <<    vhost-ssl-YOUR_DOMAN_NAME.conf형식으로 작성 (multi 도메인 적용을 위해)
    <VirtualHost *:443>
        ServerName naruhodo.cf
        ServerAlias www.naruhodo.cf

        SSLCertificateFile /etc/letsencrypt/live/www.naruhodo.cf/cert.pem           << SSL인증서
        SSLCertificateKeyFile /etc/letsencrypt/live/www.naruhodo.cf/privkey.pem      <<    개인키
        Include /etc/letsencrypt/options-ssl-apache.conf
        SSLCertificateChainFile /etc/letsencrypt/live/www.naruhodo.cf/chain.pem        <<    중간CA증명서

        DocumentRoot /var/www/html/naruhodo.cf
        ErrorLog logs/virtual-ssl-error_log
        CustomLog logs/virtual-ssl-access_log combined env=!no_log
    </VirtualHost>

    httpd데몬을 재기동해 줍니다.

    [root@centos7 ~]# systemctl restart httpd  

    테스트용 페이지를 생성한 후 브라우저에서 https로 접속해봅니다.

    [root@centos7 ~]# echo "SSL Certificate Test" > /var/www/html/naruhodo.cf/index.html

    https 적용
    https 적용

    잘 적용된 것을 확인할 수 있을 겁니다.

     

     

    그런데, http://naruhodo.cf로 접속해보면 SSL이 적용되지 않는 체 그대로 노출되고 있습니다. 이제 Redirect설정으로 http로 접속해도 https로 Redirect되도록 설정해 보겠습니다.

     

    ✔︎ http에서 https로 301 Redirect 설정

    SSL 미적용
    SSL 미적용

    https만 설정할 수도 있으나(처음부터 https만 운영하는 경우)할 수도 있으나,
    초기에 http를 운영하다가 https를 적용하는 경우에는 사용자 편의측면에서 http/https 접속가능하게 하고, http로 접속하는 경우에 https로 자동으로 돌려주는 설정을 추가해 줍니다. http 및 https 사이트가 존재하는 것은 유저에게도 어떤 URL이 타당한 것인지 혼란을 초래할 수 있고, 웹 억세스 분석이 어려워지며, SEO에도 악영향을 줄 수 있으므로 반드시 1개의 URL로 운영하는 것이 좋습니다.

     

    80번 포트에 설정한 VirtualHost에 아래의 내용을 추가합니다.

    <VirtualHost *:80>
        ServerName naruhodo.cf
        ServerAlias www.naruhodo.cf
        ...
        RewriteEngine On       <<    추가
        #RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]      << 추가 (이 방법을 많이 사용하는데)
        RewriteRule ^(.*)$ https://www.naruhodo.cf [R=301,L]         << 추가 (제대로 동작하지 않아 직접 입력)
    </VirtualHost>

     

    httpd데몬을 재기동해 줍니다.

    [root@centos7 ~]# systemctl restart httpd  

    여기까지 해주면 기본적인 설정이 완료됩니다.

     

    ❽ HTTPS가 잘 적용되었는지 확인

    ■ 웹사이트에 적용되어 있는 SSL인증서의 확인방법

    ✔︎ Chrome developer툴에 의한 확인방법

    브라우저에서 대상의 URL에 억세스해서 확인 가능합니다

    1. MAC: command+option+I(대문자i) / Windows: F12 or Ctrl+shift+I(대문자i)
    2. Security 탭을 오픈
    3. View certificates을 클릭

    View certificate
    View certificate
    ssl certificate
    ssl certificate

    ■ SSL Server Test

    공용 인터넷상의 SSL 웹 서버 구성에 대한 심층 분석을 수행하는 무료 온라인 서비스를 이용하여 테스트를 진행할 수 있습니다.

    https://www.ssllabs.com/ssltest/index.html 

    ↑ 이 사이트에 접속해서 테스트하려는 Hostname을 입력하고  Submit을 클릭하세요.

    ssl sserver test
    ssl sserver test

    등급은 A등급이 나왔네요.

    Certificate, Protocol Support, Key Exchange, Cipher Strength등 4개 항목에 대한 점수도 알 수 있습니다.  화면을 스크롤해 보면 매우 상세한 정보들을 추가로 알 수 있습니다. 여건이 된다면 내용을 참고로 설정을 보강하여 A+등급에 도전해보는 것도 좋겠습니다.

     

    ■ 유효기간 90일, SSL인증서의 갱신을 자동화

    Certbot은 인증서가 만료되기 전에 자동으로 갱신되도록 구성 할 수 있습니다. 다음 명령을 실행하여 인증서의 자동 갱신을 테스트 할 수 있습니다. (선택)

    [root@centos7 ~]# certbot renew --dry-run
    ...
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ** 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/naruhodo.cf/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.
    [root@centos7 ~]# 

    테스트가 완료되면 정기적으로 백업을 해두라고 권장을 하죠. 백업해 둡니다.

    [root@centos7 ~]# pwd
    /root         <<     각자 편한 곳을 지정하여 백업해 둡니다.
    [root@centos7 ~]# tar cvzf etc_letsencrypt.tar.gz /etc/letsencrypt

    cron job에 등록하여 자동화합니다.

    매일 하루에 두번(정오,자정)씩 갱신해주는 cron job을 등록해 줍니다. (Certbot.org 권장)

    [root@centos7 ~]# crontab -e
    >> 아래의 내용을 추가합니다.
    0       0,12    *       *       *       python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew
    [root@centos7~]# systemctl restart crond
    [root@centos7~]# systemctl status crond 
    ● crond.service - Command Scheduler
       Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
       Active: active (running) since Mon 2019-05-20 21:42:07 JST; 3s ago
     Main PID: 11309 (crond)
       CGroup: /system.slice/crond.service
               └─11309 /usr/sbin/crond -n

    May 20 21:42:07 centos7 systemd[1]: Started Command Scheduler.
    May 20 21:42:07 centos7 crond[11309]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 3% if used.)
    May 20 21:42:07 centos7 crond[11309]: (CRON) INFO (running with inotify support)
    May 20 21:42:07 cento7 crond[11309]: (CRON) INFO (@reboot jobs will be run at computer's startup.)

     

    ❾ 301 Redirect 동작 확인

    ✔︎ 방법 ① :

    브라우저에서 http://naruhodo.cf 로 접속하여, https://www.naruhodo.cf로 자동으로 바뀌는지 확인합니다. 

     

    ✔︎ 방법 ② :

    Command Line에서 확인합니다. (맥북)

    try🐶everything backend$ curl -I http://naruhodo.cf
    HTTP/1.1 301 Moved Permanently
    Date: Wed, 22 May 2019 00:51:40 GMT
    Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/5.4.45
    Location: https://www.naruhodo.cf
    Content-Type: text/html; charset=iso-8859-1

    try🐶everything backend$ curl -I http://www.naruhodo.cf
    HTTP/1.1 301 Moved Permanently
    Date: Wed, 22 May 2019 00:52:22 GMT
    Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/5.4.45
    Location: https://www.naruhodo.cf
    Content-Type: text/html; charset=iso-8859-1

    try🐶everything backend$

    ✔︎ 방법 ③ :

     301 Redirect Checker를 이용해서 확인해 봅니다. >> http://ohotuku.jp/redirect_checker/

    apache redirect check
    apache redirect check

    301 Redirect가 1회 설정되어 있다라고 나옵니다. 설정한 내용대로 나오면 잘 적용된 것입니다.

    301 Redirect
    301 Redirect


     

     

     

     

    이상으로
    Certbot과 Let's encrypt를 이용해서 SSL인증서의 발행과

    아파치 웹서버 설정으로 HTTPS를 활성화해 보았습니다.  

     

    가상호스트환경에서 Redirect설정을 해보려면 아래의 글을 참고하세요

    Apache의 VirtualHost에서 http ⇢ https 로의 Redirect 설정

     

     

     

     

     

     

     

     

    반응형