HTTPS
HTTPS 란?
위키 의 정의에 따르면,
- HTTPS (Hypertext Transfer Protocol Secure) 는 HTTP(Hypertext Transfer Protocol) 에 보안을 강화한 것
- HTTP 프로토콜에 TLS(Transport Layer Security), SSL(Secure Sockets Layer) 을 이용하여 암호화를 적용한 버전 (HTTP 의 암호화 버전)
- HTTPS 는 HTTP over TLS(SSL) 이라고 불림
HTTP vs HTTPS
- HTTP는 전송 데이터를 암호화 하지 않으므로 중간자 공격에 취약
- 공격자는 사이트의 중요한 정보를 도청 가능
- 공격자가 웹 페이지를 수정하여 맬웨어 or 광고를 주입가능
- HTTPS 는 TLS 를 이용하여 전송 데이터를 암호화 함으로써 공격을 방어 가능
- HTTPS 는 URL, 쿼리 스트링, 헤더 및 쿠키 등을 암호화하여 전송
- HTTPS 는 호스트와 포트는 TCP/IP 계층의 일부 이므로 암호화 할 수 없음
PROTOCOL URL PORT HTTP http:// 80 HTTPS https:// 443
TLS(SSL) 란 ?
- TLS(Transport Layer Security)는 두 컴퓨터 간에 통신에서 응용 프로그램 간의 인증, 개인정보 및 무결성을 제공하는 암호화 프로토콜
- TLS 는 웹 브라우징, 이메일, VoIP 등에 가장 널리 사용되는 암호화 프로토콜
- SSL 은 Netscape 사에서 처음 개발했지만, 그 이후 IETF 에서 SSL 3.1 버전을 인수하여 공개 했고 TLS 1.0 으로 릴리즈 했음
- SSL 과 TLS 를 혼용해서 사용하고 있지만, 정식 명칭은 TLS
TLS 장점(목적)
- 통신 내용을 공격자에게 노출되는 것을 막을 수 있음 (도청 방지)
- 통신 내용의 악의적인 변경을 방지 (위조 방지)
- 클라이언트가 접속하려는 서버가 신뢰 할 수 있는 서버인지를 판단 가능
- 요청한 서버가 위조 사이트 아님을 보증 (피싱 방지)
- 서버가 신뢰할 수 없는 인증서를 사용한다면 브라우저는 사용자에게 경고 메시지를 출력
디지털 인증서
- 클라이언트와 서버 같은 엔티티의 ID 를 제3자 가 보증해주는 전자화된 문서
- 클라이언트는 웹 서버가 제공한 인증서를 제3자 에게 요청하면 제3자 는 해당 웹 서버를 보증
- 제3자는 CA(Certificate Authority) 로써 신뢰할 수 있는 공인된 기업
CA (Certificate Authority)
- 클라이언트가 접속하려는 서버가 의도한 서버가 맞는지 보장해주는 민간기업
- CA 는 신뢰성이 엄격하게 공인된 기업들만이 참여 가능
- TLS(SSL) 이용하려는 서비스는 CA 를 통해서 인증서를 구입해야함
- CA의 개인키는 절대로 유출되어서는 안됨 (이것이 노출되어 파산한 회사도 있음)
TLS(SSL) 인증서 내용
크롬에서 Github 인증서
- 서비스 정보
- 이 영역은 해당 서비스(github)에 대한 정보
- CA 에서 인증서를 구입하는 서비스는 서비스 도메인, 공개키와 같은 정보를 인증서를 구입할때 제출함
- 발급자 정보
- 인증서를 발급한 CA 정보, 만기일 등의 정보
- 클라이언트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지 확인하기 위해서 사용
- 공개키 정보
- 공개키의 알고리즘, 공개키의 내용 등의 정보
- 클라이언트가 서버와 통신할 때 사용할 공개키와 그 공개키의 암호화 방법들의 정보
- 전자서명
- CA 가 해당 서비스(github) 을 식별하기 위해서 사용하는 정보
TLS(SSL) 암호화 방법
TLS 의 암호화는 대칭키 방식과 공개키 방식을 혼합해서 사용함
대칭키
- 동일한 키로 암호화와 복호화를 하는 방법
- 암호를 주고 받는 사람들 사이에 대칭키를 전달하는 것이 어려움
- 대칭키 유출되면 공격자도 암호화 내용을 복호화 할 수 있기 때문
공개키
- 대칭키 방식의 단점을 보완하고자 나온 방법
- 공개키는 대칭키와 달리 공개키, 개인키 2개의 키를 이용한 방법
- 개인키는 자신만이 가지고 있고, 공개키는 타인에게 제공
- 공개키를 이용해서 암호화, 개인키를 이용해서 복호화하는 방법
- 즉, 개인키가 없으면 복호화 할 수 없음
- 공개키 암호화는 개인키 암호화보다 많은 컴퓨터 자원을 사용하는 단점이 있음
TLS(SSL) 기술 스택
- TLS 는 위 그림에서 처럼 TCP 계층과 HTTP 계층 사이에서 동작
- TLS 의 가장 기본적인 부분은 레코드 프로토콜
레코드 프로토콜의 하위 프로토콜
- Handshake 프로토콜: 이 프로토콜은 보안 연결을 위한 매개변수를 설정하는데 사용함
- Application 프로토콜: handshake 프로세스 이후 시작되며 클라이언트와 서버간의 데이터가 안전하게 전달됨
- Alert 프로토콜: 오류, 안정성 문제 등이 있을때 한쪽에서 다른쪽에 noti 하기 위해서 사용
- Change chiper spec 프로토콜: 암호화 매개변수를 수정하기 위해서 사용함
- Heartbeat 프로토콜: 커넥션이 여전히 활성상태인지 확인하기 위해서 사용됨
alert, change chiper spec, heartbeat 프로토콜은 특정상황에 필요할 때 사용되어짐
여기서 중요한 것은 handshake와 application 프로토콜
TLS Handshake 프로토콜
기본 TLS Handshake
- 이 유형은 서버만 인증되고 클라이언트는 인증되지 않음
- TLS Handshake 는 우선 TCP 3-way Handshake 이후에 발생함
- TLS 는 TCP 위에서 동작하기 때문에 ..
- 클라이언트: client hello
- 클라이언트가 지원하는 TLS 버전, 지원하는 암호화 방식, 클라이언트가 생성한 랜덤 데이터, 세션 ID 등을 전송
- 세션 아이디 : 이미 TLS handshake 를 했다면, 비용과 시간을 절약하기 위해 기존 세션을 사용함 (약식 TLS handshake)
- 서버: server hello (certificate)
- 서버가 선택한 세션 ID, 선택된 암호화 방식, 서버가 생성한 랜덤한 데이터, 인증서 등을 전송
- 서버는 인증서를 전송할 때 개인키로 암호화하여 전송 - 해당 서버가 공인된 CA 에게 보증받는 인증서임을 보장
- 위에서 봤지만, 인증서에는 서비스 정보, 공개키, CA 정보 등을 포함한다
- 서버: server hello done
- 서버는 클라이언트에게 server hello 가 종료되었음을 알려줌
- 클라이언트: 인증서 확인
- 클라이언트(브라우저)는 먼저 인증서를 확인하여 자신의 CA 리스트에서 CA 를 확인
- 브라우저는 인증서를 공개키로 복호화 하여 인증서 내용을 확인
- 인증서를 공개키로 복호화 가능하다는 것은 해당 CA 가 발급한 개인키로 인증서가 암호화 된 것을 의미 - 신뢰할 수 있는 서버임을 보증
- 클라이언트: client key exchange
- 클라이언트는 premaster secret 을 생성 (생성방법은 cipher suite에 의존적임)
- 클라이언트는 premaster secret 을 서버의 공개키를 이용하여 암호화하여 서버에 전송
- 서버는 암호화된 premaster secret 을 개인키로 복호화
- 서버는 premaster secret 과 이전에 클라이언트로 부터 전송된 랜덤 데이터를 이용하여 master secret 을 생성
- 클라이언트도 premaster secret 과 이전에 서버로 부터 전송된 랜덤 데이터를 이용하여 master secret 을 생성
- 클라이언트: change chiper spec
- 클라이언트는 암호사양 변경되었다는 메시지를 전송
- 이제부터 전송하는 클라이언트의 모든 데이터는 대칭키 암호화 방식을 이용
- 클라이언트: finished
- 클라이언트는 handshake 종료 메시지를 전송
- 해당 데이터는 대칭키로 암호화된 데이터
- 서버: change chiper spec
- 서버도 암호사양 변경 수신했다는 정보를 전송
- 이제부터 서버도 모든 전송 데이터를 대칭키 암호화 방식으로 전송
- 서버: finished
- 서버도 handshake 종료 메시지를 전송
- 해당 데이터는 대칭키로 암호화된 데이터
클라이언트 인증 TLS Handshake
- 이 방법은 클라이언트 인증서를 서버가 사용해야 하는 경우에 사용하는 방법 (일반적 x)
- server hello 단계에서 서버가 인증서를 전송할 때, 클라이언트도 인증서를 보내라는 요청을 함께 전송
- 그러면 클라이언트는 server hello done 이전에 클라이언트의 인증서 정보를 클라이언트의 개인키를 이용하여 암호화하여 전송
- 서버는 해당 인증서 내용이 유효한지 확인하고 유효하면 server hello done 을 전달함
- 나머지 단계는 기본 TLS Handshake 와 같음
약식 TLS Handshake
- client hello 전송시에 클라이언트는 session ID 를 함께 전송하는데, 서버가 해당 session ID 를 미리 알고 있는 경우에 해당
- 서버가 session ID 를 알고 있으므로 인증서 및 키 교환 단계를 건너 뛰게 됨
세션: 실제 데이터 전송
- 클라이언트: 데이터 요청
- 클라이언트는 요청 데이터를 대칭키 방식으로 암호화하여 전송
- 서버: 데이터 응답
- 요청 데이터를 대칭키 방식으로 복호화한 뒤 적절한 응답 데이터를 대칭키로 암호화하여 전송
생활코딩 블로그 에서는 대칭키를 session key 라고 설명되어 있으나 …
다른 블로그들 자료들에서는 master secret 을 이용 하는것으로 보임
Master secret
- 전송되는 모든 레코드들을 보호하기 위한 목적으로 사용됨
- 클라이언트와 서버 모두 master secret 을 가지고 있으며 각 3개의 key 가 있음
- MAC(Message Authentication code): 암호화된 메시지들이 상대방이 암호화한것이 맞는지 무결성을 검증할 때 사용하는 인증
Master secret 구성
- 클라이언트 쓰기 MAC key: 서버에서 클라이언트가 보낸 데이터의 무결성을 확인하는데 사용되는 key
- 클라이언트 쓰기 암호화 key: 서버는 클라이언트에서 전송된 데이터를 암호화 하는데 사용되는 key
- 클라이언트 쓰기 IV key: 서버에서 AEAD 암호화에 사용되는 key (다른 암호화 알고리즘에서는 사용되지 않음)
- 서버 쓰기 MAC key: 클라이언트가 서버에서 보낸 데이터의 무결성을 확인하는데 사용되는 key
- 서버 쓰기 암호화 key: 클라이언트는 서버에서 전송된 데이터를 암호화 하는데 사용되는 key
- 서버 쓰기 IV key: 클라이언트에서 AEAD 암호화에 사용되는 key (다른 암호화 알고리즘에서는 사용되지 않음)
TLS 와 OSI 7 계층
- OSI 7 계층은 통신 시스템 및 프로토콜을 보는 방법을 표준화 한것
- 이것은 하나의 모델일 뿐, 모든 프로토콜이 해당 모델을 지키고 있는 것은 아님 …
- 위에서 보는것 처럼 TLS 는 OSI 모델을 따르고 있지 않음
- 물론 TLS 는 TCP 위에서 동작하므로 Transport 계층 처럼 보일 수 있으나 ..
- HTTP 프로토콜 위에 동작함으로 순수 Transport 계층으로 볼수 없음 …
TLS 와 OSI 관련 질문들 …
TODO
- TLS 사용 하기
- TLS 보안 문제 …
Reference
- https://en.wikipedia.org/wiki/HTTPS
- https://seopressor.com/blog/http-vs-https/
- https://en.wikipedia.org/wiki/Transport_Layer_Security
- https://searchsecurity.techtarget.com/definition/Transport-Layer-Security-TLS
- https://www.cloudflare.com/learning/ssl/transport-layer-security-tls/
- https://opentutorials.org/course/228/4894
- https://www.comparitech.com/blog/information-security/tls-encryption/
- https://www.acunetix.com/blog/articles/establishing-tls-ssl-connection-part-5/
- https://www.ibm.com/support/knowledgecenter/ko/SSEPGG_11.1.0/com.ibm.db2.luw.admin.sec.doc/doc/c0053515.html
- https://rsec.kr/?p=455
- https://security.stackexchange.com/questions/93333/what-layer-is-tls
- https://security.stackexchange.com/questions/195229/where-exactly-in-the-osi-model-does-tls-ssl-belong