[네트워크 보안] SSL이란? (SSL/TLS, 공개키/개인키, 핸드셰이크)
📝 SSL(Secure Scokets Layer)이란?
원래 웹에서 데이터는 가로채면 누구나 읽을 수 있는 일반 텍스트 형태로 전송 되었다. 이러한 문제 때문에 인터넷 통신의 개인정보 보호, 인증, 데이터 무결성을 보장하기 위해 netscape가 1995년 처음으로 SSL을 개발하였다.
SSL(Secure Sockets Layer)은 암호화 기반 인터넷 보안 프로토콜이다. 전달되는 모든 데이터를 암호화하고 특정한 유형의 사이버 공격도 차단한다. SSL은 TLS(Transoport Layer Security) 암화화의 전신이기도 한다.
SSL/TLS를 사용하는 웹사이트 URL은 HTTP 대신 HTTPS가 사용된다.
SSL은 1996년 SSL3.0 이후 업데이트되지 않았으며, 앞으로 사라지게 될 것으로 여겨지고 있다. 또한 알려진 취역성이 여러가지 있으며 보안 전문가들은 SSL 사용 중단을 권장한다고 한다. 그 대안으로는 TLS가 있다. TLS는 최신 암호화 프로토콜로, SSL 암호화와 혼용해서 부르는 경우도 많다.
📝 SSL 인증이란?
SSL 인증은 SSL인증서(신분증 같은 개념)가 있는 웹 사이트만 실행할 수 있다. 그리고 이 SSL 인증서는 가장 중요한 정보에 공개 키라는 걸 포함하는데, 공개키를 이용해서 클라이언트와 웹 서버가 안전하게 암호화가 가능하다. 클라이언트는 공개키를 보고 공개키를 이용해서 웹 서버와 완전하게 암호화 키를 수립한다. 또, 웹 서버에는 기밀로 유지되는 개인 키가 있다. 이 개인 키는 개키로 암호화된 데이터를 해독할 때 사용한다.
📝 공개키(Public Key)와 개인키(Private Key)
비대칭 암호화 에서는 2개의 키가 사용되며, 하나는 공개키(public key), 다른 하나는 개인키(private key)이다.
공개키는 누구에게나 공개할 수 있는 키이며, 이를 이용해 데이터를 암호화할 수 있다. 개인키는 비밀로 유지되어야하는 키이며 이 키를 이용해 공개키로 암호화된 데이터를 복호화할 수 있다.
공개키와 개인키는 수학적으로 서로 연관되어 있지만, 공개키를 알고있더라도 개인키를 유추하는 것은 매우 어렵다.
🔖 공개키 암호화 원리
1. 공개키와 개인키 생성
: 웹 서버는 공개키와 개인키 한 쌍을 생성한다. 공개키는 모든 사람에게 공개되지만, 개인키는 서버가 안전하게 보관한다.
2. 공개키 배포
: 서버는 공개키를 클라이언트에게 배포한다. 일반적으로 공개키는 SSL 인증서에 포함되어 있으며, 클라이언트는 서버에 접속할 때 이 인증서를 받는다.
3. 암호화된 메시지 전송
: 클라이언트는 서버로 전송할 때 데이터를 서버의 공개키로 암호화한다. 암호화된 데이터는 중간에 누군가가 가로채더라도 공개키만으로는 내용을 복호활 수 없다.
4. 개인키를 이용한 복호화
: 서버는 자신이 보유한 개인키를 이용해 클라이언트가 보낸 암호화된 데이터를 복호화한다. 이렇게 클라이언트와 서버 간의 통신이 안전하게 유지된다.
🔖 SSL/TLS에서의 공개키 사용 예시
1. 클라이언트가 서버에 접속 시도
: 사용자가 브라우저를 통해 'https://example.com'에 접속을 시도한다.
2. 서버가 SSL 인증서를 클라이언트에게 전송
: 서버는 SSL 인증서를 클라이언트에게 전송한다. 이 인증서에는 서버의 공개키가 포함되어 있다.
3. 클라이언트가 서버의 인증서를 검증
: 클라이언트는 서버가 보낸 인증서를 검증하여 신뢰할 수 있는 인증 기관(CA)이 발생한 것인지 확인한다.
4. 세션 키 생성
: 클라이언트는 세션 키라고 불리는 임시 대칭 키(대칭키는 동일한 키로 암호화와 복호화를 수행) 하나를 생성한다. 이 세션 키는 클라이언트와 서버 간의 암호화된 통신에 사용된다.
5. 세션키를 서버의 공개키로 암호화하여 전송
: 클라이언트는 생성한 세션 키를 서버의 공개키로 암호화하고 이를 서버에 전송한다.
6. 서버가 세션 키를 복호화
: 서버는 자신의 개인키를 사용하여 클라이언트가 보낸 세션 키를 복호화한다.
7. 대칭 암호화 통신 시작
: 이제 클라이언트와 서버는 세션 키를 사용하여 대칭 암호화 방식으로 안전하게 통신한다. 대칭 암호화는 비대칭 암호화보다 속도가 빠르기 때문에, 세션 키를 사용해 데이터를 암호화하는 것이 더 효율적이다.
📝 SSL 인증서의 유형
하나의 인증서가 하나의 웹 사이트에 적용되는지, 또는 여러 개의 웹 사이트에 적용되는지에 따라 유형이 달라진다.
🔖 단일 도메인
: 단일 도메인 SSL 인증서는 단 하나의 도메인(www.example.com)에 적용된다.
🔖 와일드 카드
: 와일드카드 ssl 인증서도 단인 도메인 인증서처럼 단 하나의 도메인에 적용되지만, 도메인의 하위 도메인도 포함된다. 예를 들어 와일드카드 인증서는 www.example.com , blog.example.com과 을 포함할 수 수 있지만, 단일 도메인 인증서는 첫 번째 도메인만 포함할 수 있다.
🔖 멀티 도메인
: 이름이 의미하는 것처럼 멀티 도메인 SSL 인증서는 관련되지 않은 다수의 도메인에 적용될 수 있다.
또한, SSL 인증서마다 유효성 검사 수준이 다르다. 유효성 검사는 신원 조회와 같은 것이며, 그 수준은 검사의 정도에 따라 다르다.
📝 TLS(Transport Layer Security)
TLS는 SSL의 업데이트 버전으로 SSL의 최종버전인 3.0과 TLS의 최초버전의 차이는 크지 않으며, 이름이 바뀐것을 SSL을 개발한 Netscape가 업데이트에 참여하지 않게 되어 소유권 변경을 위해서이다. 결과적으로는 TLS는 SSL의 업데이트 버전이며 명칭만 다르다고 볼 수 있다.
전송 계층 보안(TLS)는 인터넷 상의 커뮤니케이션을 위한 개인정보와 데이터 보안을 용이하게 하기 위해 설계되어 널리 채택된 보안 프로토콜이다. TLS는 또한 이메일, 메시지, 보이스오버 IP(VoIP) 등 다른 커뮤니케이션을 암호화하기 위해 사용한다.
📝 TLS와 HTTPS의 차이점은?
HTTPS는 HTTP 프로토콜 상위에 TLS 암호화를 구현한 것으로 모든 웹 사이트와 다른 웹서비스에서 사용된다. 따라서 HTTPS를 사용하는 웹 사이트는 TLS 암호화를 이용한다.
📝 SSL/TLS 작동 방식
SSL은 높은 수준의 개인정보 보호를 제공하기 위해, 웹에서 전송되는 데이터를 암호화한다. 따라서 데이터를 가로채려는 자는 거의 해독할 수 없는 복잡한 문자만 보게 된다. SSL은 두 통신 장치 사이에 핸드셰이크라는 인증 프로세스를 시작하여 두 장치의 ID를 확인한다. SSL은 또한 무경성을 제공하기 위해 데이터 디지털 서명하여 데이터가 의도된 수신자에 도착하기 전에 조작되지 않았다는 것을 확인한다.
🔖1. SSL 핸드셰이크(인증 프로세스)를 수행
: 데이터를 주고받기 위해 어떤 방법을 사용해야 하는지 서로의 상태(ID)를 파악한다. SSL은 HTTP와 달리 443포트를 기본으로 사용하는 TCP 기반 프로토콜인데, TCP 기반이기 때문에 SSL 핸드셰이크 전에 TCP 3-Way 핸드셰이크 또한 수행한다.
🔖 2. 서로 간 협상이 완료되면 , SSL 세션이 생성되고 이 후 클라이언트와 서버는 원하는 데이터를 주고 받는다.
🔖 3. 데이터 전송이 끝나면 서로에게 알린 후 세션을 종료한다.
📝 SSL/TLS 핸드셰이크란?
TLS 핸드셰이크는 TLS 암호화를 사용하는 통신 세션을 실행하는 프로세스이다. TLS 핸드셰이크 중에, 통신하는 양측에서는 메시지를 교환하여 서로 인식하고 서로를 검증하며 사용할 암호화 알고리즘을 구성하고 세션 키에 합의한다. TLS 핸드셰이크는 HTTPS 작동 원리의 근간을 둔다.
TLS 핸드셰이크는 사용자가 HTTPS를 통해 웹 사이트를 탐색하고 브라우저가 처음 해당 웹 사이트의 원본 서버를 조회하기 시작할 때마다 발생한다. 다른 통신이 API 호출 및 HTTPS를 통한 DNS 쿼리를 포함하는 HTTPS를 사용할 때도 매번 TLS 핸드셰이크가 발생한다. TLS 핸드셰이크는 TCP 연결이 TCP 핸드셰이크를 통해 열린 후 발생한다.
📝 TLS 핸드셰이크가 이뤄지는 단계
TLS 핸드셰이크는 클라이언트와 서버가 교환하는 일련의 데이터그램, 즉 메시지이다. TLS 핸드셰이크는 여러 단계로 이뤄진다. 그 과정에서 클라이언트와 서버는 핸드셰이크를 완료하고 추가 대화를 가능하게 하는 데 필요한 정보를 교환한다.
🔖 Client hello
: 클라이언트가 서버에게 연락을 한다. 브라우저 검색창에 도메인을 입력하는 것으로 보면 된다. 이때 클라이언트는 자신의 브라우저가 지원할 수 있는 암호화 방식(Cipher Sutie)을 먼저 제시한다. 그리고 랜덤 데이터를 생성하여 추가로 전송한다.
🔖 Server hello
: 서버가 클라이언트에게 연락을 한다. 서버는 클라이언트가 제시한 암호화 방식 중 하나를 선정하여 알려준다. 또한, 서버 자신의 인증서를 전달한다. 이 인증서에는 서버의 공개키가 포함되어 있다. 서버 또한 클라이언트와 마찬가지로 서버 측에서 생성한 랜덤 데이터 또한 전달한다.
🔖Client Key Excange
: 클라이언트는 미리 주고받은 자신과 서버의 랜덤 데이터를 참고하여 서버와 암호화 통신을 할 때 사용할 키를 생성한 후 서버에게 전달한다. 이때 키는 서버로부터 받은 공개키로 암호화되어 보내진다. 클라이언트가 생성한 키가 위의 공개키, 개인키에서 언급한 세션키이다.
🔖Finished
: 마지막으로 핸드셰이크 과정이 정상적으로 마무리되면, 클라이언트와 서버 모두 "finished" 메시지를 보낸다. 그 후부턴 클라이언트가 생성한 키를 이용하여 암호화된 데이터를 주고받게 된다.
[참고]
https://www.cloudflare.com/ko-kr/learning/ssl/what-is-ssl/