SSL은 Secure Socket Layer이라는 약자로 보안 소켓 레이어이다.
Netscape에서 서버와 브라우저 간 보안을 위해 만든 프로토콜이다.
SSL 인증서는 클라이언트와 서버 간의 통신을 제 3자가 보증해주는 전자화 된 문서
SSL 인증서는 제 3자가 보증해주는 문서
이다. 여기에 해당 되는 제 3자들이 바로Certificate Authority
다.
- 디지털 인증서를 제공하는 공인된 기업들 (
Certificate Authority
혹은Root Certificate
라 부름)- 당연하게도 아무 기업이나 할 수 있는 것은 아니고, 신뢰성이 엄격하게 공인 된 기업들 만이 참여가 가능하다.
SSL은 보안과 성능 상의 이유로 두가지 암호화 기법을 혼용해서 사용하고 있는데, 우선 이 두가지 암호화 기법에 대해서 정리해보았다.
암호화와 복호화에 사용되는 키가 같다
만약에, 정보 송 수신이 이루어 진다면, 정보 전송시에 암호화 키도 같이 전송하여야한다.
이 과정에서, 키가 유출되면, 암호화 된 내용을 공격자가 복호화 할 수 있기 때문에 위험하다
이를 보완하기 위해 나온 방법이 공개키 암호화 방식
이다.
암호화와 복호화에 서로 다른 키를 사용한다.
두개의 키를 가지고 있다 (A키, B키)
A키로 암호화하면 B키로 복호화가 가능하고, B키로 암호화하면 A키로 복호화를 할 수 있도록 하는 방식
이 방식에 착안해서 두개의 키 중 하나를 비밀키(private key)로 지정, 나머지를 공개키(public key)로 지정한다.
비밀키는 오직 호스트(서버)만이 가지고 있으며, 클라이언트는 공개키를 사용해 메시지를 암호화 하여 전송 한다.
암호화 된 정보는 오직 비밀키를 가지고 있는 호스트(서버)만이 복호화 할 수 있다.
여기서 의문점 🤔
반대로 호스트(서버)가 정보를 암호화해서 클라이언트에게 보내는 경우는 없을까 ?
이 경우에 호스트(서버)가 데이터를 비밀키를 통해 암호화해서 클라이언트에게 보낸다면, 이 과정에서 악의적인 공격으로, "노출 된 공개키를 통해 서버에서 보낸 정보를 복호화 할 수 있지 않을까?" 라는 부분이다.
그럼에도 굳이 암호화를 해서 보내는 이유는 뭘까? 이러한 방식은디지털 서명
에 이용된다.
디지털 서명을 통해, 누가 메시지를 썼는지, 메시지의 위조, 변조 여부에 대한 증명이 가능하다. SSL 인증서에서 서비스를 보증하는 방법으로 활용 된다.
비밀키를 갖고 있는 호스트가 데이터를 암호화 한 후, 공개키와 함께 암호화 된 데이터를 전송한다.
→ '혹여나 중간에 유출되지는 않을까 ?' 할 수 있지만, 이는 데이터를 보호하기 위한 목적이 아니다.
클라이언트는 암호화 된 데이터를 공개키를 통해 복호화 할 수 있다.
이는 데이터가 공개키와 쌍을 이루는 비밀키에 의해 암호화 되었다는 것을 의미 한다.
공개키를 통해 데이터의 출처, 데이터를 제공한 사람의 신원이 보장 된다.
SSL 동작은 크게 세 단계로 이루어 진다.
- Handshake (서로 소통 할 채널을 수립하는 과정)
- 프로토콜 버전 번호 교환
- 양쪽이 알고 있는 암호화 방식 선택
- 서로의 신원을 인증
- 채널을 암호화 하기 위한 임시 세션 키 생성
- 데이터 전송
- 세션 종료
좀 더 과정을 상세히 들여다 보자면,
pre master secret key
(이후에 대칭키로 사용된다)를 생성,인증서에 담겨있는 공개 키를 통해 암호화 하여 전송pre master secret key
를 복호화 한다.pre master secret key
를 공유하게 된다.master secret
를 통해 session key
를 생성session key
를 가지게 된다session key
를 통해 주고 받는 데이터를 암호화 하여 주고 받을 수 있게 된다. (대칭키 방식)session key
값을 이용하여 데이터를 암호화 하여 주고 받는다. (대칭키 방식)session key를 폐기
한다.세션의 수립과 세션의 종료는 순식간의 이루어지기 때문에 중간에 대칭키가 유출되더라도, 이미 폐지되어 안전하다고 한다.
물론 100% 안전을 장담 할 수는 없을 것이다.
참고 자료