https 인증서 (SSL) 발급하기

2021. 3. 17. 16:15·Web

 

TL;DR;

 

2022-08-23
mkcert 라는 날먹 툴을 사용하면 
localhost 에도 HTTPS 발급/적용이 가능합니다.

77ㅓ엌

 

 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 에 접속하면 이제..

딱봐도 SSL  관련 문제다.

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

 

 

나같은 경우 쉘이 zshell 이기 때문에 ~/.zshrc이다. 베시쉘 사용자는 ~/.bashrc 에 설정해주면 되겠다.

 

 


 

🔏 인증서 발급 절차

  1. 개인키 생성
  2. CSR  생성
  3. 공개 인증서 (CRT) 생성
  4. (옵션, 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' 로 셀프 인증을 했기 때문이다.

 

 

CA가 아니라 셀프인증을 했다고 경고를 하고있다.

 


 

그래서 시키는대로 했는데
대체 어쩌라고?, 왜 제대로 안되는거야?

 


 

결론

openssl 을 통해서 개인키 , 공개키 및 CA (임의 설정) 까지 했으나

공식적으로 HTTPS 를 지원하려면 제 3의 인증기관을 CA로 지정할 필요가 있다.

물론 SSL 인증서는 일반적으로 유료다.

 

다음 사이트 같이 간혹 무료로 인증서를 제공해주는 서비스를 이용하는 것도 좋은 방법이다.

letsencrypt.org/

 

Let's Encrypt - Free SSL/TLS Certificates

 

letsencrypt.org

 

certbot 을 통하여 SSL 인증서를 생성하는 방법

⚠️ 도메인 'localhost' 에 대한 SSL 인증서는 발급되지 않는다.

아니 나는 https://localhost:3000 제대로 띄우고 싶었는데 안댄댕! - Let's Encrypt

따라서 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
'Web' 카테고리의 다른 글
  • Why should we use Short URL
  • Webpack
  • TypeScript + Koa 프로젝트 생성
  • Query String vs Params (Path)
M_Falcon
M_Falcon
  • M_Falcon
    Falcon
    M_Falcon
  • 전체
    오늘
    어제
    • 분류 전체보기 (432)
      • Web (16)
        • Nodejs (14)
        • Javascript (23)
        • FrontEnd (4)
      • DataBase (39)
        • Fundamental (1)
        • Redis (4)
        • PostgreSQL (10)
        • NoSQL (4)
        • MySQL (9)
        • MSSQL (3)
        • Error (4)
      • Algorithm (79)
        • Algorithm (문제풀이) (56)
        • Algorithm (이론) (23)
      • JVM (65)
        • Spring (13)
        • JPA (5)
        • Kotlin (13)
        • Java (24)
        • Error (7)
      • 기타 (70)
        • Kafka (3)
        • Kubernetes (3)
        • Docker (13)
        • git (19)
        • 잡동사니 (27)
      • 재테크 (11)
        • 세무 (4)
        • 투자 (3)
        • 보험 (0)
      • BlockChain (2)
        • BitCoin (0)
      • C (32)
        • C (10)
        • C++ (17)
        • Error (3)
      • Low Level (8)
        • OS (3)
        • 시스템 보안 (5)
      • 네트워크 (3)
      • LINUX (30)
        • Linux (26)
        • Error (4)
      • 저작권과 스마트폰의 이해 (0)
      • 생각 뭉치 (6)
      • 궁금증 (2)
      • Private (4)
        • 이직 경험 (0)
        • 꿈을 찾아서 (1)
      • Android (21)
        • OS (4)
  • 블로그 메뉴

    • 홈
    • WEB
    • 알고리즘
    • DataBase
    • Linux
    • Mobile
    • C
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    java
    database
    android
    ubuntu
    PostgreSQL
    javascript
    백준
    Git
    프로그래머스
    algorithm
    JPA
    알고리즘
    linux
    Kotlin
    Bitcoin
    Programmers
    C++
    docker
    kafka
    Spring
  • hELLO· Designed By정상우.v4.10.3
M_Falcon
https 인증서 (SSL) 발급하기
상단으로

티스토리툴바