본문 바로가기
개발/리눅스

Let's Encrypt 무료 SSL 인증서

by darksilber 2017. 4. 12.
반응형

출처 - http://doogle.blog.me/220963405181

 

Let's Encrypt 무료 SSL 인증서

최근에 무료로 사용하던 WoSign 멀티 도메인 SSL 인증서가 더 이상 사용할 수 없게 되었습니다. WoSign이 몇 가지 정책을 위반하여 몇몇 보안 인증서들이 더 이상 최신 크롬 브라우저 버전 57부터 사용할 수 없게 된 것이죠. ㅜㅜ

참고 자료: https://security.googleblog.com/2016/10/distrusting-wosign-and-startcom.html


이 때문에 이 인증서를 사용하던 여러 사이트들이 접속 혹은 로그인 시 안전하지 않은 연결이라는 경고 페이지가 뜨게 되었습니다.
당장 일반 사용자들은 사이트 접속을 꺼리게 될게 뻔하기 때문에.. 바로 SSL 인증서를 교체해야 하는데요. 

구매를 하려고 보니 혹시나 하고 무료 SSL로 검색해보니까 이런 게 있네요.


Let's Encrypt라는 사이트인데요. 
무료로 SSL 인증서를 발급받아 사용할 수 있습니다. 게다가 멀티도메인도 지원해서 작은 사이트를 한 서버에서 여러 개 구동하는 경우 매우 유용하게 사용할 수 있습니다.

단점은, SSL 인증서의 유효기간이 3개월이라는 겁니다.
그래서 처음에는 포기하려고 했는데... 자동 갱신하는 방법이 있더라고요. 그래서 바로 적용하게 되었습니다.

1. 웹서버에 적용하기

가장 흔히 사용하는 Ubuntu 14.04에 Nginx 기준으로 설명하겠습니다.
우선 아래 사이트로 접속해야 합니다.
https://certbot.eff.org/

유명한 배포본을 사용하고 있다면 바로 I'm using에 웹서버와 배포본을 선택해서 보시면 됩니다.

우분투 16.04부터는 기본 저장소(repo)에 올라와서 간단히 apt 명령어로 설치할 수 있지만.. 14.04에서는 아래와 같이 터미널에서 명령어를 실행해 실행파일을 다운로드해야 합니다. 쉘에서 실행할 수 있도록 실행 권한 주는 것도 잊지 마시고요.

wget https://dl.eff.org/certbot-auto chmod a+x certbot-auto

와~ 이제 알았는데 네이버 글쓰기 도구에 소스 코드 입력 기능이 들어가 있네요. 와우~

아무튼 이렇게 받은 파일을 바로 실행해 줍니다. 그러면 알아서 필요한 패키지들을 설치하더라고요.

./certbot-auto

이제 SSL 인증서를 발급받아야 하는데요. 방범이 2가지가 있습니다.
하나는 터미널에서 인터랙티브하게 주어진 질문에 답변하면서 발급받는 방식이고요. 아래와 같이 실행하면 됩니다.

./certbot-auto certonly

그러면 나오는 질문에 답변하면서 진행하면 됩니다.
그런데 빠르게 진행하고 싶다면 아래와 같이 사용할 도메인과 웹루트 경로를 넣어서 한 번에 끝내버릴 수도 있습니다.

./certbot-auto certonly --webroot -w /var/www/example -d example.com -d www.example.com -w /var/www/thing -d thing.is -d m.thing.is

-w 뒤에 웹사이트 도큐먼트 루트 경로(webroot)를 입력하고 뒤에 -d 옵션으로 연결된 사이트 주소를 입력하면 됩니다. 여러 개 입력할 수도 있습니다.
멀티도메인으로 HTTPS 기본 포트 443번을 같이 쓰려면 필요한 사이트 정보를 동일하게 계속 이어서 써주면 됩니다.

실행하고 나면 웹사이트 도큐먼트 루트 경로에 도메인 인증을 위한 .well-known 폴더가 생성됩니다. 그리고 이 폴더를 이용해 도메인 인증을 하고 정상적으로 인증되었다면 /etc/letsencrypt 폴더에 보안키와 인증서 등이 설치됩니다.

root@doogle:/etc/letsencrypt/live/www.server.com# ll 합계 12 drwxr-xr-x 2 root root 4096 320 15:04 ./ drwx------ 3 root root 4096 320 15:21 ../ -rw-r--r-- 1 root root 543 320 13:52 README lrwxrwxrwx 1 root root 44 320 15:04 cert.pem -> ../../archive/www.server.com/cert2.pem lrwxrwxrwx 1 root root 45 320 15:04 chain.pem -> ../../archive/www.server.com/chain2.pem lrwxrwxrwx 1 root root 49 320 15:04 fullchain.pem -> ../../archive/www.server.com/fullchain2.pem lrwxrwxrwx 1 root root 47 320 15:04 privkey.pem -> ../../archive/www.server.com/privkey2.pem

Nginx에서는 SSL 인증서를 모두 한파일로 합쳐진 것을 사용하므로 인증서 파일은 fullchain.pem 을 사용해야 합니다.
보안키는 privkey.pem을 사용하면 됩니다.

그다음으로 DH Param 을 생성합니다. (생성하는데 약간 시간이 걸립니다.)

cd /etc/ssl/private openssl dhparam -out www.server.com.dhparam.pem 2048


이후로는 일반적인 Nginx SSL 인증서 설정 과정을 진행하면 됩니다.
참고로 제가 사용하고 있는 Nginx 설정 내용의 일부입니다.

server { listen 443; server_name www.server.com; root /웹서버/도큐먼트루트경로; ssl on; ssl_certificate "/etc/letsencrypt/live/www.server.com/fullchain.pem"; ssl_certificate_key "/etc/letsencrypt/live/www.server.com/privkey.pem"; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA"; ssl_prefer_server_ciphers on; # DH Param은 일부 암호화 알고리듬에 사용되는 커다란 난수 하나를 미리 생성해 두어서 암호화 성능을 향상시키고 보안을 높이는 방법입니다. ssl_dhparam "/etc/ssl/private/www.server.com.dhparam.pem"; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate "/etc/letsencrypt/live/www.server.com/fullchain.pem"; resolver 8.8.8.8 8.8.4.4; # Enable HSTS. This forces SSL on clients that respect it, most modern browsers. The includeSubDomains flag is optional. #add_header Strict-Transport-Security "max-age=31536000"; # HSTS turn on #add_header Strict-Transport-Security "max-age=0"; # HSTS turn off #기타설정들 중략... .... }

맨 마지막에 HSTS (HTTP Strict Transport Security) 설정 부분은 max-age=31536000을 주석을 풀어 켜두면 http 주소로 접속 시 즉시 자동으로 https 주소를 사용합니다.
SSL 보안서버로만 통신하고자 하는 경우 사용하면 편리한 옵션입니다.

이제 SSL 보안서버가 잘 동작하는지 확인해 보겠습니다.
https://www.ssllabs.com/ssltest/

이 사이트에 가면 SSL 보안서버를 테스트할 수 있고 보안 상태나 어떤 브라우저까지 호환이 되는지 알 수 있습니다.

와우! A+ 등급이네요. ㅎㅎ
참고로 위의 사이트는 HSTS 기능을 킨 상태입니다.

2. 인증서 갱신

letsEncrypt SSL 인증서는 기본적으로 90일 동안 사용할 수 있는데요. 이 때문에 자동갱신이 꼭 필요합니다.
갱신은 다음과 같이 하면 됩니다.

./path/to/certbot-auto renew --quiet

이것을 cron이나 systemd 작업으로 등록해서 사용하면 스케줄에 따라 자동으로 갱신할 수 있습니다.
사이트에서는 하루에 2번 갱신하는 것을 권장하고 있는데..
저는 그냥 일주일에 한 번 씩 할 수 있도록 /etc/cron.weekly에 쉘 스크립트로 만들어서 넣어 뒀네요.


소규모로 운영하는 경우 유용하게 사용할 수 있겠다는 생각이 드네요.
letsecnrypt로 좀 더 보안이 강화된 웹 경험을 해보시기 바랍니다. ^^
감사합니다.

반응형

'개발 > 리눅스' 카테고리의 다른 글

[우분투]ssh 포트 변경하기  (0) 2020.01.31
[우분투] 각종 로그 기록 확인  (0) 2020.01.31
우분투 jdk(자바) 설치  (0) 2017.03.03
우분투에 nginx 설치  (0) 2017.03.03
우분투에 vim 설치  (0) 2017.03.03

댓글