[석기시대이야기] RSA (Rivest, Shamir, Adleman)가 처음 뜨기시작했을 때를 기억합니다. 대칭키 위주의 암호화가 주류를 이루는 시대에서 비대칭키 기반의 암호화(PKC) 알고리즘은 보안 업계와 개발 패러다임을 완전히 바꿔버릴만큼 발빠른 움직임이 있었고 개발과 인프라 구성에 지대한 영향을 미치고 큰 변화가 되었으며 "전자서명"이라는 개념은 인터넷뱅킹 시대를 열었으며 종국에는 "블록체인"이라는 괴물을 만들어 냈다. 솔직히 나는 RSA가 가져올 이 크나큰 변화를 전혀 인지하지 못했고 그 스트림에 편승하지 못했다.

결론! 획기적인 기초개념(알고리즘)은 크나큰 나비효과를 가져온다. 개발자라면 SRE적인 성과위주의 응용력도 좋지만 기초개념들을 익혀나가는 것을 게을리 하지 말자

PKC USAGE

간단히 PKC를 통하여 구현되는 중요기술은 암호화 전자서명이다. 

 

Encription (암호화)

대칭키의 최대 문제점은 키의 교환상의 보안헛점입니다. 어떻게든 키가 이동하게되면 탈취 가능성이 존재합니다 그러나 PKC의 입장에서는 상대에게 public key만 공유하고 public key로 암호화하여 전달되도록하면 공유된적 없는 private key를 가지고 있는 오직 나만이 암호문을 해독할수있게 되므로 간편하고 안정적인 통신이 구현된다.

 

Digital Signing (전자서명)

Encription의 반대로 보면 "전자서명"이 구현된다. RSA암호화의 반대로 생각해보면 private key로 암호화된 데이터는 public key로 복호화가 가능합니다. 이말은 public key를 가지고 있으면 전송받은 데이터가 private key를 가진자가 암호화 했다는걸 보증할수있게 되고 이를 "전자서명"이라고 합니다.

 

PKC ( Public Key Cryptography )

PKC는 공개키 기반 암호화 체계를 일컷습니다. 대표적으로 시작을 알린 RSA가있고 PKC의 꽃을 피운 ECC(Elliptic Curve Cryptography)가 있다

 

PKI ( Public Key Infrastructure )

결국은 이름에서 알수있듯이 PKI는 Public Key를 이용한 상호인증 체계정도로 볼수있습니다.

 

여기서!!!! 그냥 머릿속에 떠오릅니다. 전자서명의 헛점이 있네...

public key는 어떻게든 공유되어야 하고 누출되면?

  • 누출된 public key로 암호화하여 전송하면 수신측에서는 정상 팻킷으로 인식하게된다.
  • 극단적으로 public key를 전문에 같이보내는경우 별도의 public key와 private key를 생성하여 private key로 서명후 전송할경우 정상 서명으로 인식하게된다.

여전히 public key 공유에 대한 위험이 존재하고 이를 알고리즘으로 해결하지는 못하고 전송과 인증체계를 만들었는데 

이름하여 PKI

 

앞으로의 설명을 위한 예시를 "무역"의 예를 들어 보겠습니다.

  • 한국의 A라는 업체가 발전기하나를 일본의 B라는 업체에 수출하려고 합니다.
  • A는 아직 대금을 받지 못하였지만 B는 A업체를 신뢰하지 못하므로 대금을 송금하지 못합니다.
  • B는 신뢰할수있는 일본은행 메가뱅크에 대금을 입금하고 거래가 완료되면 송금을 부탁하는 입금증서를 발급받습니다. 이 입금증성에는 메가뱅크의 서명이 포함되어 있습니다.
  • 메가뱅크를 신뢰하는 B는 이 입금증서를 A에게 보내줍니다.
  • 그런데 A는 메가뱅크를 알지도 못하고 신뢰하지 못합니다.
  • 이에 메가뱅크는 미국의 퍼스트리퍼블릭은행에게 신뢰관계를 맺었다는 인증서를 B에게 발급해줍니다.
  • A는 메가뱅크에 입금했다는 입금증과 메가뱅크의 서명, A도 신뢰하는 퍼스트리퍼블릭의 서명이 포함된 메가뱅크 인증서를 받습니다.
  • 마침내 A는 B에게 물건을 보내줍니다.
  • 그리고 A는 메가뱅크로 부터 대금을 지불 받습니다.

 

이 예를 PKI에 적용해 보겠습니다.

  • Client는 Server로 데이터를 전송하려고 합니다.
  • Server가 private key + public key를 하나 생성하여 보내줍니다.
  • Client 전송과정에  public key가 변조되지 않았다고 확신하지 못하고 데이터를 전송하지 못합니다.
  • Server는 신뢰할수있는 기관 (CA, Certificate Authority) "A"에 public key를 제출하고 서명을 곁들인 인증서를 받습니다.
  • Server는 Client에게 이 인증서를 전송합니다.
  • Server는 Client에게 "A" CA에게 public key의 진위를 확인하라하지만 Client "A" CA를 신뢰하지 못합니다.
  • 이에 Server는 Client도 신뢰하는 "B" CA에게 인증을 받고 서명을 받습니다이를 기존 인증서에 포함하여 전송합니다.
  • Client는 "B"를 신뢰하므로 "A"도 신뢰하게 되고 public key를 신뢰하게 됩니다.
  • Client Data를 public key로 암호화 하여 전송합니다.

이와 같은 일련의 과정을 PKI라는 인증체계 입니다.

 

그런데!!!

이런 일런의 과정을 각 CA들이 각자의 방식대로 하게되면 시스템은 복잡하고 어려워 질껍니다.

이에 대한 국제 표준 규격을 만들어 놓은것이 X.509 Protocol 되겠다.

 

인증서 발급

  • 기본적으로 최상위 CA를 RootCA라고 하고 기본적으로 설치 또는 내장을 통하여 신뢰하기로 합니다.
  • 중간 CA는 RootCA로 부터 인증서를 발급받고 신뢰관계를 형성합니다.
  • 업체들은 중간 CA로부터 인증서를 발급받고 신뢰관계를 형성합니다.
  • 이를 "Chain Of Trust"라고 부르고 인증및 발급의 Clustering이 가능하게 합니다.
  • 결국은 내가 RootCA만 신뢰관계가 형성되면 다른 파생된 수많은 인증서들에 대해 신뢰관계를 형성할수있게 됩니다.

보안 연결 ( HandShaking )

  • Client는 지원하는 암호화방식, 난수 등을 서버로 전송합니다.
  • Server는 인증서 + 선택한 암호화 방식 + 난수를 Client로 전송합니다.
  • Client는 전송된 인증서를 Server가 아닌 CA를 통하여 검증합니다, 즉 Chain Of Trust에 있는지 검증합니다.
  • Client 주고받은 랜덤데이터를 활용하여 PMS(PreMaster Secret)을 생성합니다.
  • 이를 인증서의 public key로 암호화하여 전송합니다.
  • Server와 CLient는 서버난수 + 클라이언트난수 + PMS를 이용하여 대칭키를 생성합니다.
  • 서로간에 생성된 대칭키로 통신합니다.
  • 신뢰할수있는 보안연결이 생성되었습니다.

 

X.509 protocol

X.509는 PKI를 구현하기 위한 표준규격이 정의되어 있다. 자세한내용은 전자서명 인증서 표준규격 을 참조하자.

 

SSL ( Secure Socket Layer )

PKI를 이용하여 신뢰할수있는 키교환을 하고 이 키를 기반으로 신뢰할수있는 암호화 통신에 대한 프로토콜이다.  

그 구현체들은.. 너무나도 많고.. 왠만한 개발자들은 https, ssh등을 통하여 이미 쓰고 있는 기술이라고 볼수있다

 

이 모든것들 "https://www.openssl.org/"에 구현되어 있다. 그냥 가져다 쓰자!!!!

 

+ Recent posts