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
OpenSSL for Windows
Download OpenSSL for Windows for free. OpenSSL v1.0.2 and v1.1.1 Portable for Windows 32-bits. OpenSSL is a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. It is also a ge
sourceforge.net
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 인증서는 일반적으로 유료다.
다음 사이트 같이 간혹 무료로 인증서를 제공해주는 서비스를 이용하는 것도 좋은 방법이다.
Let's Encrypt - Free SSL/TLS Certificates
letsencrypt.org
certbot 을 통하여 SSL 인증서를 생성하는 방법
⚠️ 도메인 'localhost' 에 대한 SSL 인증서는 발급되지 않는다.


따라서 nginx, apache, heroku 등으로 무료 웹 호스팅 서비스를 이용해 고유의 URL을 얻는 과정이 선행되야 한다.
1. 설치 명령어
macOS || Linux 기준
brew install certbot // macOS
sudo apt install certbot // Linux (Ubuntu)
2. 인증서 발급
certbot certonly
아래 사이트에서 인증서 발급 옵션에 대한 상세한 설명을 볼 수 있다.
Why You Should Use WebRoot Plugin to Obtain Let's Encrypt TLS Certificate
This article explains why you should use the webroot plugin to obtain and renew TLS certificate from Let's Encrypt and best practices.
www.linuxbabe.com
🔗 Reference
How to create a https server on localhost
I followed the tutorial below to create a https server https://docs.nodejitsu.com/articles/HTTP/servers/how-to-create-a-HTTPS-server/ and the program runs without errors but when I can not open h...
stackoverflow.com
X509 인증서 생성 및 서명 - AWS Elastic Beanstalk
이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.
docs.aws.amazon.com
Node.js 용 HTTPS 학습 및 구성
안전한 웹 사이트를위한 SSL 인증서 생성 및 적용하기 여러분 모두가 안전한 사이트와 https 사용에 대해 알고 있다고 가정합니다. 이것은 백그라운드에서 어떻게 작동하는지에 대한 약간의 빛을
ichi.pro
'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 |