본문 바로가기
TIL

TIL 240805 - 로컬에서 https 테스트하기 + 인증서 발급

by 레몬타르트파이 2024. 8. 5.

그냥 AWS에서 인증서 발급받아 https 도메인 등록해 쓰면 되지 뭐하러 로컬에서도 테스트 하냐 싶겠지만

내가 맡은건 API 서버가 아니라 라이브스트리밍 서버임..

라이브스트리밍 방송 > hls 프로토콜 테스트도 완료했지만, 배포할 API 서버가 https인 만큼 라방 서버도 https여야 했다.

여기선 node-media-server 얘기는 없지만 혹시나 해서 설명하자면 config를 다음과 같이 설정하면 https에서 hls를 받아올 수 있다.

https: {
  port: 8443,
  key: './key.pem',
  cert: './cert.pem',
},

 

port에 https에 연결될 포트 번호를, key와 cert에는 key.pem, cert.pem 의 상대경로를 입력해주면 됨.

이걸 사용하려면 인증서와 개인키가 필요하다. 이제 이 인증서를 발급받아 https를 연결하기까지 삽질 썰을 풀어보겠다..

1. OpenSSL 사용

1) OpenSSL이란?

개발 및 테스트 단계에서 비용이 발생하는 정식 https 인증서 대신 테스트용으로 생성할 수 있는 툴

 

2) OpenSSL로 인증서 발급

openssl req -nodes -new -x509 -keyout key.pem -out cert.pem -days 365
  • -nodes : 인증서와 키를 따로 암호화 X
  • -x509 : CSR(인증서 서명 요청) 대신 직접 자체 서명된 인증서를 생성
  • -keyout key.pem : 생성된 개인 키를 key.pem 파일에 저장
  • -out cert.pem : 생성된 인증서를 cert.pem 파일에 저장
  • 이 명령어를 입력하면 국가코드, 주, 도시이름 등의 정보를 입력하라하는데, 그냥 입력하면 된다....

발급받기까지 성공했고 config에 적용을 시켰는데 이상하게 https 연결이 안됐음. 이유는 밑에..

 

2. mkcert 사용

1) localhost as secure contexts / openSSL이 안됐던 이유

 개발환경에서 사용되는 localhost는 브라우저가 보안 정책에 예외를 두는 등 TLS 통신과 동일한 보안 특성을 간주하고 https처럼 동작한다. 그러니까, localhost를 잠재적으로 신뢰할 수 있는 출처로 취급하기 때문에, web authentication API, sensor API 같은것들도 정상적인 사용이 가능하다.

 근데, secure cookie를 사용하는 등 개발중 로컬에서도 https를 사용해야 하는 경우가 있다. https를 적용하려면 TLS/SSL 인증서가 필요한데, 실제 인증기관(CA)로부터 서명된 것이어야 브라우저가 유효한 인증서로 간주하게 된다. openSSL의 경우 CA에서 발급받은게 아니라 임의로 자체 서명한 인증서이기 때문에 https에 적용이 안됐던것!! (두개 무슨 차이인가 했더니..)

따라서, 디바이스와 브라우저가 로컬에서 신뢰하는 CA를 사용하여 서명해야 하는데, 이때 가장 많이 사용되는 도구가 mkcert이다.

 

2) mkcert 설치

난 윈도우니까..윈도우만 적을래...

직접 사이트에서 exe 파일을 다운받아도 되지만, 나같은 경우 명령어가 먹히질 않아서 결국 패키지매니저를 사용했다.

  • powershell을 관리자권한으로 실행 후 다음을 입력하여 windows 전용 chocolatey를 설치한다.
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
  • 다음을 입력하여 mkcert를 설치한다.
choco install mkcert

 

3) 인증서 발급

  • 다음 명령어로 로컬을 인증된 발급기관으로 추가한다. 아마 루트 인증서 설치에 대한 보안 경고가 나타날텐데, 확인버튼을 누르면 된다. 
mkcert -install

 

  • 그러면 rootCA.pem, rootCA-key.pem 두개의 루트 인증서가 생성되는데, 위치는 다음 명령어로 확인이 가능하다.
mkcert -CAROOT

 

  • 이제 다음 명령어로 인증서를 완성하자. localhost / 127.0.0.1 / ::1 에서 사용할 수 있는 인증서를 만든다는 의미이다.
mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1

 

이제 생성된 두 파일을 프로젝트 폴더 내 적절한 위치로 이동시켜주고, node-media-server config의 key, cert 경로를 알맞게 수정해주면 된다.

 

3. hls 테스트 결과

 

드디어.....ㅠ