letsencrypt를 활용해 블로그에 https 적용하기!

letsencrypt를 활용해 블로그에 https 적용하기!

이번 포스팅에서는 letsencrypt를 활용하여 http를 https로 전환하는 방법을 이야기하겠다!

letsencrypt

HTTP는 하이퍼 텍스트를 전송하는 프로토콜이다.

쉽게 말해, 여러분이 접속하고 싶은 사이트의 서버에서 여러분의 브라우저로 정보를 전송하는 규약이다.

현재 웹 사이트의 모두가 HTTP를 사용한다고 할 수 있을 만큼 대중적이다.

하지만 이 HTTP의 치명적인 단점이 있는데, 서버에서 브라우저로 데이터를 전송할 때 데이터가 암호화가 되지 않는 것이다.

전송 시 데이터를 암호화하기 위해서는 HTTPS(S = Secure)라는 프로토콜을 사용하면 되는데, 오늘날 유명한 사이트들의 주소를 보면 모두 적용되어 있는 https://를 내 블로그 사이트에도 적용해보자!

HTTPS를 적용하기 위해선 유명하고 신뢰할 수 있는 기관에서 발급한 인증서(binary01.me는 안전한 사이트입니다!라는 인증)가 필요하다.

몇 년까지만 해도 HTTPS를 적용하기 위해선 비용을 내고 인증서를 받아야 했는데, 최근에는 무료로 SSL 인증서를 발급해주는 letsencrypt를 많이 사용하는 것 같다.

환경 : Ubuntu 16.04

웹 서버 : http-server(npm)

letsencrypt를 활용하여 HTTPS를 적용하는 과정은 아래와 같이 크게 4가지로 나눌 수 있다.

  1. HTTPS 적용에 필요한 package 설치
  2. SSL 인증서 발급
  3. HTTPS 적용
  4. 자동 갱신 설정

HTTPS 적용에 필요한 package 설치

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install cron
$ sudo apt-get install -y letsencrypt

SSL 인증서 발급

letsencrypt에서는 인증서를 3가지 방법을 통해 발급할 수 있다.

  1. webroot - 호스팅 될 폴더 내부에 인증서가 유효한지 확인할 수 있는 파일을 업로드하여 사이트 유효성을 확인하는 방식
  2. Standalone - 해당 사이트의 네크워킹을 이용해 사이트 유효성을 확인하는 방식
  3. DNS - Domain을 쿼리하여 얻은 TXT Record로 사이트 유효성을 확인하는 방식

위 방식 중 오늘은 1번 webroot 방식으로 진행해볼 것이다.

아래 커맨드로 인증서를 발급받아보자!

$ letsencrypt certonly --webroot --webroot-path=/home/user_name/binary01.me/public -d binary01.me -d www.binary01.me
  • 방식 : –webroot
  • 호스팅할 폴더 경로 : –webroot-path
  • 도메인 : -d

알맞게 적은 후, Enter를 누르자!

아래와 같이 무사히 인증서가 발급되었다는 문구가 출력될 것이다.

HTTPS 적용

대부분이 대표적인 Web/WAS Server(Nginx, Apache)로 호스팅하겠지만, 나의 경우는 npm http-server를 사용하였다.

(다른 웹서버로 호스팅하시는 분들은 참고만 해주세요!)

$ http-server public/ -p 443 -S -C /etc/letsencrypt/live/binary01.me/cert.pem -K /etc/letsencrypt/live/binary01.me/privkey.pem

public은 react를 build하여 얻은 결과로 호스팅할 폴더(상대경로)이다.

호스팅할 폴더 이름이 public과 다르다면 그 폴더 이름을 넣자.

HTTP의 포트는 80번, HTTPS의 포트는 443번이다.

별도의 설정을 해주지 않으면 80번 포트로 들어온 HTTP 요청을 443번 포트(HTTPS)로 Redirect할 수 없다.

다른 웹 서버를 사용한다면 간단히 설정할 수 있지만, 나의 경우에는 Nodejs로 HTTP로 들어온 요청을 HTTPS Redirect해주는 간단한 서버를 만들어 띄웠다.

Redirect 용 서버 app.js

const express = require("express");
const app = express();
const port = 80;

app.all("*", (req, res) => {
  let protocol = req.headers["x-forwarded-proto"] || req.protocol;

  if (protocol == "http") {
    let from = `${protocol}://${req.hostname}${req.url}`;
    let to = `https://${req.hostname}${req.url}`;
    //redirect
    res.redirect(to);
  }
});

app.listen(port, () => console.log(`Example app listening on port ${port}!`));

그 결과, Redirect도 정상적으로 작동하고 마침내 자물쇠를 얻었다!😁😁

자동 갱신 설정

letsencrypt의 인증서의 유효 기간은 90일이다. 다행히 Certbot이라는 인증서를 갱신해주는 봇 소프트웨어로 만료 전 갱신이 가능하다.

$ certbot renew

위 커맨드 한 줄로 기간 연장 끝!

하지만, 90일에 한 번씩 잊지 않고 서버에 접속해서 저런 간단한 커맨드를 날릴 필요가 있을까..?

작업이 고정된 시간, 날짜, 간격에 주기적으로 실행할 수 있도록 도와주는 Crontab를 활용해서 서버가 자동으로 커맨드를 실행하게 해보자!

위 사진이 Crontab의 문법이다. 참고하여 원하는 주기로 커맨드 / 프로그램 등을 실행할 수 있다.

나의 경우는 Crontab를 아래와 같이 작성하였다.

$ crontab -e # crontab 편집기 열기
0 5 1 * * cerbot renew # 매월 1일 5:00 마다 cerbot renew 커맨드 실행!
5 5 1 * * /home/binary/binary01.me/ yarn deploy # 혹시 문제가 생길 수 있으니 인증서가 갱신된 5분 후 재배포~

마무리

사실 letsencrypt로 http를 https로 전환은 반년도 전에 했지만.. 미루다 미루다 보니 이제 썻다…😥😥

작성을 하면서도 기억이 하나도 안 나서 처음 하는 느낌이었다..😅😅

이제는 최소한 스크린샷이나 짧게라도 관련 내용 메모를 해야겠다! 안뇽 ~~