프로그래머스 데브코스 3/31 카카오 엔터프라이즈 남수진님 Https 강의
- HTTP 1.1 은 텍스트 프로토콜 ⇒ 날아가고 있는 패킷을 캡쳐하면 데이터 다 보임
인증서를 포함한 키 교환 과정(핵심)
- A는 B에게 인증서(공개 키)를 달라고 함. B는 자신의 공개 키가 들어있는 권위 있는 인증 기관이 인증한 인증서를 보냄
- A는 자신이 이미 가지고 있는 인증 기관의 인증서(전자 서명을 위한 공개 키. OS나 웹 브라우저에 포함되어 있음)로 B가 보내 온 인증서의 서명 값을 검증함
- 브라우저가 가지고 있는 인증기관들의 공개키로 인증서 검증한 후, B의 공개키로 A가 생성한 대칭키를 암호화해서 B에게 보냄
- B는 A가 보내 온 암호화된 대칭 키를 자신의 개인 키로 복호화 하여 대칭 키를 얻음
암호 모음
암호화된 채널(https)을 만들기 위해서는 클라이언트와 서버간에 키 교환, 전자서명, 암호 해시, 대칭 키 암호화 알고리즘 이 서로 약속되서 맞아야 함. 이것을 암호 모음(CIPHER SUITE)이라고 함
암호 모음 형식 Kx-Au-Enc-Mac
- 키 교환(Kx) RSA, Diffie-Hellman, Elliptic Curve Diffie-Hellman,
- 서명 인증(Au) RSA, Diffie-Hellman, DSS, ECDSA, ...
- 대칭 키 암호화 (Enc) AES128-CBC, AES256-GCM, ..
- 메시지 다이제스트 (Mac) MD5, SHA, SHA1, SHA256, SHA384
예시
- ECDHE-ECDSA-AES256-GCM-SHA384
- AES256-SHA
요약
- http를 암호화 한다는 이야기는 서버와 클라이언트 간에 대칭 키를 공유한다는 이야기
- 공유하기 위해서는 공개키 암호화 방식을 이용해서 공유함
- 공개키를 건네주는 것을 안전하게 하기 위해서 인증서가 이용됨
- 중간자 공격으로 해커의 공개키가 보내지면 클라이언트 측에서 인증서의 서명 값을 검증할 때 실패가 되게 됨
nginx HTTPS 설정 예제
server { listen 443 ssl; keepalive_timeout 70; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers // 암호화 방식 ssl_certificate // 인증서 경로 ssl_certificate_key // 서버의 개인키 경로
설정 방법
- AWS ACM 이용하여 인증서 발급받고 ELB 에 인증서 이용하여 https 적용
- certbot [ Certbot docs ] 이용하여 인증서 생성 후 nginx에 수동 셋업
더 공부할 것들
- 공개 키 기반 구조, Public Key Infrastructure(PKI)
- 공개 키 알고리즘의 수학적인 내용
- 이산 대수 문제, Discrete Logarithm Problem
- RSA의 원리
- Elliptic Curves Cryptography
- 체인 인증서
- TLS의 세부 내용
- openssl 명령어 사용법
TroubleShooting
- Wrong Version Number : 서버는 http 로 돌고있는데 https 로 요청한 경우 이와 같은 에러가 발생