[Ubuntu] Let’s Encrypt 를 사용하여 무료로 SSL 사이트를 구축하는 방법

HYEONG HWAN, MUN/ 10월 2, 2016/ 미분류/ 80 comments

웹은 계속 발전하고 있으며, 여러 새로운 기술이 끊임 없이 등장하고 있다.

이 글에서는 웹 기술 중 하나인 SSL (Secure Socket Layer) 에 대해서 이야기 해 보고자 한다.

ssl1

< 그림 : OSI Model 에서 SSL 의 위치 >

 

정확히 말해서 SSL 은 전송계층과 (Transport Layer) 응용계층 (Application Layer) 사이에서 동작한다. Transport 에서 패킷을 받으면 -> SSL 에서 패킷의 암호를 해독하고 -> Application 에게 전달하는 것이다.

SSL 을 세션계층(Layer 5), 표현계층(Layer 6)으로 분류하는 사람도 있고, 응용계층(Layer 7)으로 분류하는 사람도 있다. 나름대로 주장에 대한 근거가 일리 있으니 여기서는 따로 정확히 분류하지는 않겠다. 확실한건 Transport 와 Application 의 사이라는 것.

 


I) 어떻게 SSL 은 암호화 통신을 하는가?

- 쉽게 말하자면 SSL 은 “보안인증서” 라고 말할 수 있다.

- 사람으로 비유하자면 보안인증서암호화코드가 내장된 주민등록증이라고 볼 수 있다.
요즘 대부분의 편의점이나 술집에서는 주민등록증 진위여부 판독기를 가지고 있다.

- 암호학에서 “비대칭키 암호화 방식” 이라는 것이 있다. 어떤 문자를 A 로 암호화하면 B 로만 해독할 수 있는 것이다.
일반적으로 암호화에 사용하는 것을 “암호화키” 라고 부르며 이것은 암호통신에서 공개되기 때문에 “공개키” 또는 “공개 암호화키”, “Public Key” 라고도 부른다.

참조 (RSA_암호) : https://ko.wikipedia.org/wiki/RSA_%EC%95%94%ED%98%B8

ssl2

[1] 클라이언트가 서버에 접속한다.

[2] 서버가 보안인증서를 제공한다.

[3] 클라이언트가 서버가 제출한 보안인증서의 유효성을 파악한다. 최상위 발급 기관과 통신하여 유효성을 확인한다. (최상위 발급기관은 운영체제 또는 웹브라우저에 미리 정의되어 있다.)

ssl-161024

< 그림 : 서버에서 제공한 인증서가 유효하지 않다면 클라이언트는 검증오류로 인해 통신을 중단한다 >

[4] 보안인증서가 유효하면 인증서에 쓰여져 있는 공개 암호화키 A 를 사용하여 클라이언트 자신의 공개 암호화키 C 를 암호화 하여 전송한다.

[5] 서버는 전송된 암호화 구문을 자신만 가지고 있는 해독키(개인 비밀키) B 를 통해서 해독한다.

[6] 해독한 메세지가 유효한 요청이고 클라이언트의 공개 암호화키 C 를 포함하고 있다면 암호화키 C 를 사용하여 잘 받았다는 메세지를 암호화해서 응답한다.

[7] 클라이언트는 자신만 가지고 있는 해독키(개인 비밀키) D 를 통해서 해독한다. 서버에서 받은 응답 메시지가 유효하다면 클라이언트는 A 를 통해 암호화해서 메세지를 보내고, 서버는 C 를 통해 암호화해서 메세지를 보낸다. A키로 암호화된 메세지는 B키로만 해독이 가능하고, C키로 암호화된 메세지는 D키로만 해독이 가능하므로 서로 종단간(End-to-End) 암호화 통신이 성립하는 것이다.

 

SSL이 적용된 사이트는 “종단간 암호화” 가 적용되기 때문에 중간 패킷 감청으로부터 안전하다. (해독키가 없으므로 메세지 해석이 불가능.)

 

보안인증서(SSL) 최상위 발급기관은 매우 많으며, 전세계 점유율은 다음 표와 같다.

참조 : https://en.wikipedia.org/wiki/Certificate_authority

market

< 그림 : World SSL Issuer Market Share >

참고로 이 블로그는 점유율 7위의 StartCom 보안인증서를 사용하고 있다.

mac-ssl

 


최상위 발급기관중 하나인 Let’s Encrypt 를 사용하여 SSL 을 발급받아 사이트에 적용하는 방법을 설명하겠다.

Let’s Encrypt 는 점유율 0.1% 미만의 인증기관이다.(점유율이 매우 낮음) 하지만 발급절차가 간단하고, 무료이기 때문에 점유율이 점차 늘어나지 않을까 싶다.

Let’s Encrypt의 점유율 (Market Share) : https://w3techs.com/technologies/details/sc-letsencrypt/all/all




II) SSL 발급 및 적용 방법

암호화 통신 이론에 대해서 알아보았으니 이제 실제로 적용을 해보도록 하자.

 

인증서 발급 프로그램을 서버에 설치해야한다.

Let’s EncryptUbuntu 16.04 LTS 에서 기본패키지로 추가되었다. 따라서 쉽게 설치할 수 있다.
반면 Ubuntu 14.04 LTS 에서는 기본패키지가 아니기 때문에 몇 줄 더 입력해야 한다.

 

발급, 설치, 적용 방법은 다음과 같다.
모든 단계는 Linux root 계정으로 진행한다.

 

1. 인증서 발급 프로그램 설치하기

- Ubuntu 14.04 일 경우

# cd /root
# wget https://dl.eff.org/certbot-auto
# mv certbot-auto /usr/bin/letsencrypt
# chmod 755 /usr/bin/letsencrypt

start1

 

 

- Ubuntu 16.04 일 경우

# apt-get install letsencrypt

start2

 

2. 인증서 발급 프로그램을 사용하여 인증서 발급받기

인증서는 Domain Control Validation 을 거쳐야 발급받을 수 있다. 당신이 도메인이 없다면 인증서를 발급받을 수 없다.
Domain Control Validation 은 주로 다음의 3가지 방법으로 이루어진다.

참고 : Domain Control Validation 의 3가지 방법 (https://support.comodo.com/?/Knowledgebase/Article/View/791)

Let’s Encrypt 는 위의 도메인 인증방법 중 3번째HTTP(HTTPS)-based DCV 를 사용하여 인증한다.

 

따라서 먼저 해당 도메인에 대한 HTTP 접속이 가능해야 한다.

서버를 처음 세팅하는 경우 HTTP 를 먼저 설정한 다음에 -> 인증서를 발급받고 -> HTTPS 를 추가 설정하는 단계를 거쳐야 할 것이다.

이미 HTTPS 를 사용하고 있을 경우 -> 인증서를 발급받고 -> HTTPS 인증서 교체 하는 단계를 거쳐야 할 것이다.

 

명령 실행시 1회에 한해 인증관련 프로그램이 추가설치될 수 있다.
*예제 1 :

# letsencrypt certonly --webroot --webroot-path=/home/ssl-demo-1404/www -d ssl-demo-1404.lael.be

*예제 2 :

# letsencrypt certonly --webroot --webroot-path=/home/ssl-demo-1604/www -d ssl-demo-1604.lael.be

*예제 3 :

# letsencrypt certonly --webroot --webroot-path=/home/banana/www -d banana.com -d www.banana.com

*예제 4 :

# letsencrypt certonly --webroot --webroot-path=/home/laelbe/blog -d lael.be -d www.lael.be -d blog.lael.be -d myhome.lael.be

 

* 명령어 설명

-d 는 도메인명을 지정하면 된다. 최대 100개의 도메인 이름을 지정할 수 있다. (한 인증서가 서로다른 100개의 도메인 인증을 할 수 있음) 일반적으로는 기본도메인과 www 도메인 두개를 지정한다.

-webroot 는 웹인증을 받을 것이라는 것이다. 외부 인증프로그램이 -d 에 지정된 도메인 사이트에 접속한다.

-webroot-path 는 웹루트의 경로이다. 보통 index 페이지가 위치하는 경로이다. 인증 프로그램이 이 경로에 임시 랜덤 파일을 생성하고, 외부 인증프로그램이 이 파일을 접근할 수 있다면 Domain Validation 이 되는 것이다.

 

명령이 실행되면 다음 화면이 표시된다.

비상연락처 : 인증에 문제가 생겼거나, 인증서 만료기간이 가까웠을때 갱신 알림 메일을 수신할 주소이다.

start3

약관에 동의하면 즉시 인증서가 발급된다.

발급에 실패했다면 외부 접속이 문제가 있거나 -webroot-path 를 올바르게 입력하지 않았을 것이다.

 


Let’s Encrypt 인증 오류 발생시 다음의 사항을 확인한다.

다음의 문서로 이동해서
# Allow Lets Encrypt Domain Validation Program
설정이 되어있는지 확인하여라.

Apache 사용자의 경우 : https://blog.lael.be/post/73#apache2.conf
Nginx 사용자의 경우 : https://blog.lael.be/post/2600#myuser1.conf





- Ubuntu 14.04 발급성공

start4

- Ubuntu 16.04 발급성공

start5

 

/etc/letsencrypt/live/[인증서명]/ 위치에 발급된다.
cert.pem - 인증서 파일
chain.pem - 인증서 발급자 파일
fullchain.pem - cert.pem 과 chain.pen 을 하나로 합쳐놓은 파일
privkey.pem - 인증암호를 해독하는 개인키


#TIP : 이때 발급된 인증서 파일은 웹서버 인증서(HTTPS), 메일서버 인증서(IMAPS, POP3S, SMTPS), VPN서버 인증서(SSTP), 윈도우 원격데스크톱 인증서(MSTSC), Gitlab, OwnCloud 등의 용도로 사용 할 수 있다. (인증서 만료시 갱신해야하는 번거로움이 생기겠지만..)

ssl5

Apache2 서버에서는 cert.pem, chain.pem, privkey.pem 을 사용합니다.
Nginx 서버에서는 fullchain.pem, privkey.pem 을 사용합니다.

 

Apache2 적용방법https://blog.lael.be/post/73 13번 항목을 참조한다.


    SSLEngine on
    SSLProtocol all -SSLv2 -SSLv3
    SSLCipherSuite 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

    SSLHonorCipherOrder on

    SSLCertificateFile "/etc/letsencrypt/live/mysitename.com/cert.pem"
    SSLCertificateKeyFile "/etc/letsencrypt/live/mysitename.com/privkey.pem"
    SSLCertificateChainFile "/etc/letsencrypt/live/mysitename.com/chain.pem"

 

Nginx 적용방법 : https://blog.lael.be/post/2600 16번 항목을 참조한다.

dhparam.pem 파일은 한번만 생성하면 된다.

# openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

    listen       443 ssl http2;
    server_name  ssl-demo-1604.lael.be;
    root   /home/ssl-demo-1604/www;
    client_max_body_size 10M;

    ssl_certificate "/etc/letsencrypt/live/mysitename.com/fullchain.pem";
    ssl_certificate_key "/etc/letsencrypt/live/mysitename.com/privkey.pem";
    ssl_dhparam "/etc/ssl/certs/dhparam.pem";

    # 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";

 

3. 인증서 발급 프로그램을 통해 인증서 갱신하기

Let’s Encrypt 는 3개월짜리 인증서를 발급해준다.

즉 인증서를 3개월마다 주기적으로 갱신(renewal)해 주어야한다. 갱신은 만료일 기준 1개월전부터 할 수 있다.

# letsencrypt renew

갱신할 인증서가 있다면 자동으로 갱신 작업을 진행한다.

갱신 작업에는 인증서의 재발급이 이루어진다. (renew = reissue)
동일한 도메인에 대해서, 동일한 인증기관이 여러개의 인증서를 발급할 수도 있다. (모두 유효)

 

4. 인증서 갱신 프로그램 주기적으로 실행하기

큰 부하가 일어나는 것이 아니기 때문에 아무때나 실행해 주어도 큰 문제가 없다.

매주 월요일 새벽 5시 10분에 인증서 갱신을, 매주 월요일 새벽 5시 15분에 웹서버 프로그램 변경사항 적용을 실행하도록 설정한다.

# crontab -e

혹시나 에디터 선택문구가 출력된다면 3번을 누르세요. (재선택 명령어 : select-editor)

 

- Apache2 웹서버를 사용하는 경우

10 5 * * 1 /usr/bin/letsencrypt renew >> /var/log/le-renew.log
15 5 * * 1 /usr/sbin/service apache2 reload

q1

 

- Nginx 웹서버를 사용하는 경우

10 5 * * 1 /usr/bin/letsencrypt renew >> /var/log/le-renew.log
15 5 * * 1 /usr/sbin/service nginx reload

q2

 

참조 : https://www.ssl.com/article/dv-ov-and-ev-certificates/

참조 : https://community.letsencrypt.org/t/which-browsers-and-operating-systems-support-lets-encrypt/4394

참조 : https://www.bluecoat.com/documents/download/0485e335-7437-4c4e-bfc0-ca5ffc5bfd4d/16f27cf7-5d59-44b4-b17f-fb04acea369f

참조 : https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04

 

80 Comments

  1. 우분투 16.04 lts에서의 http2 적용방법도 혹시 포스팅해주실 수 있나요?

    항상 도움 많이 받고 있습니다

    1. 안녕하세요.
      https://blog.lael.be/post/2600 글을 따라하시면 https2 가 구축됩니다.

      1. 저는 라엘님의 아파치2 매뉴얼로 아파치2로 풀셋팅 해놓은지라…

        혹시 아파치2에서 mod http2를 통해 http2를 활성화세켰는데도 여전히 브라우저에서는 http1.1 로 연결되는 문제에 대해 아시고 있는 것 있으신지요??

        1. 안녕하세요. 확인해봤는데 apache2 에서의 http2 지원이 안정화 단계가 아니라서 Ubuntu 16.04 에 포함하지 않았다고 합니다.
          굳이 사용을 원하시면 http2 모듈을 설치하신후 다음과 같은 설정을 해보세요.
          https://blog.samat.org/2015/11/26/Enabling-HTTP2-on-Apache-2.4-on-Debian-Ubuntu/

  2. CentOS도 비슷한가요?

    1. CentOS 용으로도 발급프로그램이 있습니다. git 에서 발급프로그램 다운받아 컴파일하고 설치하면 됩니다.

    2. https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-centos-7

      이 사이트 참고하시면 됩니다.

  3. 안녕하세요~. 항상 많은걸 배워가는데 궁금한점이 있어서 질문드립니다.

    ubuntu 14.04 apache2 이용중이며, 아래 2 부분을 어떻게 해야하는지 몰라서 질문드립니다.

    [01. Let’s Encrypt 인증을 위해서 해당 사이트의 (Nginx 또는 Apache) conf 파일에 다음의 코드를 그림과 같은 위치에 추가해 주어야 한다.

    02. 해당 사이트의 Nginx 설정파일에 다음 구문을 추가한다. (추후 ssl 구문 작성시에도 같은 위치에 추가해 주어야 한다.)]

    1. 적어놓고 보니 01번 02번중에 02번만 이해가 안된다고 적은거 같은데.. 두가지다 이해를 못하는 상황입니다. ㅠㅠ

      1. 헷갈리지 않도록 해당 부분을 보강 수정하였습니다. 다시 확인해 보세요.

        1. 주말인데도.. 정말 감사합니다 ^^ !!

  4. 항상 좋은 포스팅 감사합니다.
    참고로 3개월마다갱신 해주어야 하며 자동으로 갱신해주는 스크립트도 있습니다 ㅎㅎ

  5. 안녕하세요.
    좋은 자료 감사합니다.
    저도 공부하고 싶어서 블로그를 만들고 싶은데
    이런 블로그는 어떻게 만드는지 궁금합니다.
    페이징 기능과 오른쪽에 책갈피기능이나 댓글 기능들은 어떻게 구현할 수 있을까요?
    제가 GitHub + jekyll 라는 것으로 사이트 검색해서 만들어보긴 했는데
    생각만큼 잘 이해가 안되어서 질문 드립니다.

    1. 저도 이런 블로그 못만듭니다. 훌륭한 사람들이 만든 http://www.tistory.com/ 같은 서비스를 이용해서 블로그를 만들어 보세요!

  6. 저는 letsencrypt …. 실행하면 403 forbidden 에러 뜨면서 안되는데 뭐가 문제일까요.

    wordpress 설치가 /www 가 아니라 하위디렉토리로 되어 있어서

    http://사이트주소 입력시 하위 디렉토리로 연결되서 실행되게 되어 있는데

    그게 문제일까요..?

    1. 아뇨 그게 문제는 아닙니다. 제 블로그 글 보고 세팅하셨죠?
      웹서버는 아파치인가요 엔진엑스 인가요?

      1. 아파치입니다. 16.04LTS이구요

        1. https://blog.lael.be/post/73 글의 /etc/apache2/apache2.conf 확인해 보세요.
          lets encrypt 허용해주는 구문이 필요합니다.

          1. 그건 초반에 할 때부터 확인했는데 안되네요..

            구글링 하니 cloudflare 하면 안된다는 말도 있어서 그것도 제 주소 삭제

            했는데 그게 해제가 제대로 안된건지..

            에러메세지는 이렇게 뜹니다

            Invalid response from http://사이트주소/.well-known
            /acme-challenge/IfWZQHvfOmmN47M0FYgeP_JJOi1pQE5wYIvuggTX8qM:

            403 Forbidden

            Forbidden
            <p"

            To fix these errors, please make sure that your domain name was
            entered correctly and the DNS A record(s) for that domain
            contain(s) the right IP address.

            1. http://사이트주소/.well-known/acme-challenge/mytest.txt 파일 만든후에 브라우저에서 직접 실행해보세요.
              아마 403이 뜰건데 이건 아파치 에러로그를 보고 찾아야 해요.

  7. 어떻게 하다보니 성공했는데.. service apache2 restart 명령어가 안됩니다.

    apache2.conf도 다 수정했는데.. 아래 메시지가 뜨네요

    Job for apache2.service failed because the control process exited with error code. See “systemctl status apache2.service” and “journalctl -xe” for details.

    그리고 에러메세지의 명령어를 실행해보면 아래와 같이 뜹니다.

    apache2.service – LSB: Apache2 web server
    Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled)
    Drop-In: /lib/systemd/system/apache2.service.d
    └─apache2-systemd.conf
    Active: failed (Result: exit-code) since Mon 2016-12-05 13:36:34 KST; 1min 34
    Docs: man:systemd-sysv-generator(8)
    Process: 15202 ExecStop=/etc/init.d/apache2 stop (code=exited, status=0/SUCCES
    Process: 12317 ExecReload=/etc/init.d/apache2 reload (code=exited, status=0/SU
    Process: 16266 ExecStart=/etc/init.d/apache2 start (code=exited, status=1/FAIL

    Dec 05 13:36:34 apache2[16266]: * The apache2 configtest failed.
    Dec 05 13:36:34 apache2[16266]: Output of config test was:
    Dec 05 13:36:34 apache2[16266]: AH00526: Syntax error on line 24 of
    Dec 05 13:36:34 apache2[16266]: Invalid command ‘SSLEngine’, perhap
    Dec 05 13:36:34 apache2[16266]: Action ‘configtest’ failed.
    Dec 05 13:36:34 apache2[16266]: The Apache error log may have more
    Dec 05 13:36:34 systemd[1]: apache2.service: Control process exited
    Dec 05 13:36:34 systemd[1]: Failed to start LSB: Apache2 web server
    Dec 05 13:36:34 systemd[1]: apache2.service: Unit entered failed st
    Dec 05 13:36:34 systemd[1]: apache2.service: Failed with result ‘ex
    lines 1-20/20 (END)

      1. 드디어 되네요 ㅠㅠ 항상 감사합니다

  8. Startcom이 중국 Wosign으로 인수되면서 신뢰성도 떨어지고 몇몇 문제가 생겼네요.

    도메인 소유 확인을 제대로 안하거나 인증값 해쉬(Hash)를 재사용했다고 그러네요.

    그래서 추후 구글과 모질라가 안전하지 않은 인증서로 패치 예정이라고 합니다.

    https://namu.wiki/w/TLS#s-6.3

    https://www.xetown.com/slope/384230

  9. 라엘님 보안인증서도 설치하고 워드프레스도 설치했습니다.

    연말 잘보내시고
    메리크리스마스입니다.

    진심으로 감사드립니다

  10. 인증서가 만료된 경우엔, 어떻게 해야 다시 재발급 받을 수 있을까요?
    최초 설치하던 방식으로 해보니, 설치가 안 되네요.

    도메인 접속하니, 아래와 같은 경고 문구가 뜹니다.

    연결이 비공개로 설정되어 있지 않습니다.

    공격자가 도메인에서 사용자의 정보를 도용하려고 시도할 수 있습니다(예: 비밀번호, 메시지, 신용카드 정보). NET::ERR_CERT_DATE_INVALID
    발생 가능성이 있는 보안 문제의 세부정보를 자동으로 Google에 신고합니다. 개인정보취급방침

    1. /usr/bin/letsencrypt renew

      하신후 웹서버 재시작하면 됩니다.

      1. 답변 감사합니다.
        fullchain 코드 추가 후, 웹서버 새로 시작하니까 되네요.

  11. 안녕하세요? 좋은 글 감사합니다.
    서브도메인 사용 시 설정 방법에 관해 궁금한점이 있습니다.
    알려주신대로 해보았는데 주소표시줄에 https 에 빨간줄이 그어져서 제대로 안되네요 ㅠㅠ

    letsencrypt certonly –webroot –webroot-path=/home/laelbe/blog -d lael.be -d www.lael.be -d blog.lael.be -d myhome.lael.be -d … 이런식으로 발급을 받은 후, dhparam.pem 를 생성했습니다.

    그다음에 Nginx서버블록의 server name란에 도메인 전부를 적어줘야되나요?
    예를들어 www.lael.be lael.be www.exam.lael.be exam.lael.be exam2.lael.be ….
    이렇게 https로 리다이렉트 되도록 설정하는 부분과, ssl 부분에 전부다 적어줘야되는지 알고싶습니다 ㅠㅠ

    1. 안녕하세요. letsencrypt 발급 프로그램이 유효성 검사를 하기 때문에 이미 발급 받을 당시에는 유효한 설정을 하고 있었을 것이라 추측됩니다.
      server name 은 연결하고 싶은 도메인만 적으시면 됩니다. 하나의 인증서로 webroot 를 가리킬 수 있으며, 여러 서버에서 사용할 수도 있습니다.

  12. 안녕하세요? http2에 대해 궁금한 점이 있어서 댓글 남깁니다.
    현재 ubuntu 14.04를 통해 nginx를 사용하고 있고 http2로 업그레이드 하려고 하는데 구글 크롬때문에 애를 먹고 있습니다.
    라엘님 블로그도 ubuntu 14.04 + nginx로 알고 있는데 어떻게 http2로 업그레이드 할 수 있었나요?

    1. nginx http2 를 사용하시려면 nginx 버전이 1.9.5 이상이어야 합니다.
      블로그에 나와있는 nginx 설치방법 대로 설치하시면 최신버전의 nginx 가 세팅되며 이때 http2 를 사용할 수 있습니다.

      1. https://www.nginx.com/blog/supporting-http2-google-chrome-users/
        이페이지를 보면 크롬같은 경우 http2를 사용해도 openssl버전이 낮으면 지원을 안한다고 하는것 같습니다.
        라엘님은 우분투버전이 어떻게 되나요? 14.04도 말씀하신 방법대로 하면 http2지원이 가능할까요?
        (전 참고로 라엘님이 알려주신 방법으로 ubuntu 14.04 + nginx 1.11.4로 설치했습니다.)

        1. 방금 테스트 해봤는데 14.04 에서 http1.1 로 연결되는것을 확인했습니다.
          제 서버는 ubuntu 16.04 에서 운영중입니다.
          링크의 밑부분 가이드를 번역해드릴께요.
          “만약 당신에게 http/2 를 사용하는 크롬브라우저 사용자가 중요하다면 다음의 3가지 방법을 사용할 수 있습니다”
          1. 운영체제 업그레이드 – 16.04 를 쓰세요.
          2. nginx 재 컴파일 – openssl 등의 소스를 직접 받아서 개인적으로 컴파일 설치하세요.
          3. nginx 컨테이너 운영 – nginx 를 16.04 서버로 분리 운영하세요.

          1. 역시 그렇거였군요 ㅠㅠ
            이곳 저곳 찾아보다가 라엘님이 14.04에서 http2를 했다는걸 댓글로 본 것 같아서 마지막 희망을 품고 왔는데 역시 아니었네요.
            밑에 3가지 방법은 제가 시도하기에는 너무 리스크가 큰 것 같아서 http2는 당분간 포기해야겠습니다. 우선은 라엘님이 올려주신거 보면서 https라도 해 볼 생각입니다.
            답변 감사합니다. ㅎ 좋은 하루 되세요!

  13. 글 잘 읽었습니다.

    제 경우는 공유기 회사의 ddns를 이용해서 도에인 이름을 사용하고 있거든요.
    p***.iptime.org 이렇게요.
    그간 알고 있기로는, 보안인증서가 iptime.org 도메인에 대해서만 발급되고,
    저 같은 p***.iptime.org 하위 도메인에 대해서는 발급되지 않는다고 해서,
    약간 불편하지만 사설 인증서를 발급해서 사용하고 있었습니다.

    글에 적힌 방법대로 할 때 저 같은 경우도 인증서를 발급 받을 수 있을까요?

  14. 라엘 님, 혹시

    설치된 letsencrypt 깨끗이 제거해 설치 이전 상태처럼 되돌리려면 어떻게 해야 하는지요?

    1. #apt-get purge letsencrypt 해보세요. 실행파일과 환경설정 파일이 삭제될겁니다.

      1. 답변 감사합니다. 새해 복 많이 받으세요. ~~

  15. 라엘 님,

    aaa.com , www.aaa.com 두 도메인을 일단 먼저 ssl 적용하였습니다.

    위 도메인에 적용된 인증서를 이용해,

    bbb.com , www.bbb.com
    ccc.com , www.ccc.com 등 다른 도메인을 추가로 인증시키려면 어떻게 하는지요?

    1. 인증서는 수정되지 않습니다. 따로 독립적으로 추가발급하시거나 도메인을 모두 포함하여 재발급하세요.

      1. 그렇군요. 안 되는 것 가지고 용썼네요.ㅎ 답변 감사합니다.

        주말 잘 보내세요 !! ~~

  16. Ubuntu 14.04 이고 제가 도메인이 example.com과 example.co.kr 2개가 있고 홈페이지 경로가 home/사용자계정명/홈페이지 파일들

    # letsencrypt certonly –webroot –webroot-path=/home/laelbe/blog -d lael.be -d www.lael.be -d blog.lael.be -d myhome.lael.be
    을 저의 경우에 적용하면
    # letsencrypt certonly –webroot –webroot-path=/home/사용자계정명/ -d example.com -d www.example.com -d example.co.kr -d www.example.co.kr
    이 맞나요?

    1. 네 맞습니다.
      –webroot-path=/home/사용자계정명/www 가 맞겠지요?

  17. 저기.. 한국 도메인은 사용이 불가능한가요? 퓨니코드도 지원이 안된다고 그러더라구요:(

    1. 해보지는 않았지만 퓨니코드 지원 될 것 같습니다.
      제 개인적인 생각으로는 다국어 도메인은 사용하지 않는게 좋습니다.

  18. 좋은 글 감사합니다!! 큰 도움이 됬습니다

  19. http://www.tecmint.com/install-free-lets-encrypt-ssl-certificate-for-apache-on-debian-and-ubuntu/
    제가 예전 위 방법을 이용해 처음 설치할 때는 잘 되었는데,
    설치된걸 파일 모두 삭제 후 다시 설치하려니까
    아래와 같은 에러가 뜨는데, 이 에러를 제거하려면 어떻게 해야 할까요?
    구글링해도 마땅한 해결책이 안 봬서, 마지막으로 라엘 님께 여쭤봅니다.

    certbot: error: unrecognized arguments: -d homzzang.com -d www.homzzang.com

    1. 안녕하세요.
      해당 사항만으로는 원인을 모르겠습니다.
      아마 certbot 버그이지 않을까 추측해봅니다.

  20. 라엘님 안녕하세요. 블로그 글 보면서 서버 세팅 열심히 따라하고 있는 초보입니다.
    인증서 발급이 오류가 나서 애를 먹고 있습니다.
    현재 웹 서버 세팅 블로그 글을 참고하여 Ubuntu 16.04 lts위에 nginx+php+mariadb 까지 설치완료하였습니다. 이제 letsencrypt를 설치하고 인증서를 발급하려고 하는 상황입니다.

    구매한 도메인을(www.example.com)이라 하였을 때 인증서를 발급하려고
    letsencrypt certonly –webroot –webroot-path=/home/user1/www -d www.example.com -d example.com
    위의 명령어를 입력한 뒤 메일 설정과 동의 버튼을 누르고 나면, 오류가 생기고 발급이 되지 않습니다.

    어떤 문제가 있는 걸까요? ?

    1. 도메인 연결이 되지 않은것 같네요. 도메인과 서버의 IP 를 연결해주시기 바랍니다.

      1. 아! 제가 다른 포스팅도 함께 참고하다가 실수를 했네요!! nginx 웹 서버를 꺼둔 상태에서 인증서를 발급 받으려고 하니 자꾸 오류가 났던 것이었습니다. 감사합니다. 항상 좋은 내용 공유해주셔서 감사합니다. 좋은 하루 보내세요!

      2. 사이트에 letsencrypt의 ssl인증서를 잘 적용하여 한 달 동안 잘 사용하고 있었습니다.
        그러던 오늘 들어가 보니 주소 표시 줄에 초록색이 아니라 회색으로 https가 표시되었습니다. 신기하게 로그인 화면에만 ssl이 적용되어 있었습니다….!
        혹시 무슨 문제가 생긴 건가요? 처음 인증서 적용했을 때는 모든 페이지에 다 적용되어있었는데 갑자기 무엇 때문에 변경된 것인지 ㅠ,,
        답을 아실 것 같아 글을 남깁니다!

        1. https 페이지에 http 리소스를 함께 사용하면 회색으로 바뀝니다.
          소스보기를 하신 후에 모든 링크를 https 로 바꾸어주세요.

          1. 아하! 이미 만들어진 테마를 설치해서 기본 링크들 중에 http인 링크가 섞여있어서 생긴 문제였습니다! 감사합니다. *.*

  21. 안녕하세요, 다름이 아니라 서브 도메인으로 nginx로 두개의 웹루트를 각각 나눠서 쓰려고합니다.
    예를들면 /sev/www1과 /sev/www2 이렇게 두개의 웹루트를 가진 서버인데요.
    두개다 www1.domain.com과 www2.domain.com 으로 Let’s Encrypt SSL을 등록하려고 합니다.
    이렇게 웹루트가 다른 경로에 있으면 두개다 따로 생성을 해야되나요? 아니면 올려주신 예제대로
    letsencrypt certonly –webroot –webroot-path=/sev/www1 -d www1.domain.com –webroot-path=/sev/www2 -d www2.domain.com
    이런식으로 해야될까요? 아니라면 두개다 따로 발급을 해야될까요? 두개 발급 가능한지도 궁금합니다.
    좋은 글 감사합니다.

    1. 두개를 따로 발급하시면 됩니다.
      domain.com 과 www.domain.com 같이 동일한 웹루트를 사용할 경우에만 -d 옵션으로 합쳐서 받는 것을 권장합니다.
      감사합니다!

      1. https://certbot.eff.org/docs/using.html#webroot
        이 링크를 보면 웹루트가 달라도 한번에 받을 수 있다고 되어있습니다.

        1. WishCert님 말씀대로도 되네요
          두 분 답변 감사합니다!

  22. 좋은글 감사합니다. 우분투16 서버 설정 글을 보고 아파치2와 php ip보안등등 모두 설정을 완료하고 ssl 적용을 하고 있는데요. 한가지 문제점이 있어서 글을 남기게 되었습니다. 보안인증서까지 발급을 받고 SSLEngine On 응 했는데 찾을수없는 명령이라고 떠셔요. 해결방법을 알수있을까요? 제가 뭔갈 놓친건가요;;

    1. 아 설정파일을 수정하는거군요 민망

  23. 안녕하세요
    블로그 글을 참고하여

    1. 우분투 + nginx 서버를 구축하였고 (마지막의 “옵션 – 방화벽” 은 설정 안 함)
    2. 방화벽 설정은 안 했지만 JSP 포스팅을 보고 fail2ban만 적용,
    3. 마지막으로 이 포스팅을 보고 SSL을 적용하였습니다만,,

    nginx 설정파일을 SSL 용으로 바꾸고 나서부터
    계속 접속이 안 되고 있습니다.
    nginx 서비스는 잘 실행되는 걸로 봐서 설정 파일에 문제는 없어 보입니다.

    그런데,

    # netstat -atn

    으로 살펴보니
    443 포트가 아예 목록에 없었습니다.
    80포트는 listen 중입니다.

    제 생각엔
    방화벽 설정의 안 해서 생기는 문제거나
    fail2ban을 제대로 셋팅하지 않아서 생긴 문제일 것 같은데

    혹시 해결 방법으로 짐작가는 게 있으신지요..

      1. 감사합니다.
        해결하였습니다.

        혹시 비슷한 문제를 겪을 다른 분들을 위하여 어떻게 해결하였는지 적습니다..
        사실은 왜 되는지 모릅니다 ㅠㅠ

        [해결한 방법]
        default.conf 는 올려주신대로 설정되어 있는 것 같아서, 제 도메인과 관련된 nginx의 conf 파일을 손 봤습니다.

        근데 예전에도 라엘님이 올려주신 예제 파일을 간단히 수정하여 복붙을 했었는데.. 그렇게 하면 service nginx restart 시에

        Job for nginx.service failed because the control process exited with error code. See “systemctl status nginx.service” and “journalctl -xe” for details.

        계속 이런 에러가 떠서 검색을 해보니,
        스택오버플로에서 EOL과 관련된 문제라고.. Line Break 을 없애면 된다는 얘기가 있었습니다.
        그래서 저는

        http://www.textfixer.com/tools/remove-line-breaks.php

        이 사이트를 이용해서 LineBreaks 을 모두 제거하고..
        제도메인.conf 파일에 복붙을 했었드랬습니다.

        근데 이번에는 LineBreaks 를 모두 제거해서 해도 저 에러가 계속 뜨는 겁니다.
        내용은 분명 동일하다 생각하는데,
        그래서 이번엔 LineBreaks 을 제거 안 하고 붙여넣드랬습니다.
        그러니 해결됐습니다..

        하… 왜 되는지 모르겠습니다.. ;;;;

        하튼 라엘님께 감사드립니다.
        덕분에 저만의 서버를 갖게 되었습니다. ^^

        1. 축하드려요! 온라인상에서 나만의 공간을 갖는다는건 큰의미가 있답니다!

  24. 기존에 다른 인증서를 이용하여 사이트를 구축하였다가
    인증서 문제로 몇 브라우저에서는 접근도 안되는 문제가 있어서 해결하던중
    중간에 기존 인증서 설정때문에 많은 문제가 있었지만
    이 홈페이지 글로 인증서 교체하고 모든 문제가 해결되었습니다.
    정말 감사드립니다.

    1. 사이트 좋네요!
      저도 언젠가 인쇄 의뢰하는 날이 오지 오지 않을까 싶습니다!

  25. 홈페이지 2개를 운영중인 초보 관리자입니다.
    Lets Encrypt 를 사용하여 무료로 SSL인증서를 사용할 수 있다고 들어서 찾아본적이 있었는데
    다들 너무 어렵게 글을 적어놓으셨는데 라엘님 글을 읽고 처음으로 성공했습니다. 감사합니다.

    그런데 홈페이지 2개중 한개는 홈피주소뒤에 /xe/가 붙는 홈페이지라 그런지 정상적으로 발급이 안되더군요..
    http://홈피주소/를 입력하면 index.php안에 있는 스크립트 때문에 ./xe/로 이동하여 http://홈피주소/xe/로
    연결되는 구조인데, Lets Encrypt로 발급할 수 있는 방법이 있을까요?
    제 개인적 생각이지만 가상호스트 설정하는 부분에서 리다이렉트를 해놓아야할거같다는 생각이 들긴한데
    라엘님의 조언 부탁드립니다.

    1. 안녕하세요.
      위 본문의 예제 3 번과 같이 사용해보세요.
      이 때
      –webroot-path=/home/banana/www/xe 가 아니라
      –webroot-path=/home/banana/www 이렇게 적어야 합니다.

      1. 조금 시간이 지나니 제대로 적용되었습니다.
        덕분에 SSL 정말 짧은 시간에 해냈네요.
        다른 글들도 너무 정리를 잘해주셔서 감사합니다!

  26. 안녕하세요. 라엘님 글을 보고 2개월전에 인증서를 발급받아서 사용하고 있던 사람인데요!
    이제 인증서를 재발급 받을 시기가 됬습니다!
    처음에 인증서를 받고나서 crontab 으로 인증서 자동으로 받는 스크립트까지 짜놨었는데요!
    10 5 * * 1/usr/bin/letsencrypt renew >> /var/log/le-renew.log
    15 5 * * 1/usr/sbin/service apache2 reload
    이렇게요! 근데 오늘 확인해보니까 인증서가 재발급을 못받고 있더라구요!
    직접 /usr/bin/letsencrypt renew >> /var/log/le-renew.log 이렇게 쳐봤더니

    The following certs are not due for renewal yet:
    /etc/letsencrypt/live/hyundaisurgery.com/fullchain.pem (skipped)
    All renewal attempts failed. The following certs could not be renewed:
    /etc/letsencrypt/live/hmihakskin.co.kr/fullchain.pem (failure)
    1 renew failure(s), 0 parse failure(s)

    이런 문구가 나오면서 리뉴얼이 안됩니다! 혹시 해결할 방법이 있을까요??

    1. 추가적으로 오류 내용 올려놓겠습니다!
      IMPORTANT NOTES:
      – The following errors were reported by the server:

      Domain: hmihakskin.co.kr
      Type: unauthorized
      Detail: Invalid response from http://hmihakskin.co.kr/.well-known
      /acme-challenge/lkQ4upZ0GtrjkRQWwiTLkvYgw-gogpw3K9oHMtUV1X0:

      403 Forbidden

      1. 우와 사이트 잘 만드셨네요!
        오류 사항은 https://blog.lael.be/post/73 로 이동한 다음에,
        해당 문서의 “/etc/apache2/apache2.conf 설정파일 중간에 추가” 설정을 확인해보세요.

        1. 감사합니다.
          말씀해주신 설정을 확인해봤는데요!
          라엘님 글보고 설정을 다 해놓은 상태더라구요!
          혹시나해서 지우고 다시 작성해서 아파치 껐다키고 리뉴얼해봤는데도 같은 오류 현상이 발생하네요;

          /usr/bin/letsencrypt renew >> /var/log/le-renew.log
          이렇게 실행시키면

          2017-07-03 11:43:12,721:WARNING:letsencrypt.cli:Attempting to renew cert from /etc/letsencrypt/renewal/hmihakskin.co.kr.conf produced an unexpected error: Failed authorization procedure. www.hmihakskin.co.kr (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://www.hmihakskin.co.kr/.well-known/acme-challenge/4YB2NR-3HTuoEbSsK7f9LY2fMz1VVvtB8JLAjmbby2A: ”

          403 Forbidden

          Forbidden
          <p", hmihakskin.co.kr (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://hmihakskin.co.kr/.well-known/acme-challenge/X76lGeETasN-vM-6ADEqna4fu17yuggU1zywUMUAJdI: "

          403 Forbidden

          Forbidden
          <p", hmihakskin.com (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://hmihakskin.com/.well-known/acme-challenge/03F6H7Ja52yMHBfOkoTxivd-btdNLzSH07ImNqA_2D4: "

          403 Forbidden

          Forbidden
          <p", www.hmihakskin.com (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://www.hmihakskin.com/.well-known/acme-challenge/JlP97wKdSsVfOvq3jGi8xaii8UxDbIR_iGBrDeJhueI: "

          403 Forbidden

          Forbidden
          <p". Skipping.

          이렇게 에러구문이 뜹니다..

          1. 안녕하세요. 초기 발급 시와 경로가 바뀐 것으로 보입니다.
            renew 말고 새로 발급받아보세요. 중복 발급이 가능합니다.
            letsencrypt certonly –webroot –webroot-path=/home/hmihakskin/www -d hmihakskin.co.kr -d www.hmihakskin.co.kr -d hmihakskin.com -d www.hmihakskin.com

            1. 소중한 답변 정말 감사드립니다!
              아직 해결은 안됬지만 말씀하신대로 인증서를 재발급받는쪽이나 중복발급받는쪽으로 해보면 될것같네요!
              감사합니다!

  27. # letsencrypt certonly –webroot –webroot-path=/home/ckddn/public_html -d ***.cf -d www.***.cf
    An unexpected error occurred:
    OSError: [Errno 13] Permission denied: ‘/etc/letsencrypt’
    Please see the logfile ‘letsencrypt.log’ for more details.

    따라서 했는데 저부분에서 막힙니다. 저는 이런 에러가 나오네요.
    도움을 구하고자 글을 남겨요.ㅠㅠ;
    Ubuntu 16.04, apache2 입니다.

  28. 라엘님 글 이곳저곳 찾아서보고
    어찌어찌 성공한거 같아요.
    감사합니다. ^0^

Leave a Comment

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*