본문 바로가기

Applied Cryptography

X.509 인증서 (+ Yessign 공인인증서 Sample)

참고자료

인증서 Spec.

Tool.

인증서 구조

인증서는 Certificate 구조체 형식으로 저장되며 다음과 같이 3개의 Field로 구성되어 있다.

변수명 구조 및 설명
tbsCertificate # 인증서 본문
version
serialNumber

signature
issuer
validity
subject
subjectPublicKeyInfo
extensions
signatureAlgorithm # CA 전자서명 알고리즘의 OID
OID: 1.2.840.113549.1.1.11 sha256WithRSAEncryption
signatureValue # CA 전자서명 값
BIT STRING(2048): 000111101100101011000011000...

 

위의 "tbsCertificate" 구조체는 다음과 같이 구성되어 있다.

tbsCertificate  
 - version [0]
  INTEGER 2
# 인증서 버전; enum [0/*Ver1*/, 1/*Ver2*/, 2/*Ver3*/]
- serialNumber INTEGER 630453119
# CA가 부여한 인증서 고유 번호. (up to 20 octets.)
- signature SEQUENCE (2 elem)
  OID 1.2.840.113549.1.1.11 sha256WithRSAEncryption (PKCS #1)
  NULL
# CA서명 알고리즘 명세. 반드시 Certificate.signatureAlgorithm과 동일해야함.
- issuer SEQUENCE (4 elem)
  SET (1 elem)
    SEQUENCE (2 elem)
      OID 2.5.4.6 countryName (X.520 DN component)
      PrintableString kr
  SET (1 elem)
    SEQUENCE (2 elem)
      OID 2.5.4.10 organizationName (X.520 DN component)
      UTF8String yessign
  SET (1 elem)
    SEQUENCE (2 elem)
      OID 2.5.4.11 organizationUnitName (X.520 DN component)
      UTF8String AccreditedCA
  SET (1 elem)
    SEQUENCE (2 elem)
      OID 2.5.4.11 organizationUnitName
      UTF8String yessignCA Class 2
# Issuer 정보. Name Type(계층 구조로 정보들을 표기함)
- validity SEQUENCE (2 elem) 
  UTCTIME 2019-08-22 15:00:00 UTC
  UTCTIME 2020-08-23 14:59:59 UTC
# 인증서 유효기간

- subject SEQUENCE (5 elem)
  SET (1 elem)
    SEQUENCE (2 elem)
      OID 2.5.4.6 countryName (X.520 DN component)
      PrintableString kr
  SET (1 elem)
    SEQUENCE (2 elem)
      OID 2.5.4.10 organizationName (X.520 DN component)
      UTF8String yessign
  SET (1elem)
    SEQUENCE (2 elem)
      OID 2.5.4.11 organizationUnitName (X.520 DN component)
      UTF8String personal4IB
  SET (1 elem)
    SEQUENCE (2 elem)
      OID 2.5.4.11 organizationUnitName (X.520 DN component)
      UTF8String IBK
  SET (1 elem)
    SEQUENCE (2 elem)
      OID 2.5.4.3 commonName (X.520 DN component)
      UTF8String 암호기술() 0003042201708021317028
# 인증서 주체(나)의 정보, Name Type
- subjectPublicKeyInfo SEQUENCE (2 elem)
  SEQUENCE (2 elem)
    OID 1.2.840.113549.1.1.1 rasEncryption (PKCS #1)
    NULL # parameter optional
  BIT STRING (1 elem)
    SEQUENCE (2 elem)
      INTEGER (2048 bit) 217980554665627473914143376567264798378222509425590233...
      INTEGER 65537
# 인증서 주체의 공개키 정보
- extensions SEQUENCE Of Extentions..

Certificate의 "tbsCertificate"의 extensions는 다음과 같이 구성되어 있다.

Extention  
- AuthorityKeyIdentifier SEQUENCE (2 elem)
  OID 2.5.29.35 authorityKeyIdentifier (X.509 extension)
  OCTET STRING (1 elem)
    SEQUENCE (3 elem)
      [0] (20 byte) EFDC44D2C68DC00EA338C07C93C6C341BF4A8FF0
      [1] # GeneralNames
        [4]
          SEQUENCE (4 elem)
            SET (1 elem)
              SEQUENCE (2 elem)
                OID 2.5.4.6 countryName (X.520 DN component)
                PrintableString KR
            SET (1 elem)
              SEQUENCE (2 elem)
                OID 2.5.4.10 organizationName (X.520 DN component)
                PrintableString KISA
            SET (1 elem)
              SEQUENCE (2 elem)
                OID 2.5.4.11 organizationUnitName (X.520 DN component)
                PrintableString Korea Certification Authority Central
            SET (1 elem)
              SEQUENCE (2 elem)
              OID 2.5.4.3 commonName (X.520 DN component)
              UTF8String KISA RootCA 4
      [2] (2 byte) 101C
# CA의 인증서를 확인하는 방법을 제공함.(RootCA 명세)
# CA 키가 여러개일때 사용함. CA의 KeyID 또는 Name/Serial#로 확인함
- SubjectKeyIdentifier SEQUENCE (2 elem)
  OID 2.5.29.14 subjectKeyIdentifier (X.509 extension)
  OCTET STRING (1 elem)
    OCTET STRING (20 byte) EBD654E797DCE66D9FC9B8260D3FB56C735C1055
# 인증서 주체의 공개키 ID, 공인인증서의 경우 공개키의 Hash 값
- KeyUsage SEQUENCE (3 elem)
  OID 2.5.29.15
  BOOLEAN true
  OCTET STRING (1 elem)
    BIT STRING (2 bit) 11
    #
11 --> 0000 0011: 8개의 Flag로 해석한다.
    # 0번쨰, 1번째 Flag가 서 있으므로 키 용도는 digitalSignature(0), nonRepudiation(1)을 의미한다.
- cetificatePolicies SEQUENCE (3 elem)
  OID 2.5.29.32 cetificatePolicies (X.509 extension)
  BOOLEAN true
  OCTET STRING (1 elem)
    SEQUENCE (1 elem)
      SEQUENCE (2 elem)
        OID 1.2.410.200005.1.1.4 certificatePolicies (X.509 extension)
        SEQUENCE (2 elem)
          SEQUENCE (2 elem)
            OID 1.3.6.1.5.5.7.2.2 unotice (PKIX policy qualifier)
            SEQUENCE (1 elem)
              BMPString 이 인증서는 공인인증서 입니다
          SEQUENCE (2 elem)
            OID 1.3.6.1.5.5.7.2.1 cps (PKIX policy qualifier)
            IA5String http://www.yessign.or.kr/cps.htm
# 인증서 관리 정책 명세, CPS url로 접속하면 관리정책 문서를 확인 가능
- SubjectAltName SEQUENCE (2 elem)
  OID 1.2.410.200004.10.1.1 npkiIdentifyData (KISA NPKI attribute)
  [0] (1 elem)
    SEQUENCE (2 elem)
      UTF8String 암호기술
      SEQUENCE (1 elem)
        SEQUENCE (2 elem)
          OID 1.2.410.200004.10.1.1.1 npkiVID (KISA NPKI attribute)
         
SEQUENCE(2 elem)
            SEQUENCE (1 elem)
            OID 2.16.840.1.101.3.4.2.1 sha-256 (NIST Algorithm)
          [0] (1 elem)
            OCTET STRING (32 byte) 46F7E720376BA8CCA53B95C753550469C1AD1CC0...
# 인증서 주체의 대체 이름, 공인인증서의 경우 본인확인 용도로 사용됨
- CRLDistributionPoints SEQUENCE (2 elem)
  OID 2.5.29.31 cRLDistributionPoints (X.509 extension)
  OCTET STRING (1 elem)
    SEQUENCE (1 elem)
      SEQUENCE (1 elem)
        [0] (1 elem)
          [0] (1 elem)
            [6] ldap://ds.yessign.or.kr:389/ou=dp5p49236,ou=AccreditedCA,o=yessign,c=kr?certific...
# CRL을 획득할 수 있는 주소를 기제함
# 공인인증서의 경우 인증서를 조회할 수 있는 ldap 주소를 기제함
- AuthorityInfoAccess
SEQUENCE( 2 elem)
  OID 1.3.6.1.5.5.7.1.1 authorityInfoAccess (PKIX private extension)
  OCTET STRING (1 elem)
    SEQUENCE (1 elem)
      SEQUENCE (2 elem)
        OID 1.3.6.1.5.5.7.48.1 ocsp (PKIX)
        [6] http://ocsp.yessign.org:4612
# Issuer가 제공하는 정보와 서비스 접속방법을 기제함
# 공인인증서의 경우 online-validation service인 ocsp(online certificate status protocol) 주소를 기제함

 

위 샘플은 필자가 가지고 있는 Yessign 공인인증서의 예제이다. 공인인증서는 공개 값이므로 포스트에 그대로 적어도 무관하다. 다만 표에 기제하기에는 다소 긴 데이터를 마음대로 생략했으므로 Validation은 실패할 것이다. 

 

 

'Applied Cryptography' 카테고리의 다른 글

ECDSA with Bouncycastle Lib.  (0) 2020.07.20
Blind Signature based RSA  (0) 2020.07.07
투표와 전자투표  (0) 2020.06.19
Shamir's Secret Sharing과 Lagrange Interpolation  (0) 2020.06.19
전자 서명 알고리즘  (0) 2020.06.19