아마존 aws ec2 우분투 웹서버에(nodejs express) 무료SSL(https) 적용하기(삽질 많이함)
일단 간단하게 요약
1. ec2 우분투 서버 기본세팅(nodejs 설치)
2. ec2 탄력적 IP 등록(고정아이피로 세팅하는 절차임)
3. freenom.com 사이트 접속해서 무료 도메인 생성(도메인은 본인 마음대로 다른 사이트에서 구매해도 무방함)
4. aws Route53 호스팅 생성을 하고, 3번에서 생성한 도메인 등록, 그리고 오픈되는 네임서버 정보를 미리 메모해두자.(4개가 나올거임)
5. freenom.com 에 접속해서 3번에서 등록한 도메인의 네임서버 정보를, 4번에서 등록한 Route53 호스팅 도메인의 네임서버정보로 수정함.
6. 4번에서 등록한 호스팅에 들어가서, 등록한 도메인에 A레코드 추가, A레코드 IP는 2번에서 발급받은 탄력적 IP를 등록하면 됨.
7. 우분투에 접속해서 무료 SSL 발급받기, 명령어 아래참고
메모) 탄력적IP 를 사용하지 않으면, 우분투를 재부팅시에 Route53의 A레코드 IP 주소를, 우분투의 퍼블릭 IPv4 의 주소로 세팅을 매번 새로 갱신해주어야 한다.(우분투 재부팅시에 IP를 새로 할당받기 때문)
하지만 탄력적IP 는 요금이 발생한다... 번거로워도 금액을 조금이라도 아끼자면 위처럼 해도 된다.
하지만 기업의 실서비스를 한다고 가정한다면 탄력적 IP는 필수일 것이다.(난 개인서버라서 안해도 됨)
무료 SSL 라이브러리 설치
# apt-get install letsencrypt
무료 SSL 발급받기
# certbot certonly --manual --email 이메일주소 -d 도메인주소
너무 많은 시도를 하면 벤 당한다.(하루 지나야 풀어주드라)
그래서
# certbot certonly --dry-run --manual --email 이메일주소 -d 도메인주소
위와같이 --dry-run 옵션으로 미리 테스트를 하는게 좋음.
위 명령어 후에
도메인주소/.well-known/acme-challenge/랜덤특수문자열
위와같은 형식의 URL 에 랜덤특수문자열 이 출력되도록 요구한다.
이는 SSL 발급주체가, 이 사이트가 나의것이 맞는지 테스트하는 것이다.
위 URL로 접속하면 랜덤특수문자열이 출력이 정상적으로 되게 하고,(위 경로로 파일을 어떻게 만들어야 할지 모른다면, 웹개발 기본이 약한것으로 간주...)
Enter 를 입력하면,
/etc/letsencrypt/live/도메인주소/privkey.pem
/etc/letsencrypt/live/도메인주소/cert.pem
/etc/letsencrypt/live/도메인주소/chain.pem
위 경로에 3개의 파일이 생성된다.
그리고 app.js 를 만들어서 아래 소스를 작성한다.
// Dependencies
const fs = require('fs');
const http = require('http');
const https = require('https');
const express = require('express');
const app = express();
// Certificate 인증서 경로
const privateKey = fs.readFileSync('/etc/letsencrypt/live/도메인주소/privkey.pem', 'utf8');
const certificate = fs.readFileSync('/etc/letsencrypt/live/도메인주소/cert.pem', 'utf8');
const ca = fs.readFileSync('/etc/letsencrypt/live/도메인주소/chain.pem', 'utf8');
const credentials = {
key: privateKey,
cert: certificate,
ca: ca
};
app.use((req, res) => {
res.send('Hello there!');
});
// Starting both http & https servers
const httpServer = http.createServer(app);
const httpsServer = https.createServer(credentials, app);
httpServer.listen(80, () => {
console.log('HTTP Server running on port 80');
});
httpsServer.listen(443, () => {
console.log('HTTPS Server running on port 443');
});
var io = require('socket.io')(httpsServer);
var usr_cnt = 0;
io.on('connection', function(socket){
console.log('a user connected');
//메세지 수신시
socket.on('send', function(res){
//socket.emit('recv', data); //메세지를 발송한 본인에게만
console.log('recv ok');
io.emit('recv', res); //전체 커넥션 유저들에게
});
//메세지 삭제시
socket.on('msg_del', function(msg_idx){
io.emit('msg_del_result', msg_idx); //전체 커넥션 유저들에게
});
//브라우저 접속시
usr_cnt++;
console.log('connect', usr_cnt);
io.emit('usr_cnt', usr_cnt);
//브라우저를 떠날때 실행됨
socket.on('disconnect', () => {
usr_cnt--;
console.log('disconnect', usr_cnt);
io.emit('usr_cnt', usr_cnt);
});
});
그리고 도메인 주소로 접속하면 https 접속을 확인할 수 있다.
정말 짧게 작성한것이고, 나중에 정밀하게 다시 리뷰할 예정.
핑크색 소스는 채팅서버소스로 보나스~