1. 개요
IoT의 전반적인 개념에 대해서는 앞서 많은 이야기가 되고 있는 것 같습니다. 그래서 이번에는 IoT를 위한 기술 중, 별 대단한 신기술은 아니지만 어쩌면 굉장히 중요한 기술이 될 수 있는 SSL에 대하여 언급해 보고자 합니다.
2. SSL 의 역사
SSL은 Secure Socket Layer의 약자로 Netscape 사에서 개발하였습니다. 하지만 최초의 버전인 1.0은 공개적으로 release 되지 않았습니다. 1995년 2월에는 몇가지 결함이 포함된 SSL 2.0이 release 되었으며, 1996년에는 비로소 완전체라고 할 수 있는 3.0이 release 되었습니다. 그 후 1999년 1월에 이 SSL 3.0을 새롭게 정의한 TLS 1.0이 release 됩니다. TLS 1.0은 RFC 2246, TLS 1.1은 RFC 4346, TLS 1.2는 RFC 5246에 정의되어 있습니다.
SSL은 TCP/IP 의 Transport Layer의 암호화 방식입니다. 따라서 HTTP 프로토콜 뿐 아니라 NNTP, FTP, XMPP 등의 프로토콜에도 다양하게 적용할 수 있습니다. 이 때문에 TLS(Transport Layer Security)라는 이름으로 불리게 된 것은 아닐까 하네요. 보통 SSL/TLS로 묶어서 표현하기도 하지요.
3. Private key, public key
SSL 인증에 대한 이야기를 하다 보면 private key(개인 key)와 public key(공개 key)에 대한 이야기를 빼놓을 수 없습니다.
이 방식의 특징은, 하나의 key로 암호화를 하면 해당되는 쌍의 다른 key 로만 해독이 가능하다는 것입니다. 예를 들어, (가)와 (나)가 한 쌍일 때, (가) key 로 암호화한 경우 (나) key로만 풀 수 있으며, (나) key 로 암호화한 경우 (가) key 로만 풀 수 있다. 이러한 key 는 소수 (prime number) 기반으로 생성되며, 길이, 즉 bit 가 길수록 암호화는 강해집니다.
Private key, public key는 위와 같은 이론을 바탕으로 하고 있다. 한 key는 개인이 비공개로 보유하고, 또 다른 key는 모두에게 공개합니다. 다른 사람들은 공개된 public key를 이용하여 그 개인에게 암호화된 내용을 전송한다. 이 내용은 private key를 가진 당사자만 풀 수 있습니다.
만일 내용을 private key를 이용하여 암호화하여 보낸다면, public key를 가진 모두가 그 내용을 해독하여 볼 수 있게 됩니다. 그러면 private key를 이용하여 암호화하였다는 것이 증명되고, 이는 곧 특정 개인이 보낸 메세지라는 것을 증명하게 됩니다.
4. 인증서
앞에서 public key 는 이름 그대로 공개한다고 했습니다. 그런데 public key를 받은 쪽에서, 그 쪽에서 보낸 public key가 정말 맞는지 의심을 할 수 있습니다. 그래서 그 역할을 제 3자가 합니다. 특정 key 가 그 쪽에서 보낸 것이 맞다는 것을 서명한 인증서를 발급하는 것입니다. 인증서에는 소유자 이름, 이메일, 그리고 인증서 용도, 유효기간, 위치 등등의 정보가 저장되어 있는데, 이러한 정보를 public key 와 public key 의 hash 값과 같이 저장하여 인증서를 생성합니다.
5. X.509
SSL 과 인증서는 서로를 표현하는 단어라고 할만큼 밀접한 관계가 있습니다.
이 글에서 인증서는 공개키 기반 인증서를 기준으로 설명합니다. 이 공개키 인증서는 개인키를 소유한 사람, 또는 장치나 서비스의 ID 에 공개키를 바인딩하는 문서입니다. access 의 필요 조건으로 인증되어야 하는 개별 주체들의 암호들을 서버가 관리할 필요가 없다는 것이 이 방식의 장점이라고 할 수 있습니다. 단지 서버는 인증서 발급자와 신뢰를 설정하기만 하면 됩니다.
이러한 통신 과정에서 전자 서명을 위한 인증서는 디지털 형태의 표준화가 필요한데 현재 가장 널리 사용되는 표준은 X.509 형식의 인증서입니다. 만일 인증서를 발급할 때 인증서에 들어가는 항목의 종류와 그 항목의 값들을 임의로 넣는다면 인증서를 사용하는 사용자마다 다른 형식의 인증서를 가지고 있게 될 것입니다.
1988년 X.500 표준의 하나로 시작된 X.509 는 1993년 2.0 이 발표되었습니다. 인증기관의 고유 식별자와 주체고유 식별자가 추가되었지요. 그리고 1996년에 현재 사용되는 3.0 이 발표되었습니다.
PGP 와 같이 상호 신뢰를 바탕으로 하는 모델과 달리 X.509 는 꽤나 엄격한 수직적 구조를 채택하고 있습니다. 즉, 하나의 인증 기관을 정점으로 트리 구조를 가지고 있습니다. 이 방식의 불편함을 해소하기 위하여 몇몇 신용할 수 있는 Root CA 끼리는 상호 인증과 자가 인증을 허용하고 있습니다.
X.509 인증서는 다음과 같은 형식을 가지고 있습니다.
항목 | 설명 | 필수여부 |
Version | 인증서의 버전 (3.0) | 필수 |
SerialNumber | 인증서의 고유숫자 | 필수 |
Signature | 발급자 서명 | 필수 |
Issuer | 발급자 정보 (DN 형식) | 필수 |
Validator | 인증서의 유효기간, 시작/종료 날짜 | 필수 |
Subject | 주체의 정보 (DN 형식) | 필수 |
SubjectPublicKeyInfo | 주체의 공개키 | 필수 |
이전 버전과 3.0 의 차이는 Extension 이라는 섹션이 추가된 것입니다. Extension 은 여러 개의 항목으로 구성되어 있으며 필수적인 항목이 아니라 추가적인 항목을 넣고자 할 때 사용합니다.
항목 | 설명 | 필수여부 |
SubjectAtName | 주체의 다른 이름 (DN 형식 아님) | 필수/선택 |
PolicyMappings | 다른 정책과 연결할 수 있는 정책 정보 | 선택 |
NameConstraints | 선택 | |
PloicyConstraints | 인증서 경로의 제약 사항 | 선택 |
IssuerAtname | 발급자의 다른 이름 (DN 형식 아님) | 선택 |
AuthorityKeyIdentifier | 발급자의 키를 나타내는 키의 이름 | 선택 |
SubjectKeyIdentifier | 주체의 키를 나타내는 키의 이름 | 선택 |
BasicConstraints | 제약사항 | 필수/선택 |
CRLDistrubutionPoints | 인증서의 CRL 을 얻을 수 있는 곳 | 선택 |
KeyUsage | 인증서의 공개키가 사용되는 보안 서비스 종류 | 선택 |
DN 이란 Distinguished Name 의 약자입니다. 이 형식으로 인증서의 주체와 발급자의 정보 등이 들어갑니다. 다음을 참고하세요.
DN | 항목 | 설명 | 예 |
C | countryName | 국가코드 (2자리) | KR |
ST | stateOrProvinceName | 주 이름 (우리나라는 시 이름) | SEOUL |
L | localityName | 시 이름 (우리나라는 구 이름) | MAPO |
O | organizationName | 소속 기관명 | LG |
OU | organizationUnitName | 소속 부서명 | TWINS |
X.509 인증서의 형식은 ASN.1 즉 Abstract Syntax Notation One 이라는 명명규칙을 따릅니다. 이 ASN.1 규칙은 매우 복잡한데 마치 C언어를 연상케 합니다. 변수를 가지고 있고 구조체를 사용합니다. 인증서의 각 항목은 OID 라는 일련 번호로 나타낼 수 있고 데이터들은 ASN.1 타입의 데이터로 표현됩니다.
이 ASN.1 형식으로 되어 있는 X.509 인증서를 파일로 저장할 때 두가지 종류로 저장할 수 있습니다.
- PEM
- DER
이제까지 스터디한 내용은 여기까지입니다. 다음에 또 이어서 X.509 인증서에 대해서 적어보도록 하겠습니다.