[개발] 지식/node.js

npm 사용시 SELF_SIGND_CERT_IN_CHAIN 에러 조치 - SSL(Secure Socket Layer)

하하미아 2022. 1. 3. 10:18

npm

ssl 인증 에러 발생

npm 설치 후 react 프로젝트를 생성하려고 하니 아래와 같은 에러가 발생했다.

ssl 인증 해제

회사에서 개발을 하다보면 자주 겪는 일인데, 에러 화면에서 보이는 https://registry.npmjs.org/....(npm repository) 에 접근을 해야하는데 인증서 검증을 통과하지 못해서 발생한다. 이를 해결하기 위해 npm 설정을 아래와 같이 변경한다. ssl 인증서 검증을 하지 않겠다는 의미이다.

$ npm config set strict-ssl false

참고로, npm의 설정값을 모두 보고 싶다면 아래 명령어를 실행한다.

$ npm config list

proxy 설정

만약 proxy 서버가 있다면 명시하고, ssl 옵션을 끄도록 한다.

$ npm config set proxy <proxy server address>
$ npm config set https-proxy <proxy server address>
$ npm config set strict-ssl false

SSL

SSL이란?

SSL(Secure Socket Layer)은 웹 표준 암호화 통신이다.

  • 클라이언트와 서버 사이에 송수신되는 정보를 암호화하여 전송하는 통신계층이다.
  • 웹에서는 브라우저와 서버간 보안을 위해 공개키/개인키 대칭키를 기반으로 사용한다.
  • 일반적으로 443포트를 사용한다.
  • HTTPS HTTP에 SSL을 적용한 보안된 HTTP 통신을 하는 프로토콜이다.
  • SSL은 HTTP 뿐만 아니라 FTP, SMTP에도 적용할 수 있다.

SSL과 HTTPS의 차이

HTTP + SSL 이 곧 HTTPS라고 할 수 있다. 따라서 SSL은 웹서비스 외에도 네트워크에서 사용되는 넓은 의미라고 볼 수 있다. 다시말해 SSL 위에서 작동하는 웹 프로토콜이 HTTPS이다.

인증과정 (SSL Handshake)

  1. 클라이언트가 서버에 접속한다. 이때 클라이언트가 사용가능한 암호화 방식과 랜덤데이터를 함께 전달한다.
  2. 서버는 클라이언트에게 인증서 정보(공개키, 인증서 발급자(CA), 도메인 등)와 사용할 암호화 방식, 랜덤데이터를 전달한다.
  3. 클라이언트는 전달된 인증서를 확인하고 서버를 신뢰할 수 있는지 검증한다. 검증은 모두에게 공개된 CA의 공개키를 사용하여 암호화된 인증서를 복호화하는 것으로 진행된다. 인증서가 서버의 개인키로 암호화되어 있으므로, 해당 CA의 공개키로 복호화가 성공한다면 이는 해당 서버에서 암호화했다는 것을 추론할 수 있기 때문이다. 공인된 CA라면 이 단계에서 검증이 되므로 브라우저에 ‘안전함’ 이라고 뜨게 된다. 단 사설 CA라면 경고(안전하지 않음) 표시가 뜬다.
  4. 클라이언트에서는 1번과 2번 과정에서 서로 주고받은 랜덤데이터를 조합하여 임시 key를 생성한다. 이는 대칭키로 활용된다.
  5. 임시 key(대칭키)를 서버에서 받은 인증서의 공개키를 활용하여 암호화한다.
  6. 암호화된 임시 key(대칭키)를 서버로 전송한다.
  7. 서버에서는 전달된 임시 key(대칭키)를 이미 갖고 있는 private key(개인키)로 복호화한다.
  8. 마지막으로 Finished 패킷을 전달하여 SSL Handshake를 종료한다.

TLS란?

TLS(Transport Layer Security)SSL과 동일한 의미이며 이름만 다르다. 넷스케이프에서 HMAC 알고리즘을 사용한 SSL을 발명하였고, IETF에 의해 표준이 되면서 TLS라는 이름으로 바뀌게 되었다.

Reference

SSL이란 ?

회사 프록시 때문에 pip, npm을 통해 제대로 패키지 다운로드가 안 될 때

SSL이란 무엇인가

HTTPS 통신과정 쉽게 이해하기 #3(SSL Handshake, 협상)