본문 바로가기

https서버 공개하기

by Recstasy 2021. 9. 30.

서버공개를 결심하고, https 인증을 받지 않으면 아래와 같은 경고가 뜬다.

 

https 경고

 

 

위와 같은 경고는 피싱사이트를 방지하기 위한 목적이다. 피싱사이트는 실제 웹 사이트와 거의 똑같이 디자인 된 사이트를 의미하는데, 원본 사이트에만 보안 인증서를 발급하는 방식으로 피싱을 막을 수 있다.

 

https 보안 인증서는 사이트 피싱을 막기 위한 조치이며, 제 3자 기관인 인증 기관(Certification Authority, CA)이 대상 도메인이 올바른지 확인하는 방법이다. 방문자 입장에서 '비공개 설정' 경고가 뜬다면, 위험한 사이트임을 눈치채고, 회피할 수 있다. 최근 스팸과 피싱피해가 심각해지고 있는 상황임을 감안한다면, 보안 인증서 설치는 필수과정이라 볼 수 있다.

 

 

 

 


1 보안인증서 종류

 

보안 인증서는 크게 3가지로 분류할 수 있다.

 

도메인 인증 - 웹 사이트가 실제로 있는지 확인하는 인증서이며, 위장된 URL이 아님을 증명함
- 메일 송신만으로 도메인 유무를 확인하며, 비용이 저렴한 장점(주로 개인이 사용)

* Let`s Encrypt(무료)
*Symantec (https://securitycloud.symantec.com)
*comodo (https://comodossl.co.kr)
*GeoTrust (https://geotrust.com)
*SecureSign (https://securesign.kr)
*큐트러스트SSL (https://www.qtrustssl.com)

법적 존재 증명
(기업 실재 증명)
- 도메인 소유자 정보가 제 3자 데이터베이스에 등록된 실재 법인(개인)인지 확인
- 제3자 데이터베이스에 등록되어야 하며, 개인이 가져올 수 없음
- 도메인 인증보다 신뢰성이 높지만 연간 수십 만 원의 비용이 발생(주로 법인)
*애니서트 (https://anycert.co.kr)
EV(Extended Validation)
인증
- 등기부등본, 인감 증명같은 법적 서류를 확인 & 대조하는 방식
- 전화나 면담을 통해 실존 여부를 확인하며, 신뢰성이 가장 높음
- EV인증서는 대기업과 은행같은 웹 사이트 증명이 필요한 사이트에서 사용되며,
연간 수백 만원 비용발생

*한국전자인증 (https://www.crosscert.com/symantec/02_0_00.jsp)
*digicert (https://www.digicert.kr)

 

위의 인증서 중에서 개인 개발자가 관심갖는 인증서는 '도메인 인증'이며, 무료로 도메인 인증서를 발급해주는 곳은 Let`s Encrypt가 대표적이다.

 

 

 

 

 


2 Lets Encrypt 설치

Let`s Encrypt(https://letsencrypt.org)는 SSL 서버 인증서를 무료로 발급해주는 인증 기관(서비스)이며,

모질라(Mozilla), 구글, 시스코 시스템즈, 휴렛팩커드 등이 참여하는 ISRG(Internet Security Research Group)라는 공익 법인이 운영하고 있다.  Let`s Encrypt SSL의 인증 기간은 30일로 한정되지만 인증서 갱신 같은 작업을 자동화할 수 있기에 사실상 무료로 계속 이용할 수 있다. 

 

Let`s Encrypt(DV인증서) 인증서는 도메인 인증서이며, 도메인의 소유권을 인증하는 서버 인증서이다. 따라서 도메인을 소유하고 있어야하며, 해당 도메인에 대응하는 IP주소를 갖는 서버가 인터넷에 공개되어 있어야만 Let`s Encrypt를 이용할 수 있다. (도메인 구입 & 서버공개 필수) 서버를 공개하지 않았다면, 먼저 공유기의 DDNS서비스를 통해 서버를 공개한다.(개인pc 가정) DDNS를 이용한 홈서버 공개는 아래 포스팅을 참고하자.

(DDNS서버 공개:: https://webdoli.tistory.com/58)

 

 

 2-1 certbot 설치

sudo certbot certonly --standalone

 

 

certbot 설치과정에서 인증서 갱신 및 보안 정보를 수신할 수 있는 이메일 주소와 구입한 도메인을 입력하고, 서비스 약관(동의), Easy방식(Http, Https 모두 접근허용)을 선택한다. 정상적으로 설치가 이뤄지면 'Congratulations!'문구가 뜬다. 그리고 인증 문서는 / etc / letsencrypt / live / 경로에 .pem파일로 저장된다.

 

 

 

 

 


3 웹서버 실행

 

node.js의 웹서버를 실행하는 기본코드에서 https인증을 넣어보자. 

 

const express = require('express');
const app = express();

//메인 페이지 
app.get('/', (req,res)=>{
	res.send('hello world');
})

//https 서버연결
app.listen(3005);

 

 

 

https인증을 위해서는 pem파일을 읽어야하고, https의 인증기능이 필요하기 때문에 fs, https모듈을 설치한다. (npm install)

 

const express = require('express');
const app = express();

//https, fs모듈 추가
const https = require('https');
const fs = require('fs');

//인증파일 추가
const options = {
    ca : fs.readFileSync('/etc/letsencrypt/live/나의 도메인/fullchain.pem'),
    key : fs.readFileSync('/etc/letsencrypt/live/나의 도메인/privkey.pem'),
    cert : fs.readFileSync('/etc/letsencrypt/live/나의 도메인/cert.pem')
}

//메인 페이지 
app.get('/', (req,res)=>{
	res.send('hello world');
})

//https 서버연결
app.listen(3005);

 

 

 

options 객체는 Let`s Encrypt에서 받은 인증서 파일을 담고 있다. 해당 인증서를 https모듈의 options값에 넣고, 서버를 공개하면 https경고를 해제할 수 있다. 

 

const express = require('express');
const app = express();

//https, fs모듈 추가
const https = require('https');
const fs = require('fs');

//인증파일 추가
const options = {
    ca : fs.readFileSync('/etc/letsencrypt/live/imaginepress.xyz/fullchain.pem'),
    key : fs.readFileSync('/etc/letsencrypt/live/imaginepress.xyz/privkey.pem'),
    cert : fs.readFileSync('/etc/letsencrypt/live/imaginepress.xyz/cert.pem')
}

//메인 페이지 
app.get('/', (req,res)=>{
	res.send('hello world');
})

//https 서버연결
https.createServer(options, app).listen(3005);
});

 

 

 

기존의 app.listen부분은 삭제하고, 위와 같이 https모듈을 이용한 코드를 실행한다. 현재 테스트 프로젝트에는 3005번 포트를 사용하고 있기 때문에 3005포트를 입력해준다. certbot을 통해 보안인증서를 다운받을 때 입력한 도메인은 https:// ~~ 경고를 받지 않는다. 만일 인증서가 여러개 필요하다면, ' /etc/~~'폴더가 아닌 다른 경로에 인증서를 다운받고 certbot폴더로 이동한 뒤certbot을 실행하면 된다. ( ./certbot-auto )

 

git clone https://github.com/certbot/certbot

(git설치 설명은 생략)

댓글

최신글 전체

이미지
제목
글쓴이
등록일