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

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

https://blog.lael.be/post/5107

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

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

ssl1

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

 

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

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

 


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 >

 

 


최상위 발급기관중 하나인 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 일 경우 (또는 그 이후 버전, 18.04, 20.04 등)

letsencrypt 는 최근에 certbot 으로 패키지 이름이 변경되었습니다. Ubuntu 내부적으로 letsencrypt -> certbot 으로 설정되어 있으니, 둘 중 아무 단어나 사용하셔도 됩니다. (동작이 완전히 동일함)

# apt-get install letsencrypt

start2

 

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

Gandi.net: Domain Names, Web Hosting, SSL Certificates and Emails - https://www.gandi.net/

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

참고 : Domain Control Validation 의 3가지 방법 (https://docs.gandi.net/en/ssl/common_operations/dcv.html)

Let’s Encrypt 는 위의 도메인 인증방법 중 3번째Validation by file 를 사용하여 인증한다. (최근 Let’s Encrypt 에서 Validation by DNS 방식도 지원하도록 변경되었다. 하지만 이 방법은 이 글에서 다루지 않겠다.)

 

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

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

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

 

예제

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

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

*예제 2 :

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

*예제 3 : * 널리 사용됨 (원본 도메인과 www 도메인 동시인증)

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

*예제 4 :

letsencrypt certonly --webroot --webroot-path=/home/myuser4/www -d myuser4.com -d www.myuser4.com -d blog.myuser4.com -d myhome.myuser4.com

 

* 명령어 설명

-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

혹시나 에디터 선택문구가 출력된다면 vim.basic 을 선택하세요. (재선택 명령어 : 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

 

 


인증서 관련 상황 및 대처 방법 예시

 

현재 서버에서 사용중인 인증서 목록 보기

# cd /etc/letsencrypt/live
# ls

 

일부 서버 인증서 삭제

반드시 위의 인증서 목록 보기를 통해 인증서 이름을 알아두어야 한다.

현재 사용중인 인증서 취소(revoke)

# letsencrypt revoke --cert-path /etc/letsencrypt/archive/my-examplesite.com/cert1.pem

보통 revoke 는 거의 하지 않는다. 사용 안하는 인증서는 그냥 그대로 두어서 만료 시킨다.

다만, 인증서 파일 및 인증서 키가 유출되었고, 도메인 제어 권한에 문제가 있을때, 특수한 상황일 때, revoke를 진행하곤 한다.

 

갱신 목록에서 제거

이 목록에서 지우면 renew 를 하지 않는다.

# cd /etc/letsencrypt/renewal/
# ls

설정파일을 수동으로 선택해서 지운다. (항상 지우는 명령을 실행할 땐 5초동안 고민한 뒤에 엔터를 눌러라.)

 

기존에 발급받았었던 파일 삭제 (옵션)

찌꺼기 파일인데, 지워도 되고, 안지워도 되고. 아래 위치에서 도메인 폴더를 선택하여, 삭제하면 된다.

# /etc/letsencrypt/live/
# /etc/letsencrypt/renewal/

 

 

 

 

149 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^

  29. 안녕하세요.혹시 hsts 삭제하는 방법 아시나요? chrome://net-internals/#hsts 여기서 삭제도 해봤는데 삭제가 안되네요.

  30. 안녕하세요!
    이번에 Let’s Encrypt에서 와일드카드 인증서를 발급을 시작해서 발급받고
    라엘님 블로그에 적힌대로 버츄얼호스트이용해서 적용시켰는데
    *.domain.com처럼 하위도메인에 경우에는 인증서가 적용되는데 원래 도메인인 domain.com은 잘못된 인증서라고 뜨네요 ㅠㅠ
    domain.com인 인증서를 추가로 발급해서 적용해야 하나요?

    1. 안녕하세요. wildcard 인증서 갱신방법이 조금 번거로워서 블로그 글에 안적어뒀었는데 발급받아서 쓰고 계시는군요!
      인증서의 wildcard(*) 문자에는 .(dot)이 포함되지 않습니다.
      *.domain.com 은 domain.com 이 포함되지 않습니다.
      *.domain.com 은 my.test.domain.com 역시 포함되지 않습니다. 이 경우 *.test.domain.com 인증서를 발급받아야 합니다.
      사용할 도메인 주소를 확인하시고 모두 포함해서 발급받으세요~

      1. 넹 ㅠㅠ
        따로 인증서를 받아서 적용시켰더니 되네요.
        하위 도메인이 여러개 될때는 따로따로 받는것보다 와일드카드가 편할듯하네요.
        답변감사드립니당

  31. 안녕하세요
    우분투 16.04 + nginx 서버에서
    위 설명대로 ssl을 추가 했습니다.
    그런데 기존 도메인외 다른 도메인을 추가 하고 싶을때는 어떻게 해야 하나요?

    예를들어
    http://old.com 을 https://old.com 로 리디렉션 시키고 다시 https://new.com 라는 새로운 도메인으로 최종 리디렉션 시키고 싶습니다.

    서브 도메인이 아니라 새로운 도메인을 추가 하고 싶습니다

    1. 질문의 내용을 이해하지 못하였습니다.
      새로운 사이트는 그냥 추가하면 되고, 리디렉션 코드는 본문에 나와있으며 응용하면 됩니다.

    2. 새로운 도메인에 ssl 인증서를 추가로 받아야 하는 거죠?. 감사합니다

  32. 음.. 문의 댓글을 달았는데 보이지가 않네요.ㅜ

    1. 스팸차단 플러그인이 가끔 댓글을 숨겨줍니다. 확인 후 공개처리 하였습니다.

  33. 유용한 정보 감사합니다. 혹시 SSL갱신할때 기존키 유지할 수 있는 방법이 있나요?

    1. 인증서 갱신 프로세스만 진행하고 기존 인증서 파일은 그대로 싶으신 거죠?
      인증서 내부에는 유효기간 및 기본 정보가 쓰여 있습니다. 인증서 내용이 바뀌는 것이므로 반드시 갱신된 인증서로 교체해주셔야 합니다.

  34. 라엘님 정보 감사합니다.
    저는 IIS에서 적용했는데 잘 적용이 됩니다.
    또한 한글.com도메인도 퓨리코드로 적용이 잘되더라고요, 여기 많은 분들이 오시는 것 같아서 참고 하시면 좋을 것 같습니다.

  35. 안녕하세요 🙂 라엘님의 글이 정말 큰도움이 되었습니다 🙂 감사의 뜻을 미리 전합니다 !

    다름이 아니고 SSL 적용하는 과정중에 생긴 문제로 질문을 하게 되었습니다 🙂
    인증서도 잘 발급받았고, 환경설정 만들어주는 것을 이용해서 순서대로 잘 적용했는데,
    적용후 해당 https로 접속하게 되면 자꾸 500 에러가 나는데 이걸 어떻게 해결해야 할지 막막해서요..

    제 서버 환경은 Ubuntu 16.04 이고 이 글의 순서대로 설치는 완료 하였습니다 🙂 !

    1. 안녕하세요. 잘 된다니 다행입니다.
      에러 로그를 보는 방법은
      #tailf /var/log/(nginx 또는 apache2)/로그파일.log
      입니다. 탭키 자동완성을 통해서 명령어를 입력해보세요.
      로그보기 중단 단축키는 컨트롤 C 입니다.
      감사합니다!

      1. 안녕하세요 ! 말씀하신 대로 확인해 봤는데,

        itk_post_perdir_config(): setgid(0): Operation not permitted

        이런 에러가 줄줄이 뜨네요 .. 일단 구글에 검색해서 해결방법을 찾고는 있는데, 혹시 이런 문제에 대해서도 해결책을 알수 있을까요 🙂 ?

        1. 사이트 운영시 root 사용자로는 만들면 안됩니다. root 는 시스템 관리 이외의 용도로 사용하시면 안됩니다.

          반드시 일반사용자 계정을 만들어서 아파치 설정하세요.
          문제의 원인은 환경설정 파일의 AssignUserID root root 입니다.

          1. 아..! 감사합니다 🙂 !

  36. 감사합니다! 작성해주신 글 덕분에 잘 해결되었습니다.

  37. 와일드 카드 인증방법도 배우고 싶습니다.
    wildcard(*)

    ㅠㅠ

    1. 발급은 쉬운데 갱신이 되게 번거로워서…
      설명을 보류하고 있습니다.

    2. 아 그렇군요

      항상 감사드려요

  38. 저도 같은 현상(에러)인 것 같은데,
    말씀하신 일반사용자 계정을 만들어 아파치 설정이라는 것이 어떤 의미인지 모르겠습니다. 이제 막 공부 시작하는 초보라.. ㅠ.ㅜ

    일반 사용자 계정 만들어서 그 계정으로 접속하면 아파치나 SSL 설치 등이 진행되지 않는 것 같은데,

    그렇다면 /etc/apache2/sites-available/도메인.conf 파일에서 AssignUserID 일반사용자계정 일반사용자계정 로 바꾸면 된다는 것인지 ..

    혹시 조금 구체적으로 설명 가능하실지요? 번거롭게 해드려 죄송합니다.

    1. 아파치나 SSL 설치는 root 사용자 권한으로 설정해야합니다.
      하지만 웹사이트는 일반사용자를 만들고 일반사용자의 폴더(/home/exampleuser/www) 에서 구동해야 합니다.
      너무 당연한 내용이라 설명이 어렵네요.

  39. 안녕하세요 라엘님
    글 정말 감사합니다. 늘 https를 적용할때 참고해서 읽고 있습니다.
    그런데 적용 시 문제가 있어서 있어서 글을 남기게 되었습니다.

    현재 제 Nginx 서버 하나에 여러 홈페이지를 운영하고 있는데요, 위의 3번 방법으로 각각의 인증서를 발급받아서 사용하고 있습니다.

    지금까지 잘 사용해 왔는데요.. 이번에 https://www.ssllabs.com에서 테스트를 해보니 모든 도메인 마다 아래처럼 인증서가 2개씩 표시가 됩니다.

    Certificate #1: RSA 2048 bits (SHA256withRSA) > 테스트하는 홈페이지 주소와 인증서가 일치
    Certificate #2: RSA 2048 bits (SHA256withRSA) No SNI > 서버 내의 다른 홈페이지 주소가 표시됨. (불일치)

    왜 2번째 인증서가 계속 인식이 되는건지 잘 모르겠습니다 ㅠㅠ 혹시 해결 방안이 있을까요? 감사합니다.

    1. 무시해도 됩니다. 전혀 문제가 되지 않는 사항입니다.
      No SNI는 Windows XP 운영체제 + 특수한 환경에서 동작합니다.
      두번째 표시되는 인증서를 바꾸시려면 https://blog.lael.be/post/7147 를 참고해주세요.

  40. Amazon Linux에서 성공했습니다
    감사합니다

  41. 안녕하세요 라엘님~
    수개월전에 라엘님의 글을 따라서 SSL 적용을 완료했는데요(우분투 18.04)
    letsencrypt에서 tls-sni 방식의 갱신를 중단한다고 하더라구요

    https://xetown.com/topics/1155084

    저는 certbot 아니라 letsencrypt 패키지를 설치해서 최초 인증, 갱신을 하고 있으니 걱정할 필요가 없을까요?

    1. Let’s Encrypt 인증방식에는 tls-alpn-01, http-01, dns-01, tls-sni-01(곧 사라짐) 이 있습니다.
      제 발급 가이드를 따라했다면 무조건 http-01 인증방식으로 인증합니다.
      (인증서 발급 명령어 실행할 때 http-01 challenge 라는 단어를 확인해보세요)

      따라서, 이 이슈와 관련하여 추가 작업이 필요없으며 영향이 전혀 없습니다.
      감사합니다.

  42. 라엘님 안녕하세요.1년정도 운영하던 사이트가 갑자기 연결할수 없게 됬네요.

    오류내용:
    소유자가 웹사이트를 적절히 설정하지 않았습니다. 정보가 도난당하는 것을 막기 위해서 Firefox가 웹사이트에 연결하지 않았습니다.

    이 사이트는 Firefox가 안전한 경우에만 연결함을 명시하기 위해서 HTTP Strict Transport Security (HSTS)를 사용합니다. 그래서 이 인증서에 예외를 추가할 수 없습니다.

    유효하지 않은 보안 인증서를 사용합니다. 2018년 7월 13일 금요일 오전 1:55:05에 인증서가 만료 됩니다. 현재 시간은 2019년 1월 29일 오전 9:24입니다. 오류 코드: SEC_ERROR_EXPIRED_CERTIFICATE 라고 나오네요.

    letsencrypt renew 입력해도 No renewals were attempted. 나오네요.어떻게 해결해야하나요?

    1. 갑자기 사이트 연결이 안된것은 아닐 것 같네요.
      서버에서 인증서 발급명령어를 다시 실행해보세요.
      본문의 letsencrypt certonly 관련 구문을 실행하면 됩니다.

      1. 어제 저녘에도 정상이였는데…
        일단 다시 해보겠습니다.

  43. Pingback: 홈페이지 SSL 적용 완료. – Roughness Leads To Perfection

  44. 안녕하십니까
    다름이 아니라 blog.도메인.kr ssl갱신이 안되어 다시 설정하던중
    여러가지 방법을 사용해 봤지만 안되어 글을 남깁니다.

    도메인.com , blog.도메인.kr 서로 다르게 셋팅하고

    설정 파일은 아래 두 파일을 다 a2ensite 해줘야 하는것인지요
    도메인.kr.conf blog.도메인.kr.conf

    기본 도메인 셋팅은 글을 보고 셋팅을 하면 되는데
    라엘님 처럼 blog 서브 도메인을 사용하고 싶은데 잘 안된네요. ㅠ,.ㅠ

    1. 아니요. blog.도메인.conf 에 대한 파일만 설정하면 됩니다.
      왜 인증이 실패 했는지는 /var/log/letsencrypt/letsencrypt.log 로그를 보면 알 수 있을거에요.

      1. blog.도메인.kr인데 경로화 파일이 도메인.kr-0001로 변경되었네요..
        .conf 파일에 ssl경로 바꿔주니 접속이 됩니다.
        감사합니다. 합~~~^^

  45. 안녕하세요 라엘님:)

    포스팅 자세하고 쉽게 써주신것 같은데 저는 무슨 말 인지 모르겠네요 ㅠㅠ

    웹디자이너라서 Ubuntu, Apache 등등 들어만 봤지 정확히는 모르는 상태인데 ssl인증서 갱신을 꼭 해내고 싶어서요 ㅠ 다른건 몰라도 인증서 갱신을 하려면 어떤 부분을 먼저 알아야할까요…

    html/css/자바스크립트로 사이트 구성 할 수 있는상태인데 제가 어떤 부분을 공부해야 이글을 이해할 수 있을까요 ㅠㅠ 짧은 대답이라도 부탁드려요

    1. 안녕하세요. 정말 자세히 알려드리고 싶네요.
      그런데 ssl인증서는 html/css/자바스크립트와 관련이 없고, 리눅스 운영체제와 관련이 있습니다. 리눅스 사용방법을 모르면 할 수 없습니다.
      또는 ssl인증서(무료 보안인증서)를 제공해주는 웹호스팅을 사용해보세요. (https://www.iwinv.kr/account/web_host.html)

  46. 안녕하세요.
    좋은 포스팅 덕분에 SSL을 무사히 설치를 완료했습니다.

    문제가..
    mydomain.com 와 www.mydomain.com
    이렇게 두개를 설정했어야 했는데 하나만 SSL 인증서를 발급받았습니다.
    www.mydomain.com를 추가해야되는데 SSL 인증서를 삭제하고 해야되는지..
    추가할 수 있는 방법이 있는지 궁금합니다.

    1. 인증서는 추가발급만 존재합니다. 도메인을 2개 지정한 다음 새로 발급받으세요. 이 경우 모든 인증서 파일이 유효하게 됩니다.

      1. 네 답변감사드립니다. 다시 재발급을 받기위해 사이트를 보니
        자물쇠모양이 없어지고 느낌표 표시가 나있네요. 그날 당일은 좌물쇠 표시로 되있었거든요.ㅠ
        로그는 아래와 같습니다.
        [ssl:warn] [pid 9508] AH01909: localhost:443:0 server certificate does NOT include an ID which matches the server name

        서버는 아파치+우분투18.04입니다. 알려주신 아래 사이트도 잘나옵니다.
        https://www.sslshopper.com/ssl-checker.html#hostname=3dorder.com
        https://www.ssllabs.com/ssltest/analyze.html?d=3dorder.com

        무엇이 문제일까요??

        1. 워드프레스 설정을 잘못하신것 같네요. https 사이트에서 http 를 함께 사용하면 느낌표 표시로 바뀝니다.
          자세한 사항은 사이트를 띄운상태에서 키보드 F12키를 누르시고 console 을 살펴보세요.

          1. 아..그러네요. 너무너무 많은 도움이 되었습니다.
            감사드리고, 즐거운 하루보내세요 ^^;;

  47. 안녕하세요.
    SSL 인증서 설치에 큰 도움이 되었습니다. 써주신 다른 글도 참고해서 인증서 설치는 완료된 것 같습니다.
    근데 제대로 동작하는지 모르겠습니다.
    ubuntu 14.04 와 apache 2를 사용하고있는데요, SSL Checker 사이트에서는 전부 녹색 체크로 표시됩니다.
    하지만 크롬을 사용해 홈페이지를 접속하면 여전히 주의 요함(보안 연결 안됨)이 떠있는데, 제대로 동작하는지 확인하는 방법이나, 혹시나 설치가 제대로 되지 않은 것인지 궁금합니다.

    1. SSL Checker 에서 전부 녹색으로 나오면 정상적으로 잘 설치된 것입니다.
      크롬에 주의요함은 보고계신 페이지내에서 https 가 아닌 컨텐츠를 사용해서 입니다. 소스보기를 하신 후 http 리소스를 확인해보세요.

  48. 라엘님

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

    Ubuntu 18.04 LTS 에서 웹서버(NGINX + PHP-FPM + MariaDB) 구성하기에서 13) 3] 웹사이트 Nginx 환경설정파일 작성하는 단계는 인증서 발급받고 다음에 하는 게 맞죠?

  49. 안녕하세요. ssl을 삭제하고 다시 설치를 하는데 아래와 같은 오류가 납니다. 무엇이 문제인건지요?ㅠ

    Cleaning up challenges
    Failed authorization procedure. www.3dorder.com (http-01): urn:ietf:params:acme:error:connection :: The server could not connect to the client to verify the domain :: Fetching http://www.3dorder.com/.well-known/acme-challenge/cZ07zjut56BHDHtlZqLugrmdip3DYFypwu_Q29Tgulk: Connection refused, 3dorder.com (http-01): urn:ietf:params:acme:error:connection :: The server could not connect to the client to verify the domain :: Fetching http://3dorder.com/.well-known/acme-challenge/N50U-fK6XkoRmrwW2J3W42NLJwkhT-xDtdOCRm1qQHM: Connection refused

    1. 네임서버 설정이 잘못되었거나 방화벽으로 막혀있어서 인증검사하는 서버에서 해당 서버로 접근을 하지 못하는 경우입니다.

  50. Pingback: SSL인증서 적용하기(02) – 우분투 SSL 적용하기 – Life of Magpie

  51. 갑자기 let’s encrypt 에서 메일이 와서 당황하였는데
    수정하여 올려주신 글이 큰 도움이 되었습니다! 감사합니다~^^

  52. 안녕하세요. 한가지 문의사항이 있어 글을 남깁니다.
    저 같은 경우는 NGINX 를 사용하면서 Let’s ssl을 발급받아 사용하다가
    오늘 같은서버에 계정을 하나 더 생성하고 추가로 새로운 도메인을 연결했습니다.

    각각 계정이 달라 home 경로가 다른데
    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;

    1. 아니요 dhparam 은 리눅스서버 설치당 한번만 실행하고, 공유해서 쓰는 파일입니다.

  53. 안녕하세요. 해외차단 geoip를 적용 하려고 하는데요
    Nginx를 geoip 옵션으로 다시 설치해야 하는지요?
    지금 라엘님 강좌대로 서버 만들고 홈페이지 올려서 운영해보는 중인데요
    이 상태에서 nginx에 geoip 옵션줘서 다시 설치해도 괜찮은지요?
    여기까지 배운것만 해도 염치 없지만 ㅜㅜ….
    해외 차단에 대해서도 알려주시면 좋겠습니다 ^^;;;
    감사합니다!

    1. nginx 모듈만 추가로 설치하면 됩니다. ubuntu 기본 패키지에 있어요.
      apt-cache search nginx 라고 검색해서 geoip 를 찾아보세요.

  54. 안녕하세요 라엘님
    글을 보고 잘 따라오던중에,
    주기적으로 갱신을 해주는 crontab -e 를 입력하는 부분에서 걸렸는데요.
    저는 루트경로에서
    crontab -e 을 입력했더니

    no crontab for root – using an empty one
    888

    이렇게 나오는데 어떻게 진행을 해야하는지 알고 싶습니다.
    crontab을 전혀 다뤄본적이 없어서 도움요청합니다.
    감사합니다.

    1. 처음 crontab 을 사용하면 빈것을 생성해서 사용합니다. 메세지는 그냥 참고만하시고, 무시하시고 진행하시면 됩니다.

  55. 안녕하세요.
    현재 SSL 적용을 잘 따라해서 적용을 했는데요.
    우분투서버에서 실행중입니다.

    https 로 도메인을 시작하면 정상적으로 워드프레스에 접근합니다.
    다만 http로 입력하면 404 Not Found 라고 웹페이지가 나오는데
    이유를 혹시 짐작하실 수 있으실까요?
    ㅠㅠ

  56. 비전공자 대학생이고 취미로 게임 공략을 써서 웹으로 용돈벌이를 하고 있습니다
    블로그로 우분투 서버를 즐겨쓰고 있습니다 항상 너무 큰 도움되네요 감사합니다

    1. 코로나로 인해 언텍트 IT 분야가 수혜를 입고 있습니다.
      도움이 되셨다니 다행이네요. 더욱 더 발전하는 공략블로그가 되시길 기대합니다!

  57. 와 몇일동안 이블로그만 보면서 세팅을 하는데 여기까지 진행했습니다.
    감사합니다.

    카페24 가상서버 쓰는데 기본적으로 443 포트가 막혀있어서 안되었던건데
    뭐가 잘못되었나 한참을 다시 해봤네요..
    덕분에 좋은 학습이 되었습니다.
    혹 crontab 부분까지 모두 해놓으면 3개월마다 자동갱신이 되는건가요?

    1. 네 그렇습니다! 하나하나 성취하고 계시네요!

  58. 해당 포스트 잘 읽었습니다.,
    ssl 인증서 발급 받을 수 있는 서버 환경이 Apache2, 와 Nginx 서버를 사용해야 발급 받을 수 있나요??

    제가 이 글에서 이해하기는 아파치와 엔진엑스 사용하지 않아도 무료 ssl 인증서 발급 받을 수 있다는 것으로 해석됩니다 ..
    맞나요?
    아파치와 엔진엑스 사용하지 않고 있기 때문에 시도해 볼까 하고 질문 드립니다.

    1. SSL 을 발급받기 위해서는, 해당 도메인을 컨트롤 할 수 있다는 증명을 해야 합니다.
      본문에서는 HTTP 방식의 증명을 사용합니다.
      다른 방식에는 DNS 증명이 있으며 이것은 웹서버가 필요 없습니다. 관련된 글은 다른곳에서 검색해서 확인해보세요.

  59. 안녕하세요. 라엘 님,
    덕분에 서버 세팅해서 잘 이용하고 있습니다.
    다름이 아니라, Letsencrypt를 standalone 방식으로 신청해서 이용 주인데, 매일 오후 5시~7시 사이쯤에 아래와 같은 에러가 발생합니다.

    [Mon Mar 20 17:35:18.411612 2023] [ssl:warn] [pid 1028] AH01909: localhost:443:0 server certificate does NOT include an ID which matches the server name

    인증서는 aaa.com www.aaa.com bbb.com www.bbb.com 이렇게 도메인 2개 신청해서 이용 중입니다.
    서버 hostname은 현재 aaa.com으로 바꿔놓은 상태입니다.

    1. 개인적인 생각으로 우분투에서 저 에러는 안보여주게 하는게 낫지 않나 싶은데, servername localhost 라는 구문이 어딘가에 적혀 있을겁니다.
      그것을 도메인명으로 바꾸시면 됩니다.

      그런데 저라면 그냥 내버려둘것 같아요.

  60. Pingback: Certbot SSL인증서 만들기 5단계 » 유니워니

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>
*
*