ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • HTTPS와 SSL 그리고 인증서
    Develop/http 2018. 8. 13. 23:06

    HTTPS와 SSL 그리고 인증서


    생활코딩 : HTTPS와 SSL 인증서

    KLDP Wiki : SSL 인증서 HOWTO(크게보기 : https://wiki.kldp.org/HOWTO/html/SSL-Certificates-HOWTO/index.html)


    간단요약

    HTTPS란?

    HTTP는 암화화를 지원하지 않기 때문에 SSL(TLS)를 통해 암호화한다. 좀 더 자세히 얘기하면 HTTP 프로토콜 메시지를 한 단계 더 거쳐 SSL을 통해 암호화하고 TCP를 통해 전달한다. 받는 쪽은 마찬가지로 TCP로 수신한 메시지를 복호화하고 HTTP메시지로 변환하여 처리한다.


    암호화?

    HTTPS에서 사용하는 암호화 방식은 공개키 방식과 대칭 키 방식 두 가지다.

    대칭키 방식 - 암호화와 복호화시 동일한 키를 사용한다.

    공개키 방식 - 키가 2개가 존재하며, 공개되어 있는 public key를 통해 암호화해서 전송하면 private key를 통해 복호화 해서 확인한다. 반대로 사용도 가능하나 크게 의미는 없다. (아래 인증서 부분에서 사용)

    대칭키 방식이 성능상 이점이 있으나 키를 전달하는게 메시지 전달과 마찬가지로 보안상의 문제가 있기 때문에, 공개키 방식을 사용해 대칭키를 전달하고 전달된 공개키를 사용해 메시지를 암호화하는데 사용한다. 대칭키는 매번 새로 생성되기 때문에 노출이 되어도 다음엔 의미가 없게 된다.

    과정을 정리하면 다음과 같다.

    HandShake

    1. Client가 HTTPS(SSL)로 Server에 페이지를 요청 - "Client Hello", 랜덤 데이터 및 암호화 방식

    2. Server는 Public Key가 포함된 인증서를 Client로 전달 - "Server Hello", 랜덤 데이터 및 암호화 방식

    3. Client는 인증서를 통해 Server의 Public Key를 검증 - CA를 통해. 위의 랜덤 데이터를 통해 "pre master secret" 키 생성

    4. Client는 Public Key를 통해 data와 Random Symmetric Key("pre master secret")를 암호화해서 Server로 전달 - "pre master secret을 master secret으로 변경 후 master scret으로 sesson key 생성 => Symmetric Key

    Session

    5. Server는 Private Key로 복호화한 후 Symmetric Key로 response를 암호화해서 Client로 응답

    6. Client는 Symmetric Key로 복호화해서 렌더링 후 화면에 표시


    인증서?

    Client는 자신히 접속한 Server로 부터 Public Key를 전달 받아야 한다. 여기에 인증서를 사용한다.

    인증서의 서명을 신뢰 할 수 있다면 인증서 자체를 신뢰할 수 있고 여기에 포함된 data(관련 정보+Public Key)도 신뢰하고 사용할 수 있다고 본다.

    인증서의 서명은 CA(Certificate Authrity)를 통해 이루어지는데 CA는 사전에 지정된 신뢰할 수 있는 기관을 의미하고, 최상위 CA들의 인증서는 신뢰성을 위해 브라우저 자체에 포함되어 있다.


    서명?

    메시지의 작성을 인증하는 역할로 해시를 사용한다. 과정은 다음과 같다.

    1. 데이터의 해시 생성

    2. Private Key로 해시를 암호화

    3. 암호화된 해시와 인증서를 메시지에 추가

    4. 수신자는 데이터의 해시 생성

    5. 메시지에 포함된 해시를 Public Key를 통해 복호화

    6. 자신이 생성한 해시(4)와 메시지에 포함된 해시(5)를 비교


    즉, Server의 Public Key를 통해 Symmetric Key를 암호화해서 전달하기 때문에 Public Key의 검증이 필요하다. 사실 Public Key 자체는 공개 되는 것이라 Server자체의 검증(내가 접속한 Server가 맞는지)이라고 보는 것이 맞을 수 있다. 누군가 자신의 Private Key를 통해 암호화해서 Client로 인증서를 전달하고 Client가 이 Public Key를 사용해 Symmetric Key를 전달하면 문제가 될 수 있다. 인증서는 위에서 처럼 CA가 자신의 Private Key를 통해 암호화하기 때문에, 해당 CA의 Public Key를 사용해서 복호화가 가능하다면 인증서는 해당 CA에 의해 서명된 것으로 판단하고 인증서(Server)를 신뢰할 수 있게 되는 것이다. 이 때 CA의 Public Key는 브라우저 자체에 미리 내장되어 있기 때문에 신뢰가 가능한 것으로 본다. 따라서 인증서가 검증되었고, 인증서의 Public Key를 사용할 수 있게 되는 것이다.

Designed by Tistory.