Let’s Encyrpt는 어떻게 SSL인증서를 발급해줄까?

이 글을 읽기 전에 여기를 방문하여 SSL과 CA가 무엇인지에 대해 쉽고 간략한 설명을 먼저 읽어 보시면 큰 도움이 됩니다.

Let’s Encrypt와 ACME 프로토콜은 사람의 개입없이 브라우저 신뢰 인증서를 자동으로 발급하고 HTTPS 서버 설정을 가능하도록 만드는데 목적이 있습니다. 이건 웹서버에서 도는 인증서 관리 에이전트(Certificate management agent)가 있기 때문에 가능한 것이지요.

이 기술이 어떻게 가능한지 이해하기 위해, Let’s Encrypt에서 제공하는 인증서 관리 에이전트를 이용해 https://example.com/ 의 설정 과정을 함께 살펴보기로 하죠.

이 과정을 두 단계로 설명할 수 있습니다.

  • 1단계: 인증 – 에이전트가 CA 에게 도메인이 온전히 웹서버의 통제 하에 있는 것을 증명하는 것
  • 2단계: 발급 – 에이전트가 도메인에 대한 인증서를 요청, 갱신, 폐기하는 것

도메인 검증

Let’s Encrypt는 공개 키로 서버 관리자를 식별합니다. 최초 에이전트 소프트웨어는 Let’s Encyrpt와 통신하여 새로운 키 쌍을 생성하고, Let’s Encrypt CA에게 서버가 하나 또는 그 이상의 도메인의 통제권을 가지고 있는 것을 증명합니다. 이 과정은 지금까지 SSL인증서를 발급을 위해 계정을 생성하고 거기에 도메인을 추가하는 등 CA들이 했던 전통적인 과정과 흡사합니다.

인증서 발급을 위해 에이전트는 Let’s Encrypt CA에게 example.com 도메인이 서버의 통제 하에 있는지 증명하기 위해 필요한 것들을 요청합니다. 그러면 Let’s Encrypt CA는 요청한 도메인을 검증하기 위해 하나 또는 그 이상의 첼린지 셋트를 발급합니다. “너 진짜야? 그럼 내가 퀴즈 낼테니 맞춰봐” 하는 것처럼 요청한 도메인을 테스트하여 검증하려는 것이죠. 이렇게 검증하는 방법을 여기서는 첼린지라고 부릅니다. 이 때 에이전트는 아래 2가지 방법 중 하나를 선택할 수 있습니다.

이런 첼린지와 함께, Let’s Encrypt CA는 에이전트가 키 쌍을 제어할 수 있다는 것을 증명하기 위해 개인 키 쌍으로 서명되길 원하는 임시 파일을 제공합니다. 아래 그림을 한번 보세요.

에이전트가 Let’s Encrypt CA로 부터 요구받은 첼리지를 완료합니다. 두 번째 탐색 방법을 완료할 수 있다고 가정해보겠습니다. 우선 https://example.com 사이트의 특정 경로에 파일 하나를 만듭니다. 에이전트는 제공된 서명용 임시 파일을 개인 키를 이용해 서명합니다. 이 과정을 에이전트가 완료하면 CA에게 검증이 완료되었다고 알립니다.

CA는 이제 첼린지가 성공했는지 체크하고 제공된 임시 파일의 서명을 확인합니다. 그리고 웹서버로 부터 파일을 다운로드하여 제대로 내용이 작성되었는지 점검합니다.

서명이 유효하고 첼린지까지 성공했음을 확인하면, 공개 키로 식별된 에이전트는 example.com의 인증서 관리를 허가받게 됩니다. 이 때 example.com의 키 쌍을 “허가된 키 쌍(authorized key pair)”이라고 부릅니다.


인증서 발급과 폐지

에이전트가 인증된 키 쌍을 가지게 되면 요청, 갱신, 폐지하는 것은 간단한 과정입니다. 인증된 키 쌍을 가지고 메시지에 서명에서 전송하면 끝이죠.

도메인의 인증서를 얻기 위해 에이전트는 Let’s Encrypt에게 지정된 공개키로 example.com 도메인의 인증서 발급 요청을 요구하는 ‘인증서 서명 요구(Certificate Signing Request)’를 만듭니다. 이걸 CSR이라고 부를께요. CSR은 보통 CSR의 공개 키에 해당하는 개인 키의 서명이 포함됩니다. 에이전트는 Let’s Encrypt CA에게 허가 여부를 알리기 위해 example.com의 허가된 키로 전체 CSR에 서명합니다.

Let’s Encrypt CA가 요청을 받게 되면, 양쪽 서명을 모두 확인합니다. 문제가 없으면 CSR의 공개키로 exmaple.com의 인증서를 발급하고 에이전트에게 리턴합니다.

인증서 폐기도 비슷합니다. 에이전트는 example.com의 허가된 키로 인증서 폐기 요청을 하고, Let’s Encrypt CA는 요청이 허가된 것이지 여부를 확인합니다. 맞다면, OCSP와 같은 일반 폐기 채널을 통해 폐기를 진행합니다. 이렇게 하면 브라우저와 같이 신뢰할 수 있는 당사자가 폐기된 인증서를 받아들이면 안된다는 것을 알 수 있게 됩니다.

이 글은 Let’s Encrypt의 How It Works라는 글을 번역한 것입니다.

SSL인증서가 필요해요. 그런데 Let’s Encrypt가 무엇인가요?

개요

Let’s Encrypt란?

Let’s Encrypt는 SSL 인증서를 무료로 발급해주는 CA(Certificate Authorities)입니다. 여러 글로벌 기업의 후원을 받고 있으며 모질라(Mozilla) 재단에서 ‘신뢰할 수 있는 인증 기관(Trusted CA)’ 으로 인증도 받았습니다. 따라서 베리사인(VeriSign)이나 코모도(Comodo)와 같은 유명 인증 업체와 같은 신뢰도를 가지며 SSL 암호화 기술 방식과 동작도 정확히 동일합니다. 단지 다른 것은 사이트의 인증에 문제가 있어 최종 웹사이트 방문자가 피해를 입었을 경우 배상 여부만 차이가 있을 뿐입니다. 여기를 누르면 추가자거인 SSL과 CA에 대한 쉽고 간략하게 설명한 글을 볼 수 있습니다.

Certbot

Let’s Encrypt의 SSL인증서는 ACME(Automatic Certificate Management Environment) 프로토콜을 준수하는 프로그램을 이용해 발급을 받을 수 있는데 Let’s Encyrpt는 Certbot 사용을 권장하고 있습니다. 여기를 방문하면 ACME를 지원하는 기타 프로그램 목록을 볼 수 있습니다. 참고로 2016년 5월까지 Certbot은 letsencrypt 나 letsencrypt-auto로 불렸습니다.

Certbot을 시스템 관리자가 서버에서 실행하는 프로그램입니다. 시스템 관리자는 Certbot을 통해 인증서를 직접 요청할 수 있습니다. 다양한 웹서버와 운영체제에 적합한 패키지 역시 배포하고 있습니다. 이 페이지에서 자신의 환경에 맞는 패키지를 검색하고 설치하는 방법을 쉽게 찾을 수 있습니다. Certbot에 대한 문서는 여기를 참고하세요.


발급 방법

인증서를 발급하는 방법은 크게 2가지로 나눌 수 있습니다. 쉘을 통해 직접하는 것, 그리고 호스팅 업체에서 제공하는 기능(cPanel 등을 통해)을 이용하는 것.

쉘(SSH)로 발급받기

쉘 엑세스 권한이 있다면 Certbot ACME 클라이언트 사용을 추천합니다. Certbot은 인증서 발급과 설치를 갑작스런 중단없이 설치할 수 있도록 자동화 해줍니다. 자동 설정을 원치않는 고급 사용자를 위한 전문가 모드도 사용 가능하고 사용하기 쉬우며 많은 운영체제에서 동작합니다. 문서화도 훌륭하게 되어 있습니다. 여기를 방문하시면 여러분의 운영체제와 웹서버에 맞는 사용법을 얻을 수 있습니다.

쉘(SSH)없이 발급받기

Let’s Encrypt를 쉘 접근없이 사용하는 최고의 방법은 호스팅 업체에서 제공하는 내장 기능을 사용하는 것입니다. 여러분이 쓰는 호스팅 업체가 Let’s Encrypt를 지원한다면 여러분을 대신해 설치하고 최신 버전으로 유지하는 등을 과정을 자동으로 해줄겁니다. 몇몇 호스팅 업체의 경우에는 이 기능을 켜기 위해 설정이 필요하기도 하고 자동으로 해주기도 합니다.

여기에 Let’s Encrypt를 지원하는 호스팅 업체 목록이 있습니다.

여러분의 호스팅 업체가 Let’s Encrypt를 지원하지 않는다면 해당 업체에 Let’s Encrypt 기능 지원을 요청하세요. 저희도 최선을 다해 해당 업체에 적합한 방법을 지원할겁니다.

여러분이 사용하는 호스팅 업체에서 Let’s Encrypt를 지원할 의사는 없지만 개별 인증서 업로드를 허용하는 경우라면 로컬 머신에 Certbot을 설치한 다음 수동 모드를 사용할 수 있습니다. 수동 모드에서는 소유권 확인을 위해 특정 파일을 업로드할 수 있고, Certbot은 호스팅 업체에 업로드할 수 있는 인증서를 탐색합니다. 그렇지만 이 방법은 웬만하면 추천하지 않습니다. 시간을 많이 잡아먹기도 하고 인증서가 만료될 때 마다 매년 수 차례 이 과정을 반복해야 합니다. 사용하시는 호스팅 업체에 Let’s Encrypt 지원을 요청을 다시 한 번 생각해보시거나, 호스팅 업체 교체를 검토해보세요.


실제 발급 과정을 따라하려면 아래 글을 참고하세요.
Let’s Encrypt 무료 SSL인증서 발급 받기 (어렵지 않아요)

Let’s Encrypt 무료 SSL인증서 발급 받기 (어렵지 않아요)

얼마 전 구글 크롬이 HTTPS를 지원하지 않는 사이트에 접속하면 주소 옆에 ‘주의요함’이라는 라벨을 붙이기 시작했습니다. 더불어 많은 사이트들이 https 지원을 위한 SSL 인증서를 적용하려고 하고 있는데요. 처음 SSL 인증서를 적용하려고 알아보면 Verisign, Codomo 이런 사이트들이 나오면서 몇 십에서 많게는 몇 백만원까지 가격이 붙어 있는 것을 보고 깜짝 놀라게 됩니다. Let’s Encyrpt는 글로벌 기업의 후원을 받고 있는 무료 SSL 발급 CA입니다. 아래 포스팅을 읽어보시면 SSL과 Let’s Encrypt가 어떤 식으로 인증서를 발급하는지 알 수 있습니다.


순서

  1. 아파치 설치 및 설정
  2. Certbot 설치
  3. Certbot으로 인증서 발급
  4. https를 위한 아파치 가상 호스트 설정
  5. 방화벽 설정
  6. 아파치 재시작

전제조건

이 글은 ubuntu 16.04, Apache 2.4.18을 기준으로 설명하지만 다른 환경에서도 대소동이 할 것입니다.


[1/6] 먼저 아파치를 설치하고 간단한 설정을 해봅시다.

  1. 패키지 업데이트sudo apt update
  2. 아파치 설치sudo apt install apache2
  3. 아파치 설정 /etc/apache2/sites-available/자기설정파일명(예를 들어, 000-default.conf 같은) 을 열고 ServerName, ServerAdmin, DocumentRoot 를 수정합니다.
  • ServerName: 도메인 주소 (예를 들어, example.com)
  • ServerAdmin: 관리자 이메일
  • DocumentRoot: 웹서버가 서비스할 소스가 있는 디렉토리 경로 (예를 들어, 워드프레스를 설치하고 있다면 htdocs의 경로)

그리고 사용할 파일이 /etc/apache2/sites-enabled 디렉토리에 심볼링 링크로 연결되어 있는지 확인합니다. /etc/apache2/sites-enabled 디렉토리 안에 위에서 설정한 .conf 의 파일명과 같은 파일이 보이면 됩니다. 안 보인다면 sudo a2ensite 자기설정파일명을 하면 /etc/apache2/sites-enabled 디렉토리에 자동으로 심볼릭 링크됩니다.


[2/6] Certbot을 설치합시다.

Let’s Encrypt에서는 SSL인증서를 받을 때 Certbot이라는 프로그램을 이용하길 권장합니다. Certbot은 SSL인증서를 발급받는 여러 에이전트 중 하나인데 Certbot 이외에도 IETF 표준인 ACME 프로토콜을 준수하는 다른 발급 프로그램을 쓸 수도 있습니다. 하지만 Certbot을 쓰시길 권장합니다.

Certbot을 설치하려면 패키지 매니저를 이용할 수도 있고, 그냥 최신 버전을 다운로드 받아서 쓸 수도 있습니다. Let’s Encrypt에서는 특별한 이유가 없으면 ‘패키지 매니저에서 제공하는 Certbot 패키지’를 사용하고, 그게 안될 경우 certbot-auto를 다운 받아 사용하라고 되어 있습니다. 일부 사용자들은 패키지 매니저에 있는 것은 버전 업데이트가 빨리 빨리 안될 수 있으니 cerbot-auto를 받아쓰는 것이 좋다고 말하는 사람도 있다는 것 알아두세요^^ 아래는 2가지 설치 방법입니다. 둘 중에 원하는 방식을 선택하여 설치하면 됩니다.

Unless you have very specific requirements, we kindly suggest that you use the Certbot packages provided by your package manager (see certbot.eff.org). If such packages are not available, we recommend using certbot-auto, which automates the process of installing Certbot on your system. (원문링크)

1순위 – 패키지 매니저에서 제공하는 Certbot 패키지 사용

$ sudo apt update
$ sudo apt install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt update
$ sudo apt install certbot python-certbot-apache 

2순위 – certbot-auto를 다운로드하여 사용

user@webserver:~$ wget https://dl.eff.org/certbot-auto
user@webserver:~$ chmod a+x ./certbot-auto

[3/6] Certbot으로 인증서 발급하기

1순위 – 패키지 매니저에서 제공하는 Certbot 패키지를 사용하기로 했다면 –

$ sudo certbot --apache certonly

2순위 – certbot-auto를 사용하기로 했다면 –

certbot-autof르 다운받은 경로로 이동한 다음

$ sudo ./certbot-auto --apache certonly

[주의!] certonly를 꼭 붙여주세요.

certonly 옵션을 주는 이유는 certbot보고 “인증서 발급만 하고 다른 아파치 설정은 건드리지 마!” 이렇게 말하는 겁니다. certonly를 빼고 명령을 실행하면 예상치 못한 일이 생길 수 있으니 주의해야 합니다. 특히 비트나미(bitnami)와 같이 미리 빌드된 워드프레스를 사용하는 경우 기본적으로 아파치 사용부터 설정까지 많은 부분이 다른데 certonly를 빼고 명령을 실행하면 bitnami의 아파치가 아니라 다른 아파치가 실행되어 자신의 워드프레스 접속이 안될 수 있습니다.

[참고] webroot?!

webroot는 certbot이 인증서를 설치하는 방법 중 하나입니다. webroot를 이용하려면 .well-known 폴더를 만들고 .htaccess파일을 만들어 해당 디렉토리의 옵션을 설정해서 Certbot이 도메인을 인증하는 첼린지(Challenge)를 수행합니다. 위의 방법을 이용하면 Certbot이 스스로 이런 첼린지를 수행할 권한을 설정 후 첼린지가 완료되면 다시 원상복구합니다. 그러니 이것도 특별한 이유가 없다면 위에 1순위 방법을 이용하면 편리합니다. 인증서 발급 과정이 궁금하다면 여기를 눌러 글을 더 읽어보세요.

이렇게 하면 위에 아파치 가상 호스트(Virtual Host)설정에 입력되어 있는 도메인이 보기로 나옵니다. 번호를 눌러 선택하세요. 만약 도메인이 안나온다면 아파치 가상 호스트 설정에 ServerName을 확인하세요. 뭔가 잘못되었을 수 있습니다. (그냥 도메인을 수동으로 입력해도 인증서는 발급 받을 수 있지만 어차피 해당 도메인을 https로 서비스 할 것이기 때문에 아파치 설정을 먼저 한 것입니다.)

그리고 아래 3가지 과정이 나옵니다.

  • 이메일 입력
  • 이용 약관 동의 (A:동의)
  • Let’s Encrypt의 뉴스레터 수신 여부 (Y:동의 N:거부) – (선택사항) 거부해도 상관없으니 원하는 대로

여기까지 마치면 이(/etc/letsencrypt/live/자기가설정한도메인명) 경로에 인증서 파일 4개가 생성됩니다.

  • cert.pem
  • privkey.pem
  • chain.pem
  • fullchain.pem

[4/6] 이제 https 서비스를 위한 가상 호스트를 설정할 차례입니다.

지금까지 아파치 웹서버 설정했고, Certbot 다운받아 인증서 발급까지 마쳤습니다. 이제 남은 건 https 가상 호스트와 방화벽 설정 뿐입니다. 거의 다 왔어요. 힘내세요.

/etc/apache2/sites-available 디렉토리에 가면 기본적으로 생성된 default-ssl.conf가 있을겁니다. 복사를 해서 써도 좋고 자신이 원하는 설정을 사용해도 좋습니다. 이 파일을 열고 아래 설정을 넣어줍니다.

  • ServerAdmin: 관리자 이메일
  • DocumentRoot: 웹서버가 서비스할 소스가 있는 디렉토리 경로 (예를 들어, 워드프레스를 설치하고 있다면 htdocs의 경로), 위에서 설정한 것과 같습니다.

그리고 이제 대망의 SSL 설정을 넣어줍니다. 여기에 발급받은 키 경로를 입력하면 끝입니다. 이미 입력되어 있는 상태이기 때문에 주석(# 표시)을 풀어주면 될거에요. 경로는 아래와 같습니다.

SSLEngine on
SSLCertificateFile      /etc/letsencrypt/live/자기도메인주소/cert.pem
SSLCertificateKeyFile   /etc/letsencrypt/live/자기도메인주소/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/자기도메인주소/chain.pem

이제 ssl을 활성화하고 설정도 사용할거라고 표시해줍니다.

sudo a2enmod ssl
sudo a2ensite 여러분의SSL설정파일명(예를 들어, default-ssl.conf)

[5/6] 방화벽 설정

호스팅 사이트 방화벽 확인

호스팅 사이트에서 방화벽이 열려있는지 확인합니다. 예를 들어, AWS lightsail의 경우 ‘네트워킹’ 탭에 가면 방화벽 설정이 있습니다. AWS lightsail은 기본적으로 http(80), ssh(22)만 열려있기 때문에 https(443)도 추가해줘야 합니다.

우분투 방화벽 확인

운영체제에도 방화벽이 있습니다. 기본적으로 꺼져있으나 우리는 방화벽을 켠 다음 원하는 포트만 열겠습니다.

# 방화벽 상태보기
$ sudo ufw status verbose

# 방화벽 열기
$ sudo ufw allow http
$ sudo ufw allow https
$ sudo ufw allow ssh

# 방화벽 활성화
$ sudo ufw enable

[6/6] 아파치 재시작

$ sudo systemctl restart apache2

짠! 이제 https로 접속해보세요.

SSL 인증서는 도대체 뭔가요?

개요

SSL은 Secure Sockets Layer의 약자입니다. 인터넷을 할 때 왔다갔다 하는 내용을 암호화 해주는 프로토콜(규칙)입니다. 함께 언급되는 SSL인증서는 이런 보안통신을 하기 위한 전자 파일입니다. SSL인증서를 서버에 설치함으로써 SSL 프로토콜을 사용하여 보안 통신을 할 수 있게 되는 것입니다.

역할

우리가 인터넷에서 뭔가 찾을 때 웹브라우저를 열고 URL(주소)를 입력하면 그 결과로 뉴스도 보고 동영상도 봅니다. 이메일에 로그인하기도 하지요. 이렇게 웹브라우저와 같은 클라이언트와 웹페이지를 응답하는 서버 간에 통신을 중간에 다른 사람이 가로채더라도 알지 못하도록 하는 규약이 SSL입니다. 지금 웹브라우저의 주소창 제일 왼쪽을 한번 보세요. 열쇠 마크가 표시되어 있습니다. 이게 SSL 인증서가 적용되어 있다는 표시 입니다. 열쇠 마크를 눌러보면 더 자세한 정보를 볼 수 있습니다. 인증서라는 단어 때문에 뭔가 계약서나 종이같은 느낌이 들지만 SSL인증서는 컴퓨터 상의 파일 형태로 존재합니다.

물론 다른 역할도 많습니다만 한 가지만 더 소개해보겠습니다.
웹브라우저로 example.com을 입력하고 엔터를 치니 웹사이트가 나타납니다. 그런데 화면에 보여지는 곳은 example.com이 아닐 수도 있고 example.com의 실소유자가 아닐 가능성도 존재합니다. 또 example.com이 사기를 유도하는 사이트일수도 있습니다. 이렇게 원치않는 사이트를 방문하게 되면 개인정보유출이나 금전적 피해 등 사고가 발생하게 됩니다. 이런 것을 막고자 SSL인증서를 사이트에 적용하기도 합니다. SSL인증서는 발급 시 example.com 도메인의 소유주 확인을 하고, 사이트가 방문자에게 사기를 치는 등 문제가 있는지 확인 후 인증서를 발급해주기 때문에 방문한 사이트에 SSL인증서가 적용되어 있다면 인증 기관에서 방문한 사이트가 일정 수준으로 안전하는 것을 보증하는 것이라 할 수 있습니다.

CA?

CA는 Certificate Authorities의 약자로 인증서를 발급하는 기관입니다. 이런 기관은 누구나 될 수 있는데 그런 이유로 모질라 재단에서는 ‘신뢰할 수 있는 CA’라고 해서 Trusted CA 목록을 발표, 공유하고 있습니다. VeriSign, Codomo, Let’s Encrypt와 같은 곳이 CA입니다. 특히 Let’s Encrypt는 여러 유명한 글로벌 회사들로 부터 후원을 받아 운영되는 CA로 모질라 Trusted CA 목록에 등재되었고 많은 개인들과 소규모 스타트업들이 이 인증서를 사용하고 있습니다. 덕분에 우리 인터넷 환경은 더 안전해지고 있지요.

인증의 종류

위에 역할 설명에서 SSL인증서 발급 시 소유주와 사기 사이트인지 CA에서 아닌지 확인한다고 했습니다. 하지만 모두 이렇게 하는 건 아니고요. 인증의 종류에 따라 그 수준이 나뉩니다. DCV인증은 Domain Control Validated라고 해서 신청자가 도메인 소유주가 맞는지 확인 정도만 합니다. 반면 OV인증은 Organization Validated의 약자로 도메인 소유자 뿐만 아니라 이 사이트가 적정한지까지 CA에서 검증합니다.

TLS?

점점 TLS라는 용어도 SSL 만큼이나 자주 보이는 것 같습니다. TLS는 Transport Layer Security의 약자로 SSL 3.0 기반으로 표준화된 인증 방식입니다. 기존에 SSL 3.0 버전까지는 대다수가 쓰는 사실 상의 표준이었지 RFC와 같은 문서를 통해 정의된 표준 규약은 아니었습니다. 요즘은 TLS 방식이 권장되고 있습니다. ‘SSL/TLS 인증서’ 라고 표기하는 경우도 종종 볼 수 있는데 SSL에서 TLS로 넘어가는 과도기적 용어로 사용되고 있습니다.

유료 SSL인증서가 무료보다 더 고급 암호화를 사용하나요?

CA 중에서는 VeriSign이나 Codomo와 같이 유로 SSL인증서를 발급하는 곳이 있고 Let’s Encrypt와 같이 무료 인증서를 발급해주는 곳이 있습니다. 유료와 무료 SSL 인증서 간에 기술적 차이점 없습니다. 당연히 유료 SSL인증서를 적용한다고 해서 더 강화되고 고급 암호 기능을 사용하는 것이 아니구요. 유료와 무료의 차이는 해당 SSL인증서를 적용한 사이트에 인증과 관련한 문제가 생겼다면 유료 인증서를 발급한 곳에서는 해당 웹사이트를 방문한 사람에게 SSL인증서를 구매한 회사를 대신해 일정 부분 금액을 배상합니다. 비싼 인증서는 보상의 범위와 규모가 커지고 싼 인증서는 보상의 범위와 규모가 상대적으로 작습니다. 무료 인증서는 CA에서 이러한 배상을 해주지 않구요.

이제 대략 SSL과 TLS, 그리고 인증서에 대해 알게 되셨지요? 몇 달 전 구글에서 http로 서비스를 하는 사이트에 대해 ‘주의 요함’이라는 문구를 강제로 주소 옆에 띄우기 시작했습니다. 그러자 사람들이 부랴부랴 SSL 인증서 적용을 알아보기 시작했지요. 원래 네이버도 첫 메인 페이지는 http로 서비스를 하고 있었던 것을 알고 있는데 지금 보니 https로 바뀐 것 같네요. 지마켓과 11번가는 아직 http로 서비스하고 있어 ‘주의 요함’이라는 문구가 표시되고 있습니다. 아무래도 SSL인증서를 적용해 https로 서비스하면 속도 저하가 일어날 수 있기 때문에 쇼핑몰과 같이 이미지를 많이 쓰고 빨리 메인 페이지가 떠야 하는 사이트에서는 좀 주저하기도 합니다. 다른 이유일 수도 있구요. 대신 아이디, 패스워드를 넣는 로그인 창은 해당 메인 페이지에 포함되어 있지 않고 링크를 눌러 다른 페이지나 팝업을 통해 SSL인증서가 적용된 페이지에서 진행하도록 하고 있지요. 쿠팡은 메인 페이지에도 SSL인증서가 적용된 것이 보입니다.

네이버(naver.com)와 쿠팡(coupang.com)은 Sectigo의 Sectigo RSA Organization Validation Secure Server CA 인증서를 쓰고 있네요. Comodo에서 변경된 브랜드입니다. 다음(daum.net)은 Thawte TLS RSA CA G1을 사용하고 있어요. DIGICERT라는 CA에서 발급한 인증서입니다. 여러분이 자주가는 사이트의 인증서는 어떤 CA에서 발급한 것을 쓰고 있는지 한번 확인해 보세요. ^^

Let’s Encrypt SSL 인증서 자동 갱신 설정 방법

Let’s Encrypt에서 발급하는 인증서는 90일짜리 단기 인증서입니다. 3개월에 적어도 한 번은 갱신을 해야 한다는 뜻이기도 합니다. 아래는 이 인증서를 갱신하는 방법에 대해 알아보겠습니다.

참, 그전에 Let’s Encrypt 무료 SSL인증서 발급 받기 (어렵지 않아요) 글을 보신 분들은 아시겠지만 패키지 매니저를 통해 설치하셨으면 certbot을, wget으로 직접 다운로드하셨으면 certbot-auto를 가지고 계실겁니다. 둘 다 명령어는 똑같습니다. certbot-auto은 certbot을 랩핑한 것이거든요.

아래에서는 certbot을 예를 들어 설명하겠지만 certbot-auto를 설치하신 분들은 certbot자리에 대신 certbot-auto를 입력하시면 됩니다. certbot-auto를 실행할 때는 파일이 있는 곳에서 실행하시거나, 전체 경로와 함께 넣으셔야 한다는 점도 잊지마세요~^^

갱신 테스트

아래 명령어로 실제 갱신이 아니라 잘 갱신되는지, 명령에 오류가 나진 않는지 등을 테스트 해 볼 수 있습니다.

$ certbot renew --dry-run

실제로 갱신하기

뭐 별 것 없습니다. --dry-run만 빼고 실행하시면 됩니다.

$ certbot renew

인증서 만료일 확인하기

Certbot으로 부터 발급받은 인증서들에 대한 정보를 표시합니다.

$ certbot certificates

자동 갱신하기

그런데 이걸 3개월 알람을 맞춰두고 매 번 사람이 하는 것 까먹을 수도 있고 여간 불편한게 아닙니다. 걱정하지 마세요. 우리에겐 크론탭(Crontab)이 있습니다. Crontab은 정해진 일시에 반복적으로 특정 작업을 할 수 있는 프로그램이고 우분투에 기본적으로 설치되어 있습니다.

간단한 Crontab 명령과 규칙을 살펴보겠습니다.

자주쓰는 명령 2개

# Crontab 보기
$ sudo crontab -l

# Crontab 편집
$ sudo crontab -e

# Crontab 실행 로그
$ view /var/log/syslog

crontab 명령어 앞에 sudo를 써준 것은 root 권한의 크론탭을 수정하고 보겠다는 의미입니다. 각자 웹서버와 인증서를 관리하는 사용자 계정의 크론탭을 이용하면 됩니다. certbot을 그냥 설치했을 때 /etc/letsencrypt에 인증서를 쓸 권한이 필요하므로 여기서는 sudo 를 붙여주었습니다.

규칙

위 그림처럼 분, 시, 일, 월, 요일, 명령 순서로 기재하면 됩니다.
예를 들어, /home/user/run.sh를 실행하고 싶다면

# 매 시 10분에 
$ 10 * * * * /home/user/run.sh

# 10분 마다 주기적으로 
$ */10 * * * * /home/user/run.sh

# 토요일 새벽 3시에
$ 0 3 * * 6 /home/user/run.sh

이렇게 하면 됩니다.


인증서 갱신하기

만약 매월 1일 03시에 인증서를 갱신하고 싶다면 아래와 같이 설정하면 됩니다.

$ 0 18 1 * * /usr/bin/certbot renew --renew-hook="sudo systemctl restart apache2"

위에 새벽 3시인데 크론탭에는 18시라고 쓴 것은 서버 시간에 맞췄기 때문입니다. date 명령으로 자신의 서버 시간을 확인하고 시간을 설정하세요. 이 페이지( https://www.worldtimebuddy.com/kst-to-utc-converter )에서 시간을 쉽게 변환해볼 수 있습니다.

뒤에 나오는 –renew-hook은 인증서 갱신을 성공적으로 마치면 아파치를 재시작하기 위해 넣어주었습니다. 인증서 갱신 전에 실행되는 --pre-hook도 있습니다.