보안/인증서 / / 2025. 1. 21. 02:05

인증서와 ASN.1

1. ASN.1이란?

ASN.1 (Abstract Syntax Notation. 1)은 추상 구문 표기법이라고 부른다. 이는 데이터 구조를 정의하는 표준언어로, 다양한 시스템 간에 데이터를 교환 시 공통된 형식을 제공한다.

 

조금 더 풀어서 설명하자면, 컴퓨터 운영 체제들은 서로 다른 방식으로 데이터를 해석한다. Mac OS, Window, Linux는 각기 다른 Kernel을 사용하고, 이들 Kernel은 데이터를 해석하는 방식이 다르다는 의미이다. 이 때문에 같은 프로그램일지라도 다른 운영체제에서 사용하게 되면 프로그램 호환성에 차이가 발생할 수 있다. 하지만 ASN.1 구조는 어느 운영 체제를 사용하든 해석하는 방법이 동일하기 때문에 호환성에서 문제를 발생시키지 않는다.

 

예를 들면, Mac OS에서 생성된 데이터는 Window에서도 동일한 의미의 데이터로 해석된다. 따라서, ASN.1을 사용함으로써 서로 다른 시스템들이 데이터 구조를 정확히 이해하고 처리할 수 있게 된다.

 

복잡한 데이터 구조를 다양한 시스템 간에 표준화된 형식으로 표현할 수 있다는 장점 때문에 ASN.1은 많은 분야에서 사용된다.

 

  • 네트워크 분야
    • SNMP (Simple Network Management Protocol)
    • LDAP (Lightweight Directory Access Protocol)
    • X.500 Directory Service
  • 보안 분야
    • PKI (Public Key Infrastructure)
    • S/MIME (Secure/Multipurpose Internet Mail Extensions)
  • 금융 분야
    • ISO 20022
  • 기타 등등

 

위와 같은 이유로 인증 기관(CA, Certificate Authority)은 인증서 생성 시 ASN.1 문법을 사용함으로써 안정성과 신뢰성을 유지할 수 있는 기반이 된다. 

 

2. TLV 구조

ASN.1의 기본은 TLV 구조이다. TLV는 Type-Length-Value의 약자로 해당 구조로 데이터를 효율적으로 저장하고 전송하는 데 사용된다. TLV의 각 부분은 다음과 같이 동작한다.

 

  • Type : ASN.1으로 표현할 수 있는 데이터 유형이 다수 존재하는데, Type은 어떤 데이터 유형인지를 정의한다. 타입을 식별하기 위해 'Identifier Octet'을 사용한다.
  • Length : 실제 Value의 데이터 크기를 표시한다. type과 length 자체의 길이는 포함되지 않는다.
  • Value : 실제 전달하고자 하는 데이터

 

3. 간단 예시 : hello를 ASN.1으로 표현하기

예시를 들어 설명하는 것이 이해를 돕기 위한 최적의 방법인 것 같다. 'hello'라는 문자열을 ASN.1 문법을 사용하여 변환하는 과정을 보면 다음과 같다.

 

  1. 사람이 이해할 수 있는 ASN.1의 구조적 표현으로 적어보기
  2. TLV 중 Type을 구성하기 위한 방법 : Identifier Octet
  3. TLV 중 Length 계산하기
  4. TLV 중 Value를 문법에 맞게 적용
  5. 결과값 확인

 

위의 과정을 하나씩 살펴보면 다음과 같다.

 

3-1. ASN.1 구조적 표현

TLV의 결과값은 16진수로 표현되기 때문에 해당 값이 무엇을 표현하는지 한눈에 알아보기 어렵다. 하지만 ASN.1의 구조적 표현은 사람의 이해를 돕기 위한 작업이라고 생각하면 좋다.

 

< 'hello'의 ASN.1 구조적 표현 >

 

  • ① 변수명 : 일반적으로 변수명을 보고 데이터의 의미를 파악 가능
  • ② 데이터 타입 : 데이터의 형태가 어떤 식으로 구성되었는지 파악 가능
  • ③ 실제 할당된 값

 

3-2. TLV의 Type 구성하기 : Identifier Octet

< UTF8String을 표현하는 Identifier Octet >

 

  • ① UTF8String을 나타내는 8bit의 Identifier Octet을 위의 그림처럼 구성한다. : 00 00 11 00
  • 00 00 11 00 값을 16진수로 변환하여 0x0C 값 획득

 

3-3. TLV의 Length 값 계산

  • 'hello'라는 영문자 5글자는 5byte이므로 이를 16진수로 변환하여 0x05 값 획득

 

3-4. TLV의 Value를 문법에 맞게 적용

< 'hello'라는 value를 문법에 맞게 변환 >

 

  • 위와 같이 'hello'라는 영문자를 ASCII 코드에 대입하여 16진수로 획득 

 

3-5. 결과값 확인

지금까지 얻은 결과를 살펴보면 TLV는 다음과 같다.

< 'hello'의 TLV 형태 >

 

TLV 형태의 결과값을 실제 바이너리로 변환하면 다음과 같다. 해당 바이너리 값은 운영체제가 다른 시스템일지라도 UTF8String으로 표현된 'hello'로 해석된다.

0C 05 68 65 6C 6C 6F

 

결론적으로, ASN.1 문법으로 표현하기 위해서는 구조적 표현을 TLV 형태로 변환할 수 있어야 한다.

 

4. 심화 예시 : 인증서 유효기간을 ASN.1으로 표현하기

간단 예시와 동일한 순서대로 인증서 유효기간을 ASN.1으로 표현해 보자.

 

  • 유효기간 시작일 : 2024년 1월 1일 12시
  • 유효기간 종료일 : 2025년 1월 1일 12시
  • 시간은 UTCTime으로 설정한다.

 

4-1. ASN.1 구조적 표현

인증서의 유효기간의 ASN.1 구조적 표현은 다음과 같다.

Validity ::= SEQUENCE {
    notBefore     Time,
    notAfter      Time
}

Time ::= CHOICE {
    utcTime          UTCTime,
    generalizedTime  GeneralizedTime
}

 

해당 구조를 말로써 풀자면, 'Validity'라는 변수명을 가진 복합 구조(SEQUENCE)는 notBefore와 notAfter로 구성된다. 두 값은 UTCTime 혹은 GeneralizedTime으로 표현될 수 있다.

 

4-2. notBefore TLV의 Type 구성하기 : Identifier Octet

< UTCTime을 표현하는 Identifier Octet >

 

  • ① UTCTime을 나타내는 8bit의 Identifier Octet을 위의 그림처럼 구성한다. : 00 01 01 11
  •  00 01 01 11 값을 16진수로 변환하여 0x17 값 획득

 

4-3. notBefore TLV의 Length 계산

  • UTCTime은 'YYMMDDHHmmSSZ'의 형태로 고정되어 있으므로 13byte이다. 이를 16진수로 변환하여 0x0D 값 획득

 

4-4. notBefore TLV의 Value를 문법에 맞게 적용

< '240101120000Z'라는 value를 문법에 맞게 변환 >

 

  • 위와 같이 '240101120000Z'를 ASCII 코드에 대입하여 16진수로 획득

 

4-5. notAfter TLV의 Type, Length, Value 적용

notAfter도 notBefore와 동일한 방법으로 순서대로 구현한다.

 

  • Type : 0x17 (∵ notBefore와 동일)
  • Length : 0x0D (∵ notBefore와 동일)
  • Value : '250101120000Z'를 아래 그림과 같이 ASCII 코드에 대입하여 16진수로 획득

< '250101120000Z'라는 value를 문법에 맞게 변환 >

 

4-6. SEQUENCE 구조 : Type, Length 구성

< SEQUENCE를 표현하는 Identifier Octet >

 

  • Type : 위의 그림과 같이 8bit의 Identifier Octet 구성 후 16진수로 변환 : 0x30
  • Length : notBefore Value와 notAfter Value 길이의 합은 26Byte이므로 16진수로 변환 : 0x1A

 

4-7. 결과값 확인

지금까지 얻은 결과를 살펴보면 TLV는 다음과 같다.

< 예시로 든 인증서 유효기간의 TLV 형태 >

 

TLV 형태의 결과값을 실제 바이너리로 변환하면 다음과 같다. 해당 바이너리 값은 운영체제가 다른 시스템일지라도 복합 구조로 표현된 유효기간 시작일(2024년 1월 1일 12시)과 유효기간 종료일(2025년 1월 1일 12시)로 해석된다.

30 1A 17 0D 32 34 30 31 30 31 31 32 30 30 30 30 5A 17 0D 32 35 30 31 30 31 31 32 30 30 30 30 5A

 

5. 마무리

이번 글을 정리하면 다음과 같다.

 

  • ASN.1은 데이터 구조를 정의하는 언어이다.
  • ASN.1은 다양한 시스템 간에 복잡한 데이터를 교환 시 공통된 형식을 제공한다.
  • ASN.1은 인증서 외 다양한 분야에서 사용되며, 안전과 신뢰의 바탕이 된다.
  • ASN.1 문법의 기본은 TLV(Type-Length-Value) 구조이다.
  • ASN.1 문법을 사용함으로써 사람이 인식할 수 있는 구조적 표현을 TLV 형태로 변환하여 바이너리 값으로 생성할 수 있다.

 

 

'보안 > 인증서' 카테고리의 다른 글

인증 경로와 인증서 체인  (0) 2025.03.04
X.509 인증서 - 확장 필드  (0) 2025.02.17
X.509 인증서 - 기본 필드  (0) 2025.02.17
X.509 인증서 구조  (0) 2025.01.26
인증서란?  (0) 2025.01.20
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유