ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • HTTPS와 SSL인증서 (2)공개키, CA, SSL 인증서 내용, 인증서 신뢰
    생활코딩 WEB 2022. 11. 28. 02:37

    ---

    https://youtu.be/mMCNqc1BmSE

     

    ---

    대칭키를 보완한 비대칭키=공개키

    대칭키는 키를 어떻게 배송해 에서 막힌다(▽오프라인에서 만날것도 아니고)

     

    공개키 방식은 키가 쌍으로 두개 존재한다.

     

    ---

    (opentutorials내용)

    대칭키 방식은 단점이 있다. 암호를 주고 받는 사람들 사이에 대칭키를 전달하는 것이 어렵다는 점이다. 대칭키가 유출되면 키를 획득한 공격자는 암호의 내용을 복호화 할 수 있기 때문에 암호가 무용지물이 되기 때문이다. 이런 배경에서 나온 암호화 방식이 공개키방식이다.

     

    공개키 방식은 두개의 키를 갖게 되는데 A키로 암호화를 하면 B키로 복호화 할 수 있고, B키로 암호화하면 A키로 복호화 할 수 있는 방식이다. 이 방식에 착안해서 두개의 키 중 하나를 비공개키(private key, 개인키, 비밀키라고도 부른다)로하고, 나머지를 공개키(public key)로 지정한다. 비공개키는 자신만이 가지고 있고, 공개키를 타인에게 제공한다. 공개키를 제공 받은 타인은 공개키를 이용해서 정보를 암호화한다. 암호화한 정보를 비공개키를 가지고 있는 사람에게 전송한다. 비공개키의 소유자는 이 키를 이용해서 암호화된 정보를 복호화 한다. 이 과정에서 공개키가 유출된다고해도 비공개키를 모르면 정보를 복호화 할 수 없기 때문에 안전하다. 공개키로는 암호화는 할 수 있지만 복호화는 할 수 없기 때문이다.

     

    이 방식은 이렇게 응용할 수도 있다. 비공개키의 소유자는 비공개키를 이용해서 정보를 암호화 한 후에 공개키와 함께 암호화된 정보를 전송한다. 정보와 공개키를 획득한 사람은 공개키를 이용해서 암호화된 정보를 복호화 한다. 이 과정에서 공개키가 유출된다면 의도하지 않은 공격자에 의해서 데이터가 복호화 될 위험이 있다. 이런 위험에도 불구하고 비공개키를 이용해서 암호화를 하는 이유는 무엇일까? 그것은 이것이 데이터를 보호하는 것이 목적이 아니기 때문이다. 암호화된 데이터를 공개키를 가지고 복호화 할 수 있다는 것은 그 데이터가 공개키와 쌍을 이루는 비공개키에 의해서 암호화 되었다는 것을 의미한다. 즉 공개키가 데이터를 제공한 사람의 신원을 보장해주게 되는 것이다. 이러한 것을 전자 서명이라고 부른다.

     

    ---

    A키(B키)로 암호화 했기 때문에 A키(B키)로 복화하는건 불가능하다.

    둘중 하나를 비공개키로, 비공개키는 누구에게도 보여주면 안된다.

    공개키는 공개한다.

     

    ---

    (공개키를 이용해서 암호화하는 것에 대한 설명)

    내가 운영하는 사이트에 공개키를 올려둠 -> 누가 다운로드 받고, 내게 어떤 정보를 전달할 때 공개키로 암호화하고 비밀키를 갖고 있는 나에게 전송하면 비밀리에 전송할 수 있다.

    키를 배달할 때 사고가 일어나지 않는다!

     

    ▽A의 공개키는 A에게 비밀스럽게 전송할 수 있는 도구군

     

    ---

    (공개키를 이용해서 인증을 하는 것에 대한 설명)

    인증 : 자신이 받은 정보가 올바른 사람이 전송한 정보가 맞는지를 확인하는 것

     

    공개키를 이용해서 인증할 수가 있다 기가 막혀

     

    방금이랑 반대다. 비밀키를 갖고 있는 사람(=나)이 자신의 비밀키로 정보를 암호화하고, 공개키를 갖고 있는 사람에게 전송. 그럼 내가 전송한 정보는 누구나 다 복호화할 수 있어. 암호로서의 기능은 없지만 받은 사람이 복호화에 성공했다면 비밀키를 갖고 있는 사람이 전송한 정보라는 것을 보증하게 된다.

     

     = 인증서의 원리!!

     

    ---

    • http://www.moserware.com/2009/06/first-few-milliseconds-of-https.html 
      공학적인 소양이 많으신 분들을 위한 아티클, SSL에 많은 주체들은 브라우저, 서버, 통신 내용.. 이런것들을 여러가지 SW들을 이용해서 내용을 분석해서 이 맥락에서 firefox의 소스코드는 어떻고.. 이런것들을 굉장히 디테일하게 설명해놓은 문서
    • SSL이란 무엇인가 1, 2 (미닉스의 작은 이야기들 블로그의 SSL 만화)

     

    ---

    (opentutorials내용)

    그럼 이해를 돕기 위해서 공개키를 이용해서 RSA라는 방식의 공개키를 사용해보자. 아래 명령은 private.pem이라는 이름의 키를 생성한다. 이 키는 1024bit 길이을 갖는다. 이 숫자가 높을수록 안전하다.

    1
    openssl genrsa -out private.pem 1024;

    다음 명령은 private.pem이라는 이름의 비공개키에 대한 public.pem이라는 이름의 공개키를 생성한다. 이 공개키를 자신에게 정보를 제공할 사람에게 전송하면 된다.

    1
    openssl rsa -in private.pem -out public.pem -outform PEM -pubout;

    공개키를 가진 사람이 어떤 정보를 비공개키를 가지고 있는 사람에게 전송하는 상황을 상정해보자. 아래는 coding everybody라는 이름의 문자를 담고 있는 file.txt를 만든다. 이 데이터를 비공개키 소유자에게 전송하기 위해서는 암호화가 필요하다.

    1
    echo 'coding everybody' > file.txt

    file.txt를 암호화 해보자. 아래의 예제는 file.txt의 내용을 RSA방식으로 암호화한 file.ssl이라는 이름의 파일을 생성한다. 이 때 사용된 공개키가 public.pem이다. 이제 안심하고 file.txt를 암호화한 결과인 file.ssl을 비공개키의 소유자에게 전송할 수 있다.

    1
    openssl rsautl -encrypt -inkey public.pem -pubin -in file.txt -out file.ssl;

    그럼 file.ssl을 수신받은 비공개키 소유자가 어떻게 이 정보를 복호화 할 수 있는지 알아보자. 아래 예제는 file.ssl을 복호화한 결과를 decrypted.txt로 만들어내는 방법을 보여준다. 이 과정에서 비공개키인 private.pem을 사용했다.

    1
    openssl rsautl -decrypt -inkey private.pem -in file.ssl -out decrypted.txt

     

    ---

    openssl을 이용해서 RSA공개키 방식으로 암호화, 복호화 과정

     

    1.키를 먼저 생성해야 한다, 프라이빗 키를 먼저 생성하겠습니다

    genrsa : rsa방식으로 된

    프라이빗키를 생성한다

    1024 : 암호에 대한 복잡도, 높을 수록 더 안전, 더 높은 컴퓨팅 파워  ▽엄청 작게 해도 돌아는 가겠네 원리상

     

    ---

    -in : ~파일을 가져와서

    -out : ~파일을 만든다

    RSA라는 방식의 키를 만들었다

    public.pem이 만들어짐

     

    ---

    암호화할 정보 만들어보기

     

    ---

    암호화해보기

    -encrypt : 암호화

    -inkey : 키로 ~파일을 사용(-inkey public.pem이니까 공개키를 갖고 있는 사람이 암호화를 한다는 뜻)

    -in file.txt : 이걸 암호화

    -out file.ssl : 암호화된 결과는 이걸로 export 출력

     

    ---

    비공개키를 갖고 있는 사람이 자신에게 도착한 정보를 복호화.

    비공개키는 나만 갖고 있어서 나 말고는 누구도 내용을 복호화 할 수 없어

    -decrypt

    -inkey : 이 키를 쓰겠다

    -in

    -out

     

    ---

    https://youtu.be/lw0qdSqu2eg

    인증서 용어 정리

     

    ---

    (opentutorials내용)

    SSL 인증서의 역할은 다소 복잡하기 때문에 인증서의 메커니즘을 이해하기 위한 몇가지 지식들을 알고 있어야 한다. 인증서의 기능은 크게 두가지다. 이 두가지를 이해하는 것이 인증서를 이해하는 핵심이다.

    1. 클라이언트가 접속한 서버가 신뢰 할 수 있는 서버임을 보장한다.
    2. SSL 통신에 사용할 공개키를 클라이언트에게 제공한다.

     

    인증서의 역할

    1.어떤 사이트에 접속했을 때 자신이 접속한 서버가 내가 의도한 진짜 서버가 맞냐 보장  ▽누군가 사이트를 똑같이 꾸몄을 수도 있잖아

    2.위의 것 확인후에, 인증서가 갖고 있는 정보(서버의 공개키)를 웹브라우저가 획득. 인증서 안에 서버의 공개키가 들어가 있다. 클라이언트는 그 공개키를 갖고 서버와 통신할 때 암호화를 하고 복호화를 할 수 있다

     

    ---

    이 두가지를 이해하기 위해 이해해야할 개념들

    1.CA

    (opentutorials내용)

    인증서의 역할은 클라이언트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지를 보장하는 역할을 한다. 이 역할을 하는 민간기업들이 있는데 이런 기업들을 CA(Certificate authority) 혹은 Root Certificate 라고 부른다. CA는 아무 기업이나 할 수 있는 것이 아니고 신뢰성이 엄격하게 공인된 기업들만이 참여할 수 있다. 그 중에 대표적인 기업들은 아래와 같다. 수치는 현시점의 시장점유율이다. (위키피디아 참조)

    • Symantec (VeriSign, Thawte, Geotrust) with 42.9% market share
    • Comodo with 26%
    • GoDaddy with 14%
    • GlobalSign with 7.7%

    Symantec이 VeriSign이라고 하는 유명한 인증서 업체를 인수

     

    SSL을 통해서 암호화된 통신을 제공하려는 서비스는 CA를 통해서 인증서를 구입해야 한다. CA는 서비스의 신뢰성을 다양한 방법으로 평가하게 된다.

     

    ---

    인증서의 역할 1번에 보면 보장이 있는데

    어떻게 해서 그것을 보장할 수 있냐면?? 그런 역할을 전담하는 기관이 존재한다. 보통 기업들. 어떤 사이트가 신뢰할 수 있는 사이트인지, 그 사이트가 맞는지를 보장보증해주는 기업, 기관들이 있고, 그런 조직들을 CA라고 한다.

    각각의 브라우저 벤더들(MS, Mozilla, Google, Apple..)이 자체판단에 의해 CA들을 자사의 브라우저에 리스트에 탑재한다.

     

    ---

    이런 업체들이 인증서를 통해서 사이트에 신뢰성을 부여하고, 서비스를 하기 위해서 그 업체들에게 비용을 지불해서 인증서를 구입해야 한다

    (수업 뒤에서 살펴볼 startssl이라는 업체를 이용하면 무료)

     

    ---

    2.

    클라이언트와 서버가 신뢰할 수 없는 관계

    그래서 중간에 신뢰할 수 있는 권위가 있는 기관이 필요한 것.

     

    근데 사내서버, 내가 직접 사용하는 개발서버인 경우 인증서를 구입할 필요가 없어. 그 도메인이 그 사이트라는 것을 충분히 인지하고 있기 때문

    그런 경우 이 사이트에 대한 신뢰성은 이미 확보가 돼 있는 상태에서 SSL이라고 하는 암호화 기능만을 사용하고 싶은 경우 직접 자신이 CA의 역할을 하면서 SSL을 사용할 수 있는 방법이 있다

    opentutorials.org

    SSL을 쓰지만 공인된 CA가 아니면 저렇게 빨갛게 그어진다

     

    이 방법을 사용하면 비용도 들지 않고 빠르게 SSL을 사용할 수 있는 장점

    공인된 업체에서 제공하는것이 아니라서 사적인 서비스가 아닌 퍼블릭한 서비스에선 이 방법을 사용하면 안된다

     

    ---

    3.SSL 인증서의 내용

     

    (opentutorials내용)

    SSL 인증서에는 다음과 같은 정보가 포함되어 있다.

    1. 서비스의 정보 (인증서를 발급한 CA, 서비스의 도메인 등등)  --CA가 누구인가, 이 인증서는 어떤 도메인에 대한 인증서인가, 그 서버가 맞는지 인증해주는 정보
    2. 서버 측 공개키 (공개키의 내용, 공개키의 암호화 방법)  --암호화 기법으로 통신하기위해 필요한 정보

    인증서의 내용은 위와 같이 크게 2가지로 구분할 수 있다.

    1번은 클라이언트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지에 대한 내용을 담고 있고,

    2번은 서버와 통신을 할 때 사용할 공개키와 그 공개키의 암호화 방법들의 정보를 담고 있다.

     

    서비스의 도메인, 공개키와 같은 정보는 서비스가 CA로부터 인증서를 구입할 때 제출해야 한다.

     

    위와 같은 내용은 CA에 의해서 암호화 된다. 이 때 사용하는 암호화 기법이 공개키 방식이다. CA는 자신의 CA 비공개키를 이용해서 서버가 제출한 인증서를 암호화하는 것이다. CA의 비공개키는 절대로 유출되어서는 안된다. 이것이 노출되는 바람에 디지노타라는 회사는 파산된 사례도 있다.

     

    ---

    이 인증서가 클라이언트에게 전달이 되는데, 웹브라우저가 SSL프로토콜을 이용해서 서비스에 접속하게되면 내부적으로 서비스는 서비스의 인증서를 클라이언트에게 전송

     

     

    지금 이거는 구글이고, http영역인데 로그인 버튼을 누르면

    주소 표시창이 이렇게 변경됐다. 현재 이 웹브라우저가 구글서버에 접속할 때 SSL로 접속했다는 것.

    내부적으로 이 구글서버는 접속한 클라이언트에게 SSL인증서를 전송해주게 된다

    초록색 표시 부분을 클릭해보면 인증서 내용

    연결은

    이 인증서가 누구에 의해서 공인된 것인지

    인증서 정보 클릭하면

    인증서가 나오고

    인증 경로 누르면

    이 인증서가, accounts.google.com 이 사이트는, 이 서비스는 Google Internet Authority라는 CA에 의해 인증이 됐고 Google Internet Authority라는 CA는 GeoTrust라는 루트인증기관에 의해 인증됐다라는것을 나타내주는 문서다.

     

    자세히 탭은

    유효기간, 인증서가 어느 도메인에서 사용되는지, 발급자 누군지, 어떤 방식으로 암호화 됐는지.. SSL프로토콜을 위한 정보들이 인증서 안에 포함돼 있다.

     

    ---

    어쨌든 클라이언트가 접속했을 때 서버는 자신이 갖고 있는 인증서를 클라이언트에게 전송해주는데, 그럼 그 인증서는 어떻게 만드냐? 바로 공인된 기관. CA에 의뢰해서 구입한다. 그때 내 사이트가 어떤 사이트고.. 만약에 높은 수준의 보안 서비스를 제공하는 인증서인 경우는 사업자등록이라든지 불법적인 행위를 하지 않는다라는 것을 검증할 수 있는 여러가지 서류들을 보내게 된다.

     

    그걸 보내는 과정에서 서버는 자기가 생성한 공개키를 같이 인증기관에 보내게 된다. 이 공개키가 언제 사용될지는 뒤에서

     

    나는 비밀키를 갖고 있고, 공개키를 만들어서 공개키와 내 서비스에 대한 정보를 묶어서 인증기관에게 전송하면 인증기관은 그것을 심의해서 그것이 문제가 없다라고 판단되면 인증서를 그 서비스에게 제공한다.

    그럼 그 서비스는 그 인증서를 앞으로는 그 사이트로 들어오는 자신의 서비스로 접속하는 사용자들에게 인증서를 제공하는걸 통해서 SSL이라고 하는 기능을 사용할 수가 있게 된다.

     

    ---

    4.

    (opentutorials내용)

    CA를 브라우저는 알고 있다

    인증서를 이해하는데 꼭 알고 있어야 하는 것이 CA의 리스트다. 브라우저는 내부적으로 CA의 리스트를 미리 파악하고 있다. 이 말은 브라우저의 소스코드 안에 CA의 리스트가 들어있다는 것이다. 브라우저가 미리 파악하고 있는 CA의 리스트에 포함되어야만 공인된 CA가 될 수 있는 것이다. CA의 리스트와 함께 각 CA의 공개키를 브라우저는 이미 알고 있다.

     

    ---

    인증 기관에 대한 정보는 브라우저가 이미 알고 있다. 성능상의 이유도 있고, 여러가지 이유로 인해 브라우저는 어떤 기관이 공인된 기관인지에 대한 정보를 갖고 있다.

    브라우저가 업데이트 될 때마다 그 정보가 계속 바뀐다. 어떤 인증기관은 그 기관이 해킹을 당해서 그 인증기관의 인증서가 무효화 된 사례가 있었다.(디지노타)

    브라우저들이 디지노타를 루트인증기관에서 제거해서 파산!

     

    ---

    https://youtu.be/jbFpGz7MV5Y

    복습

    CA는 신뢰할 수 있는 기관이라서, 그 기관이 신뢰한다라는걸 표시해준 사이트를 신뢰할 수 있게된다!

    인증서의 내용은 서비스의 정보, 서버 측 공개키

    브라우저는 CA의 리스트를 기본적으로 알고 있다. 정확하게는 루트 인증 기관의 리스트를 알고 있다.

     

    ---

    인증서가 어떻게 서비스를 보증하는가?

    (opentutorials내용)

    이번 절을 시작할 때 인증서의 첫번째 목적을 아래와 같이 언급했다. 어떤 메커니즘으로 인증서가 서버의 신뢰성을 보장하는지 알아보자.

    클라이언트가 접속한 서버가 신뢰 할 수 있는 서버임을 보장

    웹 브라우저가 서버에 접속할 때 서버는 제일 먼저 인증서를 제공한다.

     

    브라우저는 이 인증서를 발급한 CA가 자신이 내장한 CA의 리스트에 있는지를 확인한다.

     

    확인 결과 서버를 통해서 다운받은 인증서가(--인증서의 인증기관이)

    내장된 CA 리스트(--루트CA)에 포함되어 있다면 해당 CA의 공개키를 이용해서(--인증기관의 공개키가 브라우저에 내장) 인증서를 복호화 한다.

     

    CA의 공개키를 이용해서 인증서를 복호화 할 수 있다는 것은 이 인증서가 CA의 비공개키에 의해서 암호화 된 것을 의미한다. 해당 CA의 비공개 키를 가지고 있는 CA는 해당 CA 밖에는 없기 때문에 서버가 제공한 인증서가 CA에 의해서 발급된 것이라는 것을 의미한다.  --정보의 출처를 신뢰할 수 있다

     

    CA에 의해서 발급된 인증서라는 것은 접속한 사이트가 CA에 의해서 검토되었다는 것을 의미하게 된다.

    CA의 검토를 통과했다는 것은 해당 서비스가 신뢰 할 수 있다는 것을 의미한다. 이것이 CA와 브라우저가 특정 서버를 인증하는 과정이다. 이 과정이 잘 이해가 되지 않는다면 전자서명 부분을 다시 읽어보자. 또한 이 과정은 뒤에서 다시 한번 살펴볼 것이다.

     

    이렇게해서 인증서가 서버의 신뢰성을 제공하는 방법을 알아봤다. 그런데 의문점이 남는다. 인증서에 포함된 서버의 공개키는 어떤 용도에 사용될까? 이제부터 이것에 대해서 알아보자.

Designed by Tistory.