TL;DR;
2022-08-23
mkcert 라는 날먹 툴을 사용하면
localhost 에도 HTTPS 발급/적용이 가능합니다.
localhost 도메인 기반의 호스팅시 인증서 발급/적용이 불가능합니다.
(ex. http://localhost:3000)
www.my-domain.com과 같은 형태의 도메인을 따로 발급받아야정상적으로 SSL 를 발급/적용이 가능합니다.
SSL 인증서의 필요성
HTTPS 를 사용하기 위해서는 SSL 인증서가 필요하고,
이 인증서 발급을 위해서 OpenSSL 를 설치해야함
설치 안하면 어떻게 되냐고?
다음은 nodejs + koa 를 이용한 https 서버 생성 코드다.
import Koa, {Context, Request, Response, Next} from 'koa';
import Router from '@koa/router';
const app = new Koa();
const router = new Router();
router.get('default', '/', async (ctx: Context, next: Next)=>{
await next();
ctx.response.type = 'json';
ctx.response.body = 'df';
});
router.all('/', async (ctx: Context, next: Next)=>{
ctx.response.body = JSON.stringify({state: 'here is all!'})
})
app.use(router.routes());
// HTTPS 서버 생성
// https://localhost/ 로 접속해보자
const httpsServer = https.createServer(app.callback);
야무지게 https://localhost:443 에 접속하면 이제..
https는 기본적으로 대칭키 + 비대칭키 암호화 기법을 모두 사용하는데
Client - Server 사이에 CA (Certificate Authority == 제 3의 인증기관)가 필요하다.
다음 예제를 통해 CA(인증기관) 없이
키를 생성하고 인증서를 발급해서 https 서버를 운영해보자.
OpenSSL 라이브러리 다운로드
for windows
for macOS
다음 커맨드 입력
brew install openssl
brew 가 뭔데?
linux의 rpm, yum 처럼 패키지 관리를 위한 툴
혹시나 brew가 설치되있지 않다면 여기에서 다운로드 받으면 된다.
설치된 openssl 라이브러리 설치 경로 확인
brew info openssl
🔏 인증서 발급 절차
- 개인키 생성
- CSR 생성
- 공개 인증서 (CRT) 생성
- (옵션, Windows 일 때만) PFX 형식 변환
1. 개인키 생성
openssl genrsa 2048 > privatekey.pem
2. CSR 생성
CSR은 디지털 서버 인증서를 신청하기 위해 인증 기관 (Certificate Authority)에 보내는 파일로
이를 생성하기 위해 req 명령을 사용한다.
# openssl req -new -key [개인키파일명].pem -out [CSR파일명].pem
openssl req -new -key privatekey.pem -out csr.pem
3. 공개 인증서 (CRT) 생성
인증서에 서명하기 위해 x509 명령어를 사용한다.
# openssl x509 -req -days 유효기간(일) -in [CSR파일명].pem -signkey [개인키파일명].pem -out [공개키파일명].crt
4. crt -> pfx 파일 변환 (Optional, Windows 일 때만)
# openssl pkcs12 -export -out [도메인].pfx -inkey [개인키파일명].pem -in [공개인증서파일명].crt
Enter Export Password: [패스워드입력]
Verifying - Enter Export Password: [패스워드 재입력]
이 작업이 끝나고 나서 생성한 개인, 공개서명파일, CSR 파일은 모두 안전한 위치에 이동해야한다.
안전한 위치가 어디냐고?
나같은 경우 ~/.ssh/ssl 로 옮겨두었다.
모든 키 파일에 대해 관리자에게 '읽기'권한만 허용하게 설정했다.
# root 사용자에게 읽기 권한만 부여 나머지는 아무고또 못함. (이게 국룰)
sudo chmod 400 [파일명].pem
👉 결과
이제Postman 을 통해 https://localhost:443 으로 요청을 날려보자
성공했다! 가 아니고..
"Self signed certificate" 경고메시지가 뜨는데?
이는 인증서를 발급한게 제 3의 외부 기관이 아니라 (개발자가 임의로 설정한) 'localhost' 로 셀프 인증을 했기 때문이다.
그래서 시키는대로 했는데
대체 어쩌라고?, 왜 제대로 안되는거야?
결론
openssl 을 통해서 개인키 , 공개키 및 CA (임의 설정) 까지 했으나
공식적으로 HTTPS 를 지원하려면 제 3의 인증기관을 CA로 지정할 필요가 있다.
물론 SSL 인증서는 일반적으로 유료다.
다음 사이트 같이 간혹 무료로 인증서를 제공해주는 서비스를 이용하는 것도 좋은 방법이다.
certbot 을 통하여 SSL 인증서를 생성하는 방법
⚠️ 도메인 'localhost' 에 대한 SSL 인증서는 발급되지 않는다.
따라서 nginx, apache, heroku 등으로 무료 웹 호스팅 서비스를 이용해 고유의 URL을 얻는 과정이 선행되야 한다.
1. 설치 명령어
macOS || Linux 기준
brew install certbot // macOS
sudo apt install certbot // Linux (Ubuntu)
2. 인증서 발급
certbot certonly
아래 사이트에서 인증서 발급 옵션에 대한 상세한 설명을 볼 수 있다.
🔗 Reference
'Web' 카테고리의 다른 글
Why should we use Short URL (0) | 2022.02.24 |
---|---|
Webpack (0) | 2021.08.11 |
TypeScript + Koa 프로젝트 생성 (0) | 2020.12.03 |
Query String vs Params (Path) (0) | 2020.11.02 |
[HTTP] Connection Management (0) | 2020.10.01 |