Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

X.509

암호학에서 X.509는 공개 키 인증방식의 형식을 정의하는 표준이다. X.509 인증서는 웹 브라우징에서 널리 사용하고 있는 HTTPS의 기초가 되는 TLS/SSL을 포함한 많은 인터넷 프로토콜에서 사용하고 있다. 전자서명 같은 오프라인 응용프로그램에서도 사용한다. X.509 인증서에는 공개 키 및 (조직 혹은 개인의) ID가 포함된다. 인증서는 공인된 외부 인증기관에서 서명하거나 혹은 자체 서명 할 수 있다. 인증서를 보유한 사람은 인증서에 포함된 공개 키를 사용해서 다른 당사자와의 보안 통신을 설정하거나 해당 개인 키로 디지털 서명된 문서의 유효성을 검사 할 수 있다.

X.509는 ITU-T(International Telecommunications Union's Standardization)가 관리하고 있으며 또다른 ITU-T 표준인 ASN.1을 기반으로 하고 있다.

히스토리

X.509는 X.500 표준과 관련하여 시작했으며 1988년 7월 3일 처음 발행됐다. X.509는 CA규약에 따라서 서로 구별되는 공개키를 가지는 인증서를 발행 할 수 있다. CA는 Certificate authority or certification authority로 인증서를 발행하는 역할을 한다. CA를 가지는 이러한 모델은 PGP와 같은 Web of trust와 대조적이다. PGP는 CA뿐만 아니라 다른 사람들이 서명에 참여해서 다른 사람의 인증서의 유효성을 입증 할 수 있다. X.509 버전 3에는 bridges와 meshes와 같은 다른 토폴로지를 지원할 수 있어서 좀 더 유연하게 사용 할 수 있다. X.509는 OpenPGP와 같은 web of trust에도 사용 할 수 있지만 2004년 이후로는 거의 사용하지 않고 있다.

Certificates

X.509 시스템에서 서명된 인증서를 원하는 조직은 CSR를 이용해서 인증서를 요청한다. CSR은 Certificate Signing Request(인증서 서명 요청)으로 인증서 발급을 위한 필요한 정보를 담고 있는 인증서 신청형식 데이터다. CSR에는 개인키 생성단계에서 만들어진 개인키(Private Key)와 공개키(Public Key)의 키쌍 중에서 공개키가 포함되며, 인증서가 적용되는 도메인에 대한 정보가 포함된다.

openssl을 이용해서 인증서를 만들어보기로 했다.

먼저 개인키를 만든다.
# openssl genrsa -des3 2048 > ssl.key
Generating RSA private key, 2048 bit long modulus (2 primes)
..................+++++
.......+++++
e is 65537 (0x010001)
Enter pass phrase:
Verifying - Enter pass phrase:

개인키 ssl.key를 이용해서 csr을 만든다. csr을 발급하기 위해서 발급에 사용할 개인키와 발급자의 정보들이 들어간다.
# openssl req -new -key ssl.key > ssl.csr
Enter pass phrase for ssl.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:kr
State or Province Name (full name) [Some-State]:seoul
Locality Name (eg, city) []:gang-nam
Organization Name (eg, company) [Internet Widgits Pty Ltd]:joinc
Organizational Unit Name (eg, section) []:Development division
Common Name (e.g. server FQDN or YOUR name) []:www.joinc.co.kr
Email Address []:yundream@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

만들어진 csr 파일을 보자.
cat ssl.csr 
-----BEGIN CERTIFICATE REQUEST-----
MIIC4jCCAcoCAQAwgZwxCzAJBgNVBAYTAmtyMQ4wDAYDVQQIDAVzZW91bDERMA8G
A1UEBwwIZ2FuZy1uYW0xDjAMBgNVBAoMBWpvaW5jMR0wGwYDVQQLDBREZXZlbG9w
bWVudCBkaXZpc2lvbjEYMBYGA1UEAwwPd3d3LmpvaW5jLmNvLmtyMSEwHwYJKoZI
hvcNAQkBFhJ5dW5kcmVhbUBnbWFpbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQDhtiJ4yHKK7QceIc8eMV7VGMz/CPrhu22tnGiq2/WLXlmm4PNO
kxj43NyPJkmDDAGGf0oSpKFkoc7bwnx0XgEBjglQGOe9MLaPmzYbLM6BPBWlJQrj
CdTeigkIsI5DhYvpM0jIFf32COPdJkFlJhMtbEYhZannlnAMmNuZ+VC/ZwUMMmDv
SoMXJ55psT0LEKgyEvgCdd573xrTwsEtejgO9aeJddL2JnXa9rgTwJwjyGWv+D1v
ETCroMzY8jC/BhW4g37RrIVEiL8RCiNZd40o+bz9+j4c6oP9mMDbI8DHs8DVXuVb
eMOzB0i0cBiVi38WeLI4psBgNC12vwGPlqOZAgMBAAGgADANBgkqhkiG9w0BAQsF
AAOCAQEAQCB2ZxVJTfcpiHvtRZUtHnBgHDdn8mlhjAMx5vZXMzxQnAtskLkKLRx1
r3C6TMtNNCEM+pV1jO6zKLTc7d2PI6iFZh+GV+Fzhm9+dCnYTdOetQG2TAmkrPfF
0Uk45NbE+Ix0RLzsanywgXNnYkb3Tcq2NpsMneodluLmiFG+sXegNkBKyGgrEcNn
CxCFwrkGiUCGt9rHIhVVrDma2XC3Mlj2TPEGtANsaFqvXEH+5VcIA0O882K8R4i+
8gptXWjx8S4nKAqKLqEXpfUK+IAXBBcy/u1tI7z21O3dqrUO07ugJ+kAEgSBp7f/
oZHprXCt9X+0jBqc1KfiaWBs484YQw==
-----END CERTIFICATE REQUEST-----

openssl을 이용해서 csr의 내용을 확인 할 수 있다.
# openssl req -in ssl.csr -noout -text
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C = kr, ST = seoul, L = gang-nam, O = joinc, OU = Development division, CN = www.joinc.co.kr, emailAddress = yundream@gmail.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:e1:b6:22:78:c8:72:8a:ed:07:1e:21:cf:1e:31:
                    5e:d5:18:cc:ff:08:fa:e1:bb:6d:ad:9c:68:aa:db:
                    f5:8b:5e:59:a6:e0:f3:4e:93:18:f8:dc:dc:8f:26:
                    49:83:0c:01:86:7f:4a:12:a4:a1:64:a1:ce:db:c2:
                    7c:74:5e:01:01:8e:09:50:18:e7:bd:30:b6:8f:9b:
                    36:1b:2c:ce:81:3c:15:a5:25:0a:e3:09:d4:de:8a:
                    09:08:b0:8e:43:85:8b:e9:33:48:c8:15:fd:f6:08:
                    e3:dd:26:41:65:26:13:2d:6c:46:21:65:a9:e7:96:
                    70:0c:98:db:99:f9:50:bf:67:05:0c:32:60:ef:4a:
                    83:17:27:9e:69:b1:3d:0b:10:a8:32:12:f8:02:75:
                    de:7b:df:1a:d3:c2:c1:2d:7a:38:0e:f5:a7:89:75:
                    d2:f6:26:75:da:f6:b8:13:c0:9c:23:c8:65:af:f8:
                    3d:6f:11:30:ab:a0:cc:d8:f2:30:bf:06:15:b8:83:
                    7e:d1:ac:85:44:88:bf:11:0a:23:59:77:8d:28:f9:
                    bc:fd:fa:3e:1c:ea:83:fd:98:c0:db:23:c0:c7:b3:
                    c0:d5:5e:e5:5b:78:c3:b3:07:48:b4:70:18:95:8b:
                    7f:16:78:b2:38:a6:c0:60:34:2d:76:bf:01:8f:96:
                    a3:99
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         40:20:76:67:15:49:4d:f7:29:88:7b:ed:45:95:2d:1e:70:60:
         1c:37:67:f2:69:61:8c:03:31:e6:f6:57:33:3c:50:9c:0b:6c:
         90:b9:0a:2d:1c:75:af:70:ba:4c:cb:4d:34:21:0c:fa:95:75:
         8c:ee:b3:28:b4:dc:ed:dd:8f:23:a8:85:66:1f:86:57:e1:73:
         86:6f:7e:74:29:d8:4d:d3:9e:b5:01:b6:4c:09:a4:ac:f7:c5:
         d1:49:38:e4:d6:c4:f8:8c:74:44:bc:ec:6a:7c:b0:81:73:67:
         62:46:f7:4d:ca:b6:36:9b:0c:9d:ea:1d:96:e2:e6:88:51:be:
         b1:77:a0:36:40:4a:c8:68:2b:11:c3:67:0b:10:85:c2:b9:06:
         89:40:86:b7:da:c7:22:15:55:ac:39:9a:d9:70:b7:32:58:f6:
         4c:f1:06:b4:03:6c:68:5a:af:5c:41:fe:e5:57:08:03:43:bc:
         f3:62:bc:47:88:be:f2:0a:6d:5d:68:f1:f1:2e:27:28:0a:8a:
         2e:a1:17:a5:f5:0a:f8:80:17:04:17:32:fe:ed:6d:23:bc:f6:
         d4:ed:dd:aa:b5:0e:d3:bb:a0:27:e9:00:12:04:81:a7:b7:ff:
         a1:91:e9:ad:70:ad:f5:7f:b4:8c:1a:9c:d4:a7:e2:69:60:6c:
         e3:ce:18:43

csr로부터 public key를 export 해보자.
# openssl req -in ssl.csr -noout -pubkey -out publickey.pem

인증 기관(Certification authority)는 공개키(public key)를 특정 고유 이름에 바인딩하는 인증서를 발급 할 수 있다.

인증서 구조

인증서는 ASN.1형식을 따라서 구조화된다. X.509 v3 digital certificate 구조는 아래와 같다.
  • Certificate
    • Verion Number
    • Serial Number
  • Signature Algorithm ID
  • Issuer Name
  • Validaty period : Not Before, Not After
  • Subject name
  • Subject Public Key Info : Public Key Algorithm, Subject Public Key
  • Extensions (optional)
  • Certificate Signature Algorithm
  • Certificate Signature
Extensions는 버전 3에 추가됐다. CA는 extensions를 이용해서 디지털 서명과 같은 특정한 목적에 사용 할 수 있다. Serial number는 모든 CA에대해서 유일해야 한다.

Certificate filename 확장자

X.509에서 사용하는 파일들은 고유의 확장자를 가지고 있다. 불행하게도 이러한 확장자들 중 몇 개는 private key와 같은 다른 데이터를 저장하는 목적으로 사용하고 있다.
  • .pem(Privacy-enhanced Electroonic Mail) : DER 인증서의 Base64 인코딩 값으로 "---BEGIN CERTIFICATE-"과 "-END CERTIFICATE---"사이에 위치한다.
  • .cer, .crt, .der : 일반적으로 바이너리 DER 형식을 가지지만 Base64 인코딩된 인증서도 사용한다.
  • .p7b, .p7c : certificate만 가지고 있는 파일
  • .p12 : 하나 이상의 certificate, public, private keys를 포함하고 있는 아카이브파일
  • .pfx : p12의 전신

Certificate chains

인증서 체인(Certification chain)은 RFC 5280에 대략적인 개념이 정리돼 있다. 이 체인에는 하나 이상의 CA 인증서와 인증서의 목록을 가지고 있다. 이들 특성은 아래와 같다.

인증서 체인을 구성하는 인증서는 CA에서 보증을 하는데, Root CAIntermediate CA로 구성이 된다. Root CA는 최상의 인증기관이며 Intermediate CA는 중간 계층의 인증 기관이다. 특정 인증 시스템은 여러 조직으로 구성될 수 있기 때문에 아래와 같이 Root CA를 정점으로 하는 디렉토리 구성이 만들어진다.

 Cerificate chains

X.509 CA 인증서의 소유자는 마지막 중간(Intermediate) CA가 디바이스에 서명해서 프로세스를 종료시키기 전까지 다른 중간 CA를 둬서 차례로 서명 할 수 있다. 결과적으로 계층적으로 구성된 인증서 체인이 만들어진다. 서명을 위임하는 구조인데, 테일러조직(부-과-팀 으로 구성된)에서 각 단계의 장들이 자신의 권한으로 서명하는 것을 생각하면 된다.에서 각 단계의 장들이 자신의 권한으로 서명하는 것을 생각하면 된다.에서 각 단계의 장들이 자신의 권한으로 서명하는 것을 생각하면 된다.에서 각 단계의 장들이 자신의 권한으로 서명하는 것을 생각하면 된다. 최상위 CA를 Root CA라고 부른다.

Cross certification

교차 인증은 신뢰를 확장하기 위해서 사용한다. CA1과 CA2를 모두 신뢰하고 둘 다 인증서에 서명한 경우 신뢰하는 두 개의 인증기관이 인증서에 서명했기 때문에 높은 수준의 신뢰를 얻을 수 있다. 아래와 같은 장점이 있다. CA1과 CA2를 신뢰하는 클라이언트가 필요하다고 했을 때, 한쪽만 서명하는 것으로 둘 다 신뢰 할 수 있다. 클라이언트는 서로 다른 CA에 대해서 별도의 인증서를 배포하지 않고도 신뢰를 확인 할 수 있다.

 Cross-certification

참고