서버공개를 결심하고, 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설치 설명은 생략)
'웹개발 자료실 > 웹서버 개발 핸드북' 카테고리의 다른 글
node.js[Express] 라우팅 모듈패턴 (0) | 2021.09.30 |
---|---|
node.js 미들웨어 (0) | 2021.09.26 |
CentOS & node.js & Express 서버 외부 공개하기 (2) | 2019.04.24 |
centOS 7_ node.js최신버전 설치하는 방법 (0) | 2019.04.24 |
코노하로 웹 서비스 시작하기 (3) -도메인 연결- (0) | 2019.04.24 |
댓글