인증서 - RootCA

프로그래밍 2023. 3. 6. 23:08

CA 는 Certificate Authority의 약자입니다.

인증서에 대한 발급 권한을 의미하는 것인데요. 인증서 발급 업체를 의미하기도 하지요.

 

인증서의 발급은 너무나 쉽게 할 수 있습니다.

Open Source인 OpenSSL을 사용해도 할 수 있으니까요.

그 말은 해커도 인증서를 발행할 수 있다는 말이겠네요.

나, 너 그리고 아무나.. 할 수 있는 것이죠.

 

그래서 세계적으로 신뢰할 수 있는 인증서를 발급 가능한 기관에 제한을 두게 되었습니다.

 

그런 인증서를 발급할 수 있는 기관을 RootCA라고 부릅니다. 잘 알려진 기관으로는 Comodo, DigiCert ,GlobalSign 등이 있구요. 최근에는 국내에도 NAVER가 RootCA의 권한을 갖게 되었습니다.

그런데 RootCA는 알게 모르게 우리의 생활과 매우 밀접한 관계가 있습니다. 바로 RootCA들이 소유하고 있는 Root 인증서 때문이지요. RootCA는 private key는 꽁꽁 숨겨 잘 가지고 있고 public key가 포함된 Root 인증서들은 이미 알려진 OS나 Browser에 모두 배포 되어 있습니다.

 

대부분의 OS나 Browser 사용자들은 검증된 회사에서 만든 신뢰할 수 있는 Software만 설치가 되게 하고 싶을 것입니다. 이 확인을 Root 인증서로 하게 되는데요.

도대체 이건 어떻게 하는 것일까요?

 

설명에 앞서 우선 이해해야 할 것이 있습니다.

대부분의 인증서는 비대칭 알고리즘을 사용하기 때문에 개인키공개키를 사용하여 서명합니다.

 

즉, 서로 다른 A(공개키) 와  B(비밀키) key가 한쌍의 key가 되고 

1) A로 암호화  > B로 복호화 하거나

2) B로 암호화 > A로 복호화 할 수 있습니다.

 

위의 두가지 경우가 다르게 사용되는데...private key라는 것은 그냥 공개하지 않는키가 private key 인 것이고 데이터를 암호화 할때 사용하는 키는 private key일 수 있고 public key일 수도 있다는 것이 요점입니다.

 

Software를 Code signing 하는 경우에는 software에 대한 서명을 암호화 하는 key는 private key에 해당합니다. 반대로

SSL 인증서를 이용하는 https 통신을 하는 경우는 서버가 SSL 인증서를 클라이언트로 우선 보내고, 클라이언트는 서버와의 데이터 교환시 사용할 비밀키를 생성(성능상의 이유로 실제 데이터 교환시에는 대칭키를 사용)하여 다시 서버로 보냅니다. 이때에 이 비밀키를 암호화 하는 key는 SSL 인증서에 포함되어 있는 public key가 됩니다.

 

 

그럼 이제... 대부분의 OS와 Browser들은 그것들이 이미 가지고 있는 RootCA들의 공개 인증서들을 가지고...

신뢰받는 Software 회사들이 만든 Software 제품들이 해킹당하지 않고 온전하다는 것을 어떻게 확인 할까요?

 

대부분의 Software 회사들은 자신들의 제품을 인증하기 위하여 software에 서명을 합니다. 서명을 하지 않으면 설치가 안되거나 경고창이 뜨지요. 이때에 사용되는 인증서는 RootCA로 부터 서명받은 인증서여야 합니다. Code sigining 인증서라고 하지요.

 

Code sign 인증서를 얻는 방법은 

회사가 우선 회사의 정보를 기록한 인증서를 하나 만듭니다. 물론 정해진 file 형식이 있구요. 일반적으로 아래와 같은 내용을 담습니다.

  • Country Name ( 국가코드) : KR
  • State or Province Name ( 지역 ) : Seoul
  • Locality Name ( 시/군/구 ) : Seocho
  • Organization Name ( 회사명 ) : AAA Inc
  • Organizational Unit Name ( 부서명 ) : AAA Team
  • Common Name ( 서비스도메인명 ) : AAA.BBB.com
  • Email Address : aaa@bbb.com

이것을 RootCA 로 보내서 서명을 요청합니다. 그러면 RootCA는 위에 기록된 회사의 정보를 우선 확인하게 됩니다.

전화를 하던지 대행 업체를 통해 확인하기도 하고요. 확인이 완료 되면 서명된 인증서를 다시 회사로 보내 줍니다.

Software에 대한 Code signing은 RootCA로 부터 받은 이 인증서를 가지고 Software에 서명을 하면 됩니다.

 

앞서 얘기한 바와 같이 Code sign된 프로그램의 유효성, 신뢰성을 확인하기 위한 데이터의 복호화는 public key를 이용합니다.

code sign 인증서 내의 public key와 RootCA 가 발행하여 이미 OS나 Browser에 들어 있는 Root 인증서 내의 public key를 모두 이용하는 것입니다.

 

확인하는 방법을 좀 더 자세히 말하자면 Software에 서명된 정보를 복호화 해서 Hash code를 확인하는 것입니다.

아래 그림이 더 이해하기 쉽겠네요.

좌측 이미지를 보면...코드 서명 된 프로그램에는 보통 소프트웨어 코드, 디지털 서명 및 인증서가 함께 포함됩니다.

이 때에 인증서는 RootCA가 software 회사에게 서명해 준 public key가 담긴 인증서가 되구요.

이 인증서 자체는 암호화 된 데이터가 아니고 암호화 되는 것은 서명된 hash 데이터 들이기 때문에 

이 인증서의 public key를 읽어서 서명을 복호화 하면 원본 값의 hash code를 얻을 수 있습니다.

이 hash code와 실제 software(위 그림에서 Code 부분)의 hash code를 계산해서 비교해 보고 같으면 유효한 값이 됩니다.

Code의 hash 값을 만약 회사가 보유한 private key가 아닌 다른키(해커의)로 서명하게 되면 public key로 복호화한 값과 hash code가 일치하지 않기 때문에 유효하지 않게 됩니다.

 

이제 여기서 마지막으로 확인해야 할 것이 하나 남았네요.

바로 이 인증서가 유효한 것인가 하는 것입니다. 혹시나 해커가 만든 인증서로 code를 sign했을 수 도 있으니까요.

이것을 확인하기 위해서 RootCA의 공개된 인증서가 필요합니다.

RootCA가 이미 회사의 인증서에  서명을 해 놓았기 때문에 RootCA의 public key로 풀어서 인증서 자체의 hash code를 비교해 보면 되니까요.

 

주저리 주저리 쓰다보니 이해가 어려울 수도 있을것 같은데...설명이 매끄럽지 않네요.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형

'프로그래밍' 카테고리의 다른 글

SSL 인증서  (0) 2023.03.07
소켓 프로그래밍 6 - IOCP(1)  (0) 2022.06.26
소켓 프로그래밍 5 - Sliding Window  (0) 2022.06.24
Network Byte Ordering  (0) 2022.06.23
소켓 프로그래밍 4 - Data Boundary  (0) 2022.06.23
admin