본문 바로가기
생활팁/팁

(Express) letsencrypt를 사용하여 https 적용하기

by 행복론자 2019. 1. 29.

예전에 한 번 적용했다가 90일 만료 이후 갱신하는 과정에서 남기는 후기 



먼저 HTTPS와 HTTP의 차이?


HTTPS는 HTTP를 바탕으로 S(secure layer)가 붙어 동작한다. 

Web 주소창에 초록색 자물쇠가 적용되어 있는 사이트는 HTTPS을 사용하고 있다는 뜻이다.


http로 동작하는 사이트에서는 client와 server가 주고 받는 데이터가 노출되기 때문에 해킹된 wifi 망내에서 데이터를 주고 받을 경우, 해커가 모두 확인할 수 있다. 

http 사이트에서 중요 정보를 입력하는 page에서는 chrome에서 알림을 주기도 한다.


반대로 https가 적용된 사이트는 암호화된 데이터를 주고 받기 때문에 안전하다고 할 수 있다.

또 https가 적용된 사이트는 google이 언급했듯이 검색 노출에도 유리하며 전반적으로  사용이 장려되고 있다. 


아래 사진을 보는게 한 눈에 이해가 쉬울 듯하다 






이 밖에도 http2 적용을 위해, Facebook social login (by passport)를 사용하기 위해 SSL인증이 필요하다. 


어찌되었던, 이 좋은 것을 보통은 돈을 내고 발급받을 수 있지만


letencrypt와 greenlock-express를 통해 90일간 무료로 이용할 수 있다. 이후에는 연장해서 다시 쓸 수 있다.


이를 설치하기 위한 환경 및 과정을 최대한 간략히 적어보면



OS: Ubuntu 16.04


1.인증서를 설치한다.

2.인증서를 통해 발급대상 site가 본인의 것임을 확인 받는다.

3.express app에서 설정 객체를 만들어 적용한다.



1.인증서를 설치한다.


아래 명령어를 실행하면, certbot 관련 dir 및 module들이 설치된다. 

sudo apt-get install letsencrypt


이후 certbot을 통해 app이 본인의 것임을 인증받고 인증서를 저장한다. 인증을 받는 방법은 여러가지가 있지만

여기서는 webroot 방식을 적용해 설치한다.

certbot certonly --webroot -w ./public -d <server_url>

<server_url>을 입력하고 이 명령어를 수행하면 certbot은 내 app에서 /.well-known/acme-challenge 경로를 찾는다. 

이 명령어에서 ./public는 static folder로 사용할 곳을 뜻하므로 static folder를 설정하고 나면 

<server_url>/.well-known/acme-challenge에 접근이 가능해야 하고 이후 인증서를 설치할 수 있다.




2.인증서를 통해 발급대상 site가 본인의 것임을 확인 받는다.


그러면 express에서 static 폴더를 설정해보자 (public말고 다른 폴더를 지정해도 되나, 그럼 위에 명령어 ./public도 같이 바꿔줘야 한다.)

import express from 'express';
const app = express();
app.use(express.static('public'));


이후 app에 public으로 이동하여 폴더를 만들어 준다.

mkdir -p .well-known/acme-challenge



이제 이 이 명령어를 수행하면 인증서 발급 절차가 나오고 큰 문제 없이 설치된다. 

certbot certonly --webroot -w ./public -d <server_url>

이 단계가 끝나면 /etc/letsencrypt/live/<server_url> 경로에 인증서를 설치한다.




3.express app에서 설정 객체를 만들어 적용한다.


먼저 greenlock-express를 설치한다. express말고 다른 middleware를 쓸 경우 greenlock-hapi 처럼 greenlock- 뒤에 맞는 것을 찾아 설치한다. 

npm i --save greenlock-express



다음으로 설정 객체를 만든다.

각 옵션에 대해 설명을 적어봤다. 자세한 내용은 https://www.npmjs.com/package/greenlock-express

import greenlock from 'greenlock-express';

const lex = greenlock.create({
  version: 'v02', // 인증서 버전
  configDir: '/etc/letsencrypt', // 인증서 설치 경로 
  server: 'https://acme-v02.api.letsencrypt.org/directory',
  //server: 'staging' // staging은 테스트용으로 만들어보는 것
  email: 'test@test.com' // 만료예정시 안내 받을 이메일 주소, 이리로 메일옴 
  approveDomains: ['www.test.com', 'test.com'] // 발급대상 domain
  agreeTos: true // 약관동의
  renewWithin: 90 * 24 * 60 * 60 * 1000 // 인증서 유효기간, 최대
  renewBy: 89 * 24 * 60 * 60 * 1000 // 인증서 유효기간, 최소
});




이후, server를 키면 자동으로 https가 붙는다. 

import greenlock from 'greenlock-express';
import https from 'https';

const lex = greenlock.create({
  version: 'v02', // 인증서 버전
  configDir: '/etc/letsencrypt', // 인증서 설치 경로 
  server: 'https://acme-v02.api.letsencrypt.org/directory',
  //server: 'staging' // staging은 테스트용으로 만들어보는 것
  email: 'test@test.com' // 안내 받을 이메일 주소 
  approveDomains: ['www.test.com', 'test.com'] // 발급대상 domain
  agreeTos: true // 약관동의
  renewWithin: 90 * 24 * 60 * 60 * 1000 // 인증서 유효기간, 최대
  renewBy: 89 * 24 * 60 * 60 * 1000 // 인증서 유효기간, 최소
});

https.createServer(lex.httpsOptions, lex.middleware(app)).listen(process.env.PORT || 443); // 서버 실행 






반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글