SKILL/Security

LETSENCRYPT 에서 SSL 인증서를 무료로 발급 받아 웹 서버에 적용하기

밍글링글링 2018. 5. 17.
728x90
LETSENCRYPT 에서 SSL 인증서 무료로 발급 받아 웹서버에 적용하기 [Version.apach2]

 

1. SSL 인증서, Letsencrypt란?

웹사이트를 서비스 한다면, SSL 인증서를 도입 하여 사용자와 서버 간의 통신을 HTTPS를 통해 암호화 하는 것 정도는 매우 당연한 시대가 되었습니다.

SSL 인증서를 알기 위해서, 먼저 간단하게 암호화 통신에 대해 알아 봅시다.

HTTP를 포함해 서버와 클라이언트 간의 데이터 통신을 할 경우, 암호화를 하지 않는다면 모든 데이터는 평문 (plain text)로 전송을 하게 됩니다.

예를 들어, 여러분이 어떤 웹사이트에 로그인을 할 때, 아이디 및 비밀번호를 입력 후 로그인버튼을 누르는 순간, 여러분이 입력한 데이터를 서버에 전송합니다. 이 때, 해당 로그인 요청 이 암호화 되지 않은 HTTP Request 라면, 전송하는 TCP 패킷의 데이터는 암호화가 적용되지 않고 전송이 됩니다.

여러분의 컴퓨터에서 출발한 패킷은 여러 대의 라우터를 거쳐 서버에 도달하게 되는데, 중간의 어딘가에서 만약 전송되는 모든 패킷을 캡쳐하고 있다면, 여러분의 아이디 및 패스워드는 누군가에게 쉽게 탈취당할 수 있다는 의미입니다.

파일 전송을 위해 많이 사용되는 FTP의 경우에도, 만약 파일 1개를 전송할 때 발생한 모든 패킷을 캡쳐하여 필요없는 헤더를 잘라내고 데이터 부분만 합치면 실제 전송된 파일과 똑같은 파일이 만들어집니다.

이렇게 패킷을 탈취하는 것을 패킷 스니핑 이라고 합니다.

이러한 보안상의 헛점을 보완하기 위한 기술이 암호화 기술입니다.

암호화를 적용하면, 서버와 클라이언트 간의 통신 데이터가 모두 암호화가 되기 때문에 패킷 스니핑을 당하더라도, 범인은 데이터의 내용을 알 수 없게 됩니다.

흔히 리눅스 등의 서버에 접속하는 SSH 역시 암호화하여 접속하는 프로토콜이기 때문에, 여러분이 입력하는 명령어나, 화면에 출력되는 서버의 내용들은 안전하게 암호화 통신을 하고 있습니다. (SSH는 SSL인증서를 이용하지는 않고, 조금 간단하게 서버와 클라이언트에 저장 된 1쌍의 암호화 키 만을 이용함니다.)

SSL 인증서는 클라이언트와 서버간의 통신을 제3자가 보증해주는 전자화된 문서입니다. (유명한 제3자로 Symantec 등이 있습니다.)

SSL 인증서를 사용하기 위해서는 보통 유료로 구매를 해야 합니다.

이를 무료로 사용 가능하게 해 주는 Letsencrypt는, “전 세계 모든 사이트를 HTTPS로 만들기!” 라는 슬로건으로 시작 된 오픈소스 프로젝트입니다. 2015년 12월 공개 베타 서비스를 시작하였습니다.

이 글을 읽으시는 분들이라면, Openssl로 자신이 서명해서 발급한 사설인증서 (Self signed certificate)를 떠올리실 수 있으실텐데, 이렇게 발급한 사설인증서의 경우 공개 웹사이트에 적용시, 브라우저에 따라 “이 사이트는 신뢰할 수 없는 SSL 인증서를 사용하고 있기 때문에 접속을 차단합니다.” 등의 메세지를 보게 된다는 것을 아실겁니다. 물론 해당 사이트의 도메인을 “예외 적용” 등을 하면, 제대로 암호화 통신을 하는 SSL 인증서를 사용할 수는 있습니다만, 불특정 다수를 위해 서비스 하는 웹 사이트에서는 절대로 사용하면 안되는 방법입니다.

Letsencrypt는 전 세계의 누구에게든, “무료”로 SSL 인증서를 발급해 줍니다. 이 인증서는 제대로 인증된 중개 기관 및 Root CA와의 체인이 되어, 공개적인 웹 사이트에서 사용할 수 있습니다.

Letsencrypt 사이트 링크

개인적으로 몇 달간 FTPS(SSH를 사용하는 SFTP가 아닌, SSL 인증서로 암호화 통신을 하는 프로토콜)로도 잘 사용 하였습니다.

다만 단점이 존재하는데, 아래와 같은 제한이 있습니다. (2016년 7월 기준)

  • 인증서의 최대 유효 기간은 90일 -> 3개월에 한 번씩은 인증서를 갱신해 주어야 합니다.
  • certonly를 이용해 인증서만을 발급받을 경우, 80번 및 443번 포트의 사용을 중지 -> Letsencrypt의 Apache모듈 등을 사용하지 않고 certonly를 사용할 경우, 현재 서비스 중인 웹 서비스를 중단해야 할 수 있습니다.
  • Asterisk (*.minibrary.com)을 사용할 수 없음 -> 서브 도메인을 만들어 SSL 인증서를 사용하려면, 해당 도메인을 위한 인증서를 발급 받아야 합니다.

기업등의 서비스를 위한 이용은 조금 무리일 수 있겠습니다만, 자신의 웹사이트 혹은 블로그 등을 위해서는 매우 흥미로운 프로젝트입니다.

이제 실제로 어떻게 Letsencrypt를적용 하는지 알아보겠습니다.

 

2. 외부에서 도메인으로 접속 가능한 웹 서버 구동

현재 저의 블로그는 모두 Github로 이전하였고, 딱히 운영중인 웹 사이트나 서버가 없는 관계로, nginx를 설치 하고 기본 페이지로 설명을 하겠습니다.

먼저, 서비스를 할 도메인은 test.mingty.com 이라고 정하겠습니다.

웹 브라우저에서 접속해 봅니다.

현재는 http://test.mingty.com 으로 접속이 됩니다.

이제부터 본격적인 시작입니다.
 
3. Letsencrypt 설치

 

아래 링크로 가시면, 공식 설명이 나와 있습니다. 이 포스트에서는 Ubuntu 16.04 기준으로 설명합니다.

https://certbot.eff.org/#ubuntuxenial-nginx

 

Certbot

Tagline

certbot.eff.org

아래 명령어로 letsencrypt를 설치 합니다.

sudo apt update -y && sudo apt install letsencrypt -y

 

4. SSL 만들기

Letsencrypt는 인증서 발급 절차로 몇 개의 모듈을 제공하고 있습니다.

가령 Apache로 웹서버를 운영 중이라면, Letsencrypt Apache 모듈을 통해 서버의 중지 없이 자동으로 인증서를 발급 및 설정이 됩니다. (Apache 모듈은 테스트 해보지는 않았습니다.)

저는 자동화가 아닌, 수동으로 test.minibrary.com을 위한 SSL 인증서를 발급 받아 보겠습니다.

이 방법은 letsencrypt certonly를 사용하는데, 앞서 설명 드렸지만 certonly를 사용하기 위해서는 80번 포트가 사용중이지 않아야 합니다. 만약 80번 포트가 다른 서비스에서 사용 중이라면 아래와 같이 에러가 나며 인증서 발급이 되지 않습니다.

먼저 nginx를 멈추고, 어떤 포트가 사용 중인지 보겠습니다.

sudo systemctl stop nginx

 

netstat -ant

위 그림과 같이 nginx를 멈추고 나니, 22번 및 25번 포트만 사용 중입니다.

이제 test.mingty.com을 위한 Letsencrypt SSL Certificate를 만들겠습니다.

sudo letsencrypt certonly --standalone -d test.mingty.com

먼저, 인증서와 관리자의 e-mail 주소를 입력합니다.

서비스 이용 조건에 동의할지 결정합니다. 동의하지 않으면 진행이 안되므로, Agree를 누릅니다.

그리고 잠깐 기다리면 인증서 발급이 완료 됩니다.

정말 간단합니다

발급받은 인증서는 /etc/letsencrypt/archive/도메인명/ 의 디렉토리에 저장되어 있고, 실제 사용할 때에는 /etc/letsencrypt/live/도메인명/의 디렉토리에 있는 symlink들을 사용할 것을 추천합니다.

5-1. SSL을 Apache2에 적용하기 [VER. Apache2 ]

예시로 테스트한 적용 방법을 빗대어 설명하겠다.

경로: /etc/apach2/sites-available 위치에 admin.mingty.com.conf

<IfModule mod_ssl.c>
        NameVirtualHost *:443
        <VirtualHost *:443>
                ServerName admin.mingty.com
                ServerAdmin webmaster@localhost

                #DocumentRoot /var/www/html

                # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
                # error, crit, alert, emerg.
                # It is also possible to configure the loglevel for particular
                # modules, e.g.
                #LogLevel info ssl:warn

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                # For most configuration files from conf-available/, which are
                # enabled or disabled at a global level, it is possible to
                # include a line for only one particular virtual host. For example the
                # following line enables the CGI configuration for this host only
                # after it has been globally disabled with "a2disconf".
                #Include conf-available/serve-cgi-bin.conf

                #   SSL Engine Switch:
                #   Enable/Disable SSL for this virtual host.
                SSLEngine on

                #   A self-signed (snakeoil) certificate can be created by installing
                #   the ssl-cert package. See
                #   /usr/share/doc/apache2/README.Debian.gz for more info.
                #   If both key and certificate are stored in the same file, only the
                #   SSLCertificateFile directive is needed.

                SSLCertificateFile      /etc/letsencrypt/live/admin.koreanfoodcontest.com/fullchain.pem
                SSLCertificateKeyFile /etc/letsencrypt/live/admin.koreanfoodcontest.com/privkey.pem

                #   Server Certificate Chain:
                #   Point SSLCertificateChainFile at a file containing the
                #   concatenation of PEM encoded CA certificates which form the
                #   certificate chain for the server certificate. Alternatively
                #   the referenced file can be the same as SSLCertificateFile
                #   when the CA certificates are directly appended to the server
                #   certificate for convinience.
                #SSLCertificateChainFile /etc/letsencrypt/live/admin.koreanfoodcontest.com/fullchain.pem

위와 같이 나머지는 주석처리하고, SSLCertificateFile와 SSLCertificateKeyFile 두 개만 적용되도록 하였다.

그 후, sudo a2ensite admin.koreanfoodcontest.com.conf 

내가 사용했었던 history이다. 참고하도록 하자.

  368  sudo service apache2 restart
  369  sudo a2enconf ssl
  370  sudo a2enmod ssl
  371  sudo service apache2 restart
  372  vi sites-available/admin.koreanfoodcontest.com.conf 
  373  vi ports.conf 
  374  sudo vi ports.conf 
  375  sudo /etc/init.d/apache2 restart
  376  vi sites-available/admin.koreanfoodcontest.com.conf 
  377  sudo vi sites-available/admin.koreanfoodcontest.com.conf 
  378  sudo a2dissite admin.koreanfoodcontest.com.conf 
  379  sudo /etc/init.d/apache2 restart
  380  sudo a2ensite admin.koreanfoodcontest.com.conf 
  381  sudo /etc/init.d/apache2 restart

아래, 빨간 글씨로 된 부분을 추가하도록 하자.

#If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 80

<IfModule ssl_module>
        Listen 443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 443
</IfModule>

<IfModule mod_ssl.c>
        Listen 443
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

그 후 리스타트를 하면 적용된다.

5-2. SSL을 nginx에 적용하기 [VER. nginx ]

이제 발급받은 SSL 인증서를 nginx에 적용 해 보겠습니다.

nginx의 server 블럭에 아래 와 같이 내용을 추가 합니다. 

listen 443 ssl default_server; listen [::]:443 ssl default_server;  ssl_certificate     /etc/letsencrypt/live/test.minibrary.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/test.minibrary.com/privkey.pem; ssl_protocols       TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers         HIGH:!aNULL:!MD5;

위 설정은 가장 기본적으로 SSL 인증서 적용 테스트 만을 위한 목적입니다.

443번 포트로 접속을 받고, ssl_certificate 및 ssl_certificate_key를 방금 발급 받은 Letsencrypt의 fullchain.pem 및 privkey.pem 으로 설정해 줍니다.

설정을 저장 하고, nginx를 시작, 혹은 재시작 하고 열려있는 포트를 확인해 봅시다.

 

sudo systemctl start nginx
 
netstat -ant​

43번 포트가 열렸습니다.

이제 웹 브라우저에서 https://test.mingty.com 으로 접속해 보겠습니다.

접속이 잘 됩니다. 눈여겨 보실 점은, 빨간 원 안의 자물쇠 표시 입니다. 이는 해당 웹사이트가 SSL 인증서를 통해 암호화 통신을 하고 있다는 의미입니다.

자물쇠를 눌러 보시면, 해당 웹사이트에서 사용 중인 SSL 인증서의 상세 내용을 보실 수 있습니다.


이상으로 간단하게 Letsencrypt 에서 SSL 인증서를 무료로 발급 받아 웹 서버에 적용하는 방법을 알아 보았습니다.

 

출처: https://kr.minibrary.com/353/

728x90

'SKILL > Security' 카테고리의 다른 글

SSL 보안 인증서 발급 - CSR 발급  (0) 2018.05.17
[SPRING] ch04. 로그인  (0) 2017.09.21
[SPRING] ch03. OS 명령어  (0) 2017.09.21
[SPRING] ch02. SQL Injection - 방어  (0) 2017.09.21
[SPRING] ch01.SQL Injection - 공격  (0) 2017.09.21

댓글