Cent OS Let`s Encrypt SSL Install

Let’s Encrypt 무료 SSL 인증서 발급

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

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

Let’s Encrypt란?

https://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)

Let’s Encrypt 설치

  1. Certbot은 EPEL (Enterprise Linux 용 추가 패키지)에 패키지되어 있습니다. Certbot을 사용하려면 먼저
    EPEL 저장소를 활성화 해야 합니다 . RHEL 또는 Oracle Linux에서는 선택적 채널을 활성화해야 합니다.
1
2
# 필요시 아래와 같이 활성화해 줍니다.
$ yum install epel-release
  1. Certbot을 인스톨합니다.
1
$ yum install certbot python2-certbot-apache
  1. 인증서를 설치합니다.

Apache의 설정이 자동으로 검출되어 아래와 같이 도메인이 리스트업되므로 설치할 대상 도메인의 번호를 선택합니다.
발행된 인증서는 /etc/letsencrypt/live/ 디렉토리 밑에 위치합니다.

1
2
# 이 명령을 실행하면 인증서가 생기고 Certbot이 Apache 구성을 자동으로 편집하여 서비스를 제공 (참고용)
$ certbot --apache
  1. Apache구성을 수동으로 편집하기 위해서 certonly옵션으로 인증서를 설치합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
$ 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): example@gmail.com # 관리자용 이메일주소를 입력합니다 (최초 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: example.herokuapp.com # 아파치에 설정된 도메인 리스트가 자동으로 나열됩니다.
2: www.example.herokuapp.com

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

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

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

1
2
3
4
5
6
7
8
9
10
$ cd /etc/letsencrypt/live
$ ls

|--example.herokuapp.com
| |--cert.pem
| |--chain.pem
| |--fullchain.pem
| |--privkey.pem
| |--README
|--README
  1. Apache설정

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

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

ssl.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#
# When we also provide SSL we have to listen to the
# the HTTPS port in addition.
#
Listen 443 https # 확인

...

# <VirtualHost _default_:443>
# 아래와 같이 수정합니다.
<VirtualHost *:443>
DocumentRoot "/var/www/html/" # 확인
ServerName YOUR_MAIN_DOMAIN:443 # 확인
SSLEngine on # 확인
</VirtualHost>
  1. https통신에서 사용하는 443/tcp 포트를 오픈합니다.
1
$ firewall-cmd --add-service=https --permanent  && firewall-cmd --reload
  1. 발행한 SSL인증서를 도메인별로 설정합니다.
1
$ vi /etc/httpd/conf.d/httpd-vhosts-le-ssl.conf # <vhost-ssl-YOUR_DOMAN_NAME.conf형식으로 작성 (multi 도메인 적용을 위해)

httpd-vhosts-le-ssl.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin example@gmail.com
ServerName example.herokuapp.com
ServerAlias example.herokuapp.co.kr
ServerAlias www.example.herokuapp.com
ServerAlias www.example.herokuapp.co.kr
DocumentRoot /home/www/

#DocumentRoot /var/www/html/example.herokuapp.com
<Directory "/home/www/main/">
AllowOverride FileInfo
Require all granted
</Directory>

ErrorLog logs/virtual-ssl-error_log
CustomLog logs/virtual-ssl-access_log combined env=!no_log

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/example.herokuapp.com/cert.pem # SSL인증서
SSLCertificateKeyFile /etc/letsencrypt/live/example.herokuapp.com/privkey.pem # 개인키
SSLCertificateChainFile /etc/letsencrypt/live/example.herokuapp.com/chain.pem # 중간CA증명서
</VirtualHost>
</IfModule>
  1. httpd데몬을 재기동해 줍니다.
1
$ systemctl restart httpd  

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

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

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

1
$ vi /etc/httpd/conf/extra/httpd-vhost.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<VirtualHost *:80>
ServerAdmin example@gmail.com
ServerName example.herokuapp.com
ServerAlias example.herokuapp.co.kr
ServerAlias www.example.herokuapp.com
ServerAlias www.example.herokuapp.co.kr
DocumentRoot /home/www/

<Directory "/home/www/main/">
AllowOverride FileInfo
Require all granted
</Directory>

RewriteEngine on # 추가
RewriteCond %{SERVER_NAME} =example.herokuapp.com [OR]
RewriteCond %{SERVER_NAME} =example.herokuapp.co.kr [OR]
RewriteCond %{SERVER_NAME} =www.example.herokuapp.com [OR]
RewriteCond %{SERVER_NAME} =www.example.herokuapp.co.kr
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
#RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L] # 추가 (이 방법을 많이 사용하는데)
#RewriteRule ^(.*)$ https://www.example.herokuapp.com [R=301,L] # 추가 (제대로 동작하지 않아 직접 입력)
</VirtualHost>

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

1
$ systemctl restart httpd  

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

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

1
$ certbot renew --dry-run

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

1
$ tar cvzf etc_letsencrypt.tar.gz /etc/letsencrypt

crontab을 사용하여 스케쥴링을 자동화합니다.

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

1
2
3
4
$ crontab -e

# 아래의 내용을 추가합니다.
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew
1
2
3
$ systemctl restart crond

$ systemctl status crond

HTTPS가 잘 적용되었는지 확인

웹사이트에 적용되어 있는 SSL인증서의 확인방법 / Chrome developer툴에 의한 확인방법

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

SSL인증서의 확인방법

SSL Server Test

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

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

위에 사이트에 접속해서 테스트하려는 Hostname을 입력하고 Submit을 클릭하면 등급을 확인 할 수 있습니다.
(테스트는 약간의 시간이 걸립니다. 완료되면 등급과 함께 세부항목의 점수를 확인할 수 있습니다.)

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

301 Redirect 동작 확인

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

1
2
3
$ curl -I http://example.herokuapp.com

$ curl -I http://www.example.herokuapp.com

301 Redirect Checker를 이용해서 확인해 봅니다.

http://ohotuku.jp/redirect_checker/

이상으로 Certbot과 Let’s encrypt를 이용해서 SSL인증서의 발행과아파치 웹서버 설정으로 HTTPS를 활성화해 보았습니다.

참조

공유하기