본문 바로가기

IT/linux

5. HTTPS

SSL 동작 방식에 대한 상세 설명

 

 

 

 

이번 포스트에서는 HTTPS 프로토콜의 암호화 패킷 교환 방식인 SSL의 정의 및 동작 방식에 대해 설명 드리도록 하겠습니다.


 

 

그 첫 번째 예제로 웹 브라우저를 통해 HTTPS 프로토콜을 사용하는 구글 페이지에 접속합니다.

 

 

보통 웹 상에서 HTTPS 프로토콜을 사용하는 페이지에 접근 시 SSL 동작이 시작됩니다.

 

 

 

 

 

1. SSL 동작 방식에 대한 기본








상세 예제 사이트:


http://www.docstoc.com/docs/53837043/SSL(Secure-Socket-Layer)








2. SSL 동작 방식에 대한 WIRE SHARK 패킷 교환 예



아래 그림의 파란 테투리는 "TCP 3 Way Handshake" 부분을 가리키고, 빨간 테두리는 "SSL 패킷 교환 협상" 부분을 가리킵니다. 







아래는 SSL 동작 방식으로 인해 암호화 된 패킷을 보여주는 예입니다.





 

 

 


동작 방식에 대한 상세 설명:



클라이언트 호스트(211.254.99.210(클라이언트))


서버 호스트(74.125.71.94(구글))




1. TCP 3 Way Handshake

2. 클라이언트는 서버에게 지원 가능한(암호, 키교환, 서명, 압축)방식을 서버에게 알려준다.(Client Hello)

3. 서버는 클라이언트에게 지원 가능한(암호, 키교환, 서명, 압축)방식을 응답해 준다. (Server Hello)

4. 서버는 공개키(RSA 암호용)가 포함된 서버 인증서를 클라이언트에게 발송한다. 

5. 만약 서버가 클라이언트 인증서를 요구할 때 이에 대한 요청도 함께 발송한다.

6. Server Hello 완료

7. 서버가 클라이언트 인증서를 요구할 경우 인증서를 서버로 전송한다.

8. 클라이언트는 전송받은 서버 인증서에 대해 브라우저에 내장된 신뢰 기관으로부터 발급 여부를 확인한 후 암호화키로 사용될 세션 키(대칭키)를 랜덤으로 생성하여 공개키로 암호화해 서버로 전송한다.

9. 서버는 자신의 개인 키로 클라이언트에게 전송받은 세션키를 복호화한다.

10. 서버는 협상 과정에서 전송된 모든 메시지에 대하여(암호, 키교환, 서명, 압축)방식을 다음부터 적용할 것을 알리는 종결 메시지를 발송한 후 데이터 전송단계로 이동한다.

- 여기까지 모두 정상적으로 완료된다면, 클라이언트와 서버 모두 동일한 세션키(대칭키)를 공유하게 되는 것이다.

11. 클라이언트는 협상 과정에서 전송된 모든 메시지에 대하여(암호, 키교환, 서명, 압축) 방식을 다음부터 적용할 것을 알리는 종결 메시지를 발송한 후 데이터 전송단계로 이동한다.

12. 앞 단계에서 서로 공유된 세션키로 암호화된 전송 과정이 시작된다.






마지막으로 위 암호화 동작 방식을 자바스크립트로 간단히 표현한 코드입니다.

  1. /*
  2.  
  3. 서버(개인키 / 공개키)
  4.  
  5. */
  6.  
  7.  
  8. var pk = {}; // 개인 키
  9. pk.pubk = 'pubk'; // 공개키
  10. var pubk = function RSAEnc(key){ return key + '_' + pk.pubk; };
  11.  
  12.  
  13. /*
  14.  
  15. 클라이언트
  16.  
  17. */
  18.  
  19. var sKey = Math.random(10); // 생성된 랜덤 세션키
  20. sKey = pubk(sKey); // 서버로부터 전송받은 공개키(RSA 암호용)로 세션키를 암호화 한다.
  21.  
  22. /*
  23.  
  24. 서버
  25.  
  26. */
  27.  
  28.  
  29. // 서버의 개인키로 세션키 복호화
  30.  
  31. function RSADec(skey){
  32.  
  33.     var sKeys = sKey.split('_');
  34.    
  35.     for (var i = 0, length = sKeys.length; i < length; i++){
  36.         if (pk[sKeys[i]]){
  37.             skey = skey.replace(sKeys[i], '').replace(/([_])/g, '');           
  38.         }
  39.     }
  40.  
  41.     return skey;
  42. }
  43.  
  44. alert(RSADec(sKey)); // 공유된 세션키(skey)