SSL 디지털 인증서

  • 클라이언트와 서버간의 통신을 제 3자가 보증해주는 전자화된 문서
  • 용도
    • 통신 내용 노출을 막는다 => 암호화
    • 클라이언트가 접속하려는 서버가 신뢰 할 수 있는 서버인지 판단할 수 있다
    • 통신 내용의 악의적인 변경을 방지할 수 있다.

암호화

대칭키

  • 암호화를 하는 쪽과 복호화 하는 쪽이 같은 키를 가지고 있어야한다.
  • 키를 가지고 암호화를 하고 복호화할 때 같은 키로 복호화한다
  • 때문에 암호화한 데이터를 전송할때 키도 같이 전송한다.
  • 키가 노출될 위험이 있다.

공개키

  • A키로 암호화하면 B키로 복호화 해야한다.
  • B키로 암호화하면 A키로 복호화 해야한다.
  • 이 두개의 키중 하나는 비공개키이고 나머지는 공개키로 지정한다.
  • 비공개키는 자신만이 가지고 있는다.
  • 공개키로 암호화한 것은 비공개키로만 복호화하기 때문에 키값을 전달할 필요가 없다.
  • 반대로 비밀키를 가지고있는 쪽에서 암호화하고 공개키를 가지고 있는 사람에게 전송하면 공개키를 가지고 있는 모든 사람들이 복호화를 할 수 있기때문에 암호화의 역할을 못한다.
  • 이처럼 공개키를 가지고있는 사람이 복호화를 성공한다면 비밀키를 가지고 있는 쪽이 보낸 정보라는 것을 보증하게 된다. 이것이 인증서다.

용어

SSL 인증서

  • 서버에 접속했을 때 자신이 접근하려 했던 서버가 맞는지 보장
  • 접근하려 했던 서버임을 확인한 후에 인증서가 가지고 있는 정보를 클라이언트가 획득 할 수 있는데 이것은 서버가 가지고 있는 공개키를 사용자가 획득하는 것

CA

  • 인증서는 클라이언트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지 보장하는 역할을 한다.
  • 이 역할을 하는 민간기업이 있는데 이를 CA(Certificate Authority) 혹은 Root Certificate라고 한다.
  • 각 브라우저마다 선정된 CA를 각 브라우저의 판단에 따라 탑재되어있다.
  • SSL을 통한 서비스를 이용하려면 CA를 통해서 인증서를 구입해야한다.
사설 인증기관
  • 개발이나 사적 목적에서 SSL을 이용하려면 자신이 직접 CA역할을 할 수 있다.

인증서의 내용

  • 서비스 정보 (인증서를 발급한 CA, 서비스 도메인)
  • 서버 측 공개키 (공개키의 내용, 공개키의 암호화 방법)

브라우저로 서비스에 접속하면 서비스는 서비스의 인증서를 클라이언트에게 전송한다.

SSL 인증서는 CA에게 공개키와 서비스 정보를 전달하고 문제없다 판단되면 인증서를 서비스에게 다시 제공하는 것이다. 그 이후 그 인증서는 클라이언트에게 제공하게 된다.

CA를 브라우저가 알고 있다

  • CA는 브라우저가 리스트로 알고있다.
  • 브라우저가 업데이트 될때마다 리스트가 바뀔 수 있다.

SSL 인증서가 서비스를 보증하는 방법

  1. 웹 브라우저가 서버에 접속할 때 서버는 클라이언트에게 인증서를 제공한다.
  2. 브라우저는 인증서를 발급한 CA가 브라우저 리스트에 있는지 확인한다.
  3. 인증기관의 공개키는 브라우저가 가지고 있고, 그 공개키를 이용해 인증서를 복호화한다. (SSL 인증서는 인증기관의 비밀키로 암호화 되어 있다.)
  4. 복호화가 된다는 것은 인증서가 인증기관에서 발행한 것임을 확인할 수 있다.

SSL의 동작 방법

  • 단순 공개키 방법을 사용하면 성능의 단점이 있기 때문에 공개키와 대칭키를 혼합해서 사용한다.
  • 실제 데이터는 대칭키로 암호화
  • 대칭키의 키는 공개키로 암호화
  • SSL은 3 WAY HANDSHAKE 를 사용한다.
  1. 클라이언트가 서버에 접속한다. (Client Hello 단계)

    • 클라이언트에서 생성한 랜덤 데이터를 서버에 전송
    • 클라이언트가 지원하는 암호화 방식을 서버쪽에 전송
    • 세션 아이디
  2. 서버는 Client Hello 응답으로 Server Hello를 한다.

    • 서버 측에서 생성한 랜덤 데이터를 클라이언트에 전송
    • 서버가 선택한 클라이언트의 암호화 방식을 서버에서도 사용할 수 있는 암호화 방식을 선택해서 클라이언트에게 전달.
    • 인증서를 전송
  3. 서버의 인증서가 어떤 CA에 의해서 발급된 것인지 확인하기 위해 브라우저 Root CA 리스트를 확인

    3-1. 인증서가 없다면 사용자에게 경고 메시지 출력

  4. 클라이언트는 내장된 CA 공개키를 이용해서 인증서를 복호화

    4-1. 복호화에 성공한다면 CA의 개인키로 암호화된 문서임이 암시적으로 보증된다.

  5. 인증서 안에는 서버가 생성한 공개키가 들어있다. 클라이언트는 그 공개키를 획득한다.

  6. 앞서말한 서버 랜덤데이터 클라이언트 랜덤데이터를 조합해 pre master secret이라는 키를 만든다. 해당 키는 대칭키이다.

  7. 인증서 안에있는 공개키로 pre master secret값을 암호화해 서버로 전송할 수 있다.

  8. 클라이언트는 자신의 비밀키로 암호화된 pre master secret값을 복호화한다.

  9. 서버는 pre master secret값을 master secret값으로 만든다.

  10. master secret은 session key를 생성하고 이 session key 값을 이용해서 서버와 클라이언트는 데이터를 대칭키 방식으로 암호화 한 후에 주고 받는다. 이를 통해 세션 키를 클라이언트와 서버 모두가 공유하게 되었다.

세션

  • 세션은 실제로 서버와 클라이언트가 데이터를 주고 받는 단계다.
  • session key를 이용해 대칭키 방식으로 암호화한다
  • 암호화 된 정보는 상대방에게 전송되고 상대방도 세션키 값을 알고 있기 때문에 암호를 복호화 할 수 있다.