SSL 이란?

1. 인증서를 사용하는 이유

클라이언트의 요청은 네트워크를 통해 패킷으로 전달된다.
전달되는 과정에서 누군가 패킷을 훔쳐 아이디, 패스워드 같은 민감한 정보를 취하거나 수정할 수 있다.

클라이언트의 요청이 암호화 된다면 중간 공격자가 패킷을 훔쳐도 정보가 누출되지 않는다.
이를 위해 인증서를 활용한 SSL 암호화 방식을 주로 사용한다.

인증서를 통해 신뢰할 수 있는 서버인지 확인한 후 데이터 암호화 과정이 수행된다.

2. 보안 연결 순서

클라이언트는 신뢰할 수 있는 서버인지 인증서를 통해 검증한다. 서버는 자신의 인증서를 클라이언트에게 전달하고 클라이언트는 브라우저에 내장된 공개키를 사용해
신뢰할 수 있는 인증서인지 확인한다.
확인되면 클라이언트-서버 간에 랜덤 값을 공유해 대칭키를 생성하고
이를 통해 데이터를 암호화 해 주고 받는다.

3. 인증서

3-1. 신뢰 가능한 기관

무조건 신뢰 가능한 최상위 기관이 존재한다.
최상위 기관으로 Verisign, Geortrust 등의 회사가 있으며, RooT CA 라는 인증서를 발급한다.

이 기관들은 본인들 만의 고유한 비밀키를 가지고 있고 이에 대응하는 공개키를 전세계에 배포한다.
브라우저는 최상위 기관의 공개키를 내장하고 있으며, 보안을 전문으로 하는 회사 답게 안전하게 보관한다.

최상위 기관의 공개키로 복호화 가능한 인증서는 최상위 기관의 비밀키로 암호화 했다고 볼 수 있기 때문에,
신뢰할 수 있는 인증서라고 간주한다.

3-2. 인증서의 내용

인증서에는 아래와 같은 내용이 저장되어 있다.

  • 인증서 소유자 이름
  • 인증서 소유자의 공개키
  • 인증서 유효기간
  • 고유한 UID
  • 인증서의 모든 값을 해시화한 값
  • 지문

3-3. 인증서의 구조

출처 - https://m.blog.naver.com/alice_k106/221468341565

인증서는 계층 구조로 되어 있다.
가장 최상위에 있는 인증서는 Root CA 이고 Geotrust 등의 기관에서 발급한다.
자신의 인증서를 만들고 싶은 회사는 Geotrust 같은 최상위 인증 기관에
인증서의 내용물을 종합해 해시화 한 값을 Geotrust 의 비밀키로 암호화 해 달라고 요청한다.
비밀키로 암호화 하는 과정을 “서명” 이라 하고 서명된 해쉬 값을 “지문” 이라고 표현한다.

클라이언트는 특정 회사의 서버에게 인증서를 전달받고 그 인증서를 브라우저에 내장된
최상위 기관의 공개키를 통해 전달 받은 인증서에 있는 지문 정보를 복호화한다.

정상적으로 복호화 되고 인증서를 해시화 한 값과 비교해 일치하면,
서버에게 받은 인증서의 지문이 최상위 기관의 비밀키로 암호화 한 것이기 때문에
전달받은 인증서 또한 믿을 수 있는 인증서라고 볼 수 있다.
이 원리를 Chain of Trust 라고 부른다.

4. 보안 연결 수립

출처 - https://m.blog.naver.com/alice_k106/221468341565

서버에게 전달받은 인증서가 신뢰할 수 있는 경우 보안 연결 수립을 위해 인증서에 있는 공개키를 사용한다.
비대칭키의 암호화, 복호화는 느리기 때문에 처음 연결을 수립할 때만 사용하고
보안 연결이 수립된 뒤에는 대칭키로 데이터를 암호화해 전송한다.

클라이언트와 서버는 핸드쉐이크 과정에서 Nonce 값을 주고 받는다.
클라이언트는 Nonce 값을 생성해 서버로 전달하고 서버도 Nonce 값을 생성해 클라이언트에 전달한다.

클라이언트는 클라이언트 Nonce 값, 서버 Nonce 값 PMS 라는 추가 난수 값을
인증서에 있는 공개키를 사용해 암호화 한하고 이 값을 서버에 전달한다.

클라이언트와 서버는 이 대칭키를 이용해 데이터를 암호화해 주고받으며 암호화 된 보안 통신이 시작된다.