
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가지로 나눌 수 있다.
- HTTPS 적용에 필요한 package 설치
- SSL 인증서 발급
- HTTPS 적용
- 자동 갱신 설정
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 letsencryptSSL 인증서 발급
#letsencrypt에서는 인증서를 3가지 방법을 통해 발급할 수 있다.
- webroot - 호스팅 될 폴더 내부에 인증서가 유효한지 확인할 수 있는 파일을 업로드하여 사이트 유효성을 확인하는 방식
- Standalone - 해당 사이트의 네크워킹을 이용해 사이트 유효성을 확인하는 방식
- 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.pempublic은 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로 전환은 반년도 전에 했지만.. 미루다 미루다 보니 이제 썻다…😥😥
작성을 하면서도 기억이 하나도 안 나서 처음 하는 느낌이었다..😅😅
이제는 최소한 스크린샷이나 짧게라도 관련 내용 메모를 해야겠다! 안뇽 ~~