티스토리 뷰

시리즈/Security

HTTPS

빅또리 2021. 10. 21. 22:21

2021.10.16 - [CS/WEB] - 디지털 암호화

 

 

디지털 인증서

브라우저 주소창에 자물쇠 표시를 눌러보자
해당 사이트의 인증서 정보를 확인해 볼 수 있다.

비대칭키를 활용한 인증서 방식을 사용하면 안전한 상대방임을 보장받기 위한 인증 서비스가 온라인으로 유지될 필요가 없다.

 

* 참고로 kerberos 라는네트워크 인증 암호화 프로토콜에서는 온라인 KDC(key distribution center)에 접속해서 테이블을 대조하고 티켓을 발급받아 서버와 통신해야 한다고 함.

Kerberos builds on symmetric cryptography and requires a trusted third party (=KDC key distribution center) 

출처 : https://www.optiv.com/insights/source-zero/blog/kerberos-domains-achilles-heel

 

 

 

 

 

$ SIGN_{CA's\,private\,key}\{name:public\,key\} $

인증서의 핵심 역할은

1. 클라이언트가 접속한 서버가 신뢰할 수 있는 서버임을 보장하고

2. 해당 사이트의 공개키를 제공하는 것이다.

 

HTTPS를 위한 인증서가 갖고 있는 주요 필드들은 다음과 같다.

- 웹 사이트의 이름과 호스트명

- 웹 사이트의 공개키

- 서명 기관의 이름

- 서명 기관의 서명

 

브라우저는 이미 여러 신뢰할 수 있는 인증기관들(CA)의 공개키를 내장하고 있어서 CA의 개인키로 서명된 인증서를 Verify 할 수 있는데 이를 통해 이 인증서가 해당 CA에 의해 작성됐음을 신뢰할 수 있다.

또, CA는 여러 인증절차를 거쳐 사이트에게 인증서와 공개키-개인키 쌍을 발급해주기 때문에 인증서에 들어있는 공개키로 암호화한 메세지를 내가 접속한 사이트가 올바른 개인키로 복호화 할 수 있다면 내가 접속한 이 사이트가 인증서에 적혀있는 이름의 그 사이트임을 신뢰할 수 있다.

 

인증서 보완 메커니즘으로

1. CRL (certificate revocation list)

만약 해당 사이트의 개인키가 유출당해서 이 인증서가 더이상 유효하지 않다면 CA에서 발행하는 더이상 신뢰할 수 없는 인증서의 리스트인 CRL에 포함시키고 브라우저가 이 CRL을 다운로드 받아 인증서 체크에 사용

2. OCSP (online certificate status protocol)

온라인 서버에 접속해서 이 인증서 받았는데 아직 valid한 인증서인가 물어보는 프로토콜

같은 것들도 있다고 한다.

 

 

 

 

HTTPS

넷스케이프(Netscape Communications Corporation)가 개발한 프로토콜

HTTP over SSL/TLS

HTTP 완벽가이드 p375 그림14-15

 

80번 포트에서 TCP connection이 수립되고 나면 거기로 HTTP format의 request, response 주고 받는게 HTTP라면

HTTPS는 443포트에서 수립된 TCP connection을 통해서 먼저 SSL/TLS handshake로 암호화 방식을 협상하고, session key를 주고 받는 등의 인련의 과정을 거치며 안전한 암호화된 채널을 수립한뒤 여기로 암호화된 HTTP request, response를 주고 받는 프로토콜이다.

 

보안 원칙 CIA가 다 만족된다.

Confidentiality = 암호화한 메세지 주고 받음.

Integrity = 각 application data와 함께 MAC 체크섬도 같이 보내기 때문에 데이터 무결성도 보장할 수 있음 (중간에 데이터 변경 x)

Authentication = 인증서 public key로 서버 private key verify하는 서버 인증 알고리즘으로, 안전한 상대방과 통신하고 있음을 보장받을 수 있음.

* 아래 글을 보면 더 자세히 알 수 있다.

 

 

 

TLS

2021.10.21 - [CS/WEB] - TLS handshake 와 Cipher Suites

 

 

 

 

 

node에서의 https

# https.createServer([options][, requestListener])

const https = require('https');
const fs = require('fs');

const options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),     #private key 경로
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')    #인증서 경로
};

https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end('hello world\n');
}).listen(443);

내가 운영하는 서버가 HTTPS 통신을 할 수 있도록 하고 싶으면

인증기관으로 부터 인증서를 발급 받아서

priavate key는 절대 유출 되지 않도록 안전하게 내가 갖고 있고

(그러려면 실제로는 저렇게 private key 경로를 코드상에 그대로 노출해서는 안될 것이다.)

client hello가 오면 인증서를 전달해줘야 한다.

 

구현 자체는 https 모듈을 사용하면 간단하게 할 수 있다.

 

TLS 모듈도 있음

const tls = require('tls');

The tls module provides an implementation of the Transport Layer Security (TLS) and Secure Socket Layer (SSL) protocols that is built on top of OpenSSL. 

 

node 서버의 default cipher suite를 수정하는등의 더 custom한 조작을 하고 싶으면 이 모듈을 활용하면 될 것 같다.

https://nodejs.org/api/tls.html

'시리즈 > Security' 카테고리의 다른 글

TLS handshake 와 Cipher Suites  (0) 2021.10.21
ECDSA  (0) 2021.10.20
디지털 암호화  (0) 2021.10.16
댓글
공지사항
최근에 올라온 글