"Let’s Encrypt" 무료 SSL 인증서를 Nginx (Ubuntu)에 설정하는 방법

개인정보 보호 팁에 관한 많은 기사를 읽었다면, 가능할 때마다 HTTPS 버전의 웹사이트로 자동 리디렉션해 주는 “HTTPS everywhere” 확장 프로그램을 설치하라는 팁을 분명히 접했을 것입니다. 나쁜 점은 HTTPS everywhere 확장 프로그램이 방문하고 있는 웹사이트가 SSL을 구현한 경우에만 작동한다는 것이며, 대부분의 웹마스터에게는 그 자체로 어려운(비용이 많이 드는) 작업이 될 수 있습니다. 다행히도 Let’s Encrypt 운동 덕분에 웹마스터가 이제 사이트에 SSL 인증서를 추가하는 것이 더 쉬워졌습니다.

과거(현재 포함) SSL 인증서를 설정하려면 먼저 서버에서 개인 키를 생성한 다음, 인증 기관에서 SSL 인증서를 구매해야 하며(비용이 많이 들 수 있음), 마지막으로 서버에 설정해야 합니다. 이 과정에는 많은 기술적 요소가 관여하며, 올바르게 수행하지 않으면 SSL 인증서가 쓸모 없이 될 수 있습니다. Let’s Encrypt 프로젝트를 통해 사용자는 비용 없이 신속하게 사이트에 SSL 인증서를 추가할 수 있습니다. Mozilla, Akamai, Cisco, EFF 및 Google과 같은 대형 산업 플레이어들이 지원하기 때문에 대부분의 브라우저와 운영 체제에서 지원됩니다.

이번 튜토리얼에서는 Nginx 서버에 Let’s Encrypt SSL 인증서를 설정하는 단계를 설명합니다. 이 튜토리얼에서는 Ubuntu 14.04 서버를 사용하고 있으며, 작동 중인 Nginx Ubuntu 서버를 사용한다고 가정합니다. Ubuntu 16.04 서버에서는 지침이 다를 수 있습니다.

Let’s Encrypt 설치하기

먼저 Let’s Encrypt를 설치하려면 git이 필요합니다. 다음 명령어로 git을 설치합니다:

sudo apt-get install git bc

설치가 완료되면 Let’s Encrypt의 리포지토리를 클론합니다:

sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

환경 설정하기

SSL 인증서를 설치하고 설정하기 전에 웹 루트 디렉터리에서 .well-known 폴더에 대한 접근을 허용하는 것이 중요합니다. 기본적으로 파일명 앞에 “ . “가 있는 모든 파일과 폴더는 숨겨져 있으며 일반 사용자가 접근할 수 없습니다. 그러나 이번 경우에는 Let’s Encrypt가 유효성을 검사하기 위한 특수 파일을 저장할 곳이므로 일반인이 .well-known 폴더에 접근할 수 있는 권한을 제공해야 합니다.

Nginx 사이트 구성 폴더로 이동하여(사이트의 사용자 지정 구성 파일이 있는 경우 열고) 또는 기본값을 사용합니다:

cd /etc/nginx/sites-available  
sudo nano default

서버 블록에 다음 줄을 추가합니다:

location ~ /\.well-known {  
    allow all;  
}

구성 파일을 저장(Ctrl + O)하고 닫습니다(Ctrl + x).

Nginx 구성을 테스트합니다:

sudo nginx -t

모든 구성이 잘 작동하면 구성을 다시 로드합니다:

sudo service nginx reload

SSL 인증서 생성하기

이제 Nginx 구성을 마쳤으므로 다음 단계는 SSL 인증서를 설치하는 것입니다.

Let’s Encrypt 폴더로 이동합니다:

cd /opt/letsencrypt

다음 명령어를 실행하여 인증서를 생성합니다:

./letsencrypt-auto certonly -a webroot --webroot-path=/usr/share/nginx/html -d example.com

여기에서 변경해야 할 몇 가지 사항이 있습니다:

  • webroot-path를 사이트의 문서 루트 경로로 변경하십시오. 기본값은 “/usr/share/nginx/html”이지만, 구성에 따라 다를 수 있습니다.
  • “example.com”을 자신의 도메인 이름으로 변경하십시오. “example.com”과 “www.example.com”은 서로 다른 도메인입니다. 인증서가 여러 도메인을 지원하도록 하려면 명령의 끝에 -d example1.com을 추가하면 됩니다. 예를 들어 “example.com”, “www.example.com”, “example1.com” 및 “www.example1.com” 도메인의 SSL 인증서를 설정하려면 다음 명령어를 사용하십시오:
./letsencrypt-auto certonly -a webroot --webroot-path=/usr/share/nginx/html -d example.com -d www.example.com -d example1.com -d www.example1.com

첫 번째 실행 시 스크립트가 시스템에 여러 개의 Python 파일을 설치합니다. 설치가 완료되면 인증서 생성 프로세스가 시작됩니다. 먼저 이메일 주소를 입력하라는 메시지가 표시됩니다:

nginx-letsencrypt-email-address

이후 Let’s Encrypt 웹사이트의 서비스 약관을 읽으라는 메시지가 표시됩니다. “동의합니다”를 선택하십시오.

nginx-letsencrypt-read-tos

다음 메시지가 표시되면:

중요한 알림:  
 - 축하합니다! 귀하의 인증서와 체인이  
/etc/letsencrypt/live/example.com/fullchain.pem에 저장되었습니다. 귀하의 인증서는  
   2016-10-02에 만료됩니다. 향후 이 인증서를 새 버전으로 받거나 수정하려면  
   letsencrypt-auto를 다시 실행하십시오.  
   모든 인증서를 비상호적으로 갱신하려면  
"letsencrypt-auto renew"를 실행하십시오.  
 - Certbot이 마음에 드신다면 다음과 같은 방법으로  
우리의 작업을 지원해 주세요:  
  
   ISRG / Let's Encrypt에 기부:   https://letsencrypt.org/donate  
   EFF에 기부:                    https://eff.org/donate-le

귀하의 사이트(s)에 대해 SSL 인증서 생성에 성공했다는 뜻입니다. 대신 오류 메시지가 표시되면 오류를 수정하고 다시 시도하십시오.

사이트에 대한 SSL 인증서 활성화하기

이제 SSL 인증서를 생성했으므로, 사이트에 대해 활성화할 차례입니다.

Nginx 구성 폴더로 돌아가 사이트의 구성 파일을 엽니다:

cd /etc/nginx/sites-available  
sudo nano default

새로운 서버 블록을 만들고 블록 내에 다음 구성을 추가합니다:

server {  
        server_name example.com www.example.com;  
  
        listen 443 ssl;  
  
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;  
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;  
}

파일을 저장하고 닫습니다.

참고: 위의 내용은 Nginx 구성 블록의 간단한 버전입니다. 블록에 사용자 지정 구성을 추가해야 합니다.

마지막으로 구성을 테스트합니다:

sudo nginx -t

모든 것이 잘 되었다면 Nginx를 다시 로드합니다:

sudo service nginx reload

이제 완료되었습니다. 사이트에 대한 SSL 인증서를 성공적으로 설정했습니다. 이제 “https” 버전의 URL을 로드하여 동작을 확인할 수 있습니다.

Let’s Encrypt SSL 인증서 자동 갱신하기

대부분의 상업용 SSL 인증서는 최소 1년간 유효한 반면, Let’s Encrypt의 SSL 인증서는 3개월 동안만 유효합니다. 이 시간이 지나면 계속 사용하기 위해 갱신해야 합니다. Let’s Encrypt에는 인증서를 쉽게 갱신할 수 있는 renew 옵션이 있어 전체 설치 과정을 다시 거치지 않고도 인증서를 빠르게 갱신할 수 있습니다. 다음 지침에서는 SSL 인증서를 자동으로 갱신하기 위한 cron 작업을 설정하는 방법을 보여줍니다.

서버에서 다음과 같이 crontab을 엽니다:

sudo crontab -e

다음 줄을 추가합니다:

00 0 1 * * /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log  
05 0 1 * * /etc/init.d/nginx reload

위의 줄은 매주 월요일 자정에 SSL 인증서의 만료 일자를 확인하고 만료가 가까워지면 갱신합니다. 또한 Nginx를 재로드(오전 12시 5분)하여 갱신된 인증서가 사용되도록 합니다.

crontab을 저장하고 닫습니다.

결론

작은 웹사이트를 운영 중이고 사이트에 SSL을 추가하려는 경우, Let’s Encrypt는 사이트에 신뢰성을 추가하는 훌륭한 옵션입니다. 설치가 (상대적으로) 쉽고 비용이 없으며(맥주처럼 무료) 사용하지 않을 이유가 없습니다. 그러나 도메인 검증(DV) 인증서(가장 기본적인 유형의 SSL 인증서)만 제공하므로 조직 검증(OV) 또는 확장 검증(EV) SSL 인증서를 필요로 하는 기업의 경우 상업용 SSL 인증서가 더 나은 선택일 것입니다.