본문 바로가기
전기차 개발자/임베디드시스템

자동차 ECU에서 *.pem 인증서(Root, Intermediate, Leaf)를 전송하기 위한 DER 인코딩 핵심 내용 요약

by 긍정왕수전노 2023. 12. 23.

안녕하세요.

요즘 업무를 하면서 자동차 ECU에도 인터넷에서나 사용하던 전자서명 인증서가 HSM에 추가되고 또 Authentication access가 활성화 되고 있구나를 톡톡히 느끼고 있습니다.

이런 인증서가 ECU의 Secure memory에 들어가게 되죠.

제가 스터디 하면서 헷갈렸던 부분과 중요한 부분 개인 참고용으로 기록해두려고 합니다.

Pem, Der 차이점

PEM은 Privacy Enhanced Mail의 줄임말로 Base64로 인코딩(일정한 규칙으로 치환)한 텍스트 형식의 파일을 의미합니다.

인터넷상으로 인증서를 전송할때 Binary (통상 ECU 통신에서 사용되는 방식의)로 전송할때 손상될 수 있으니 일부러 Text로 변환해서 전송하는 것이지요.

특이하게 보통 8bit씩 표현되는 ASCII코드를 6bit로 쪼개서 아래 Base64표의 값에서 문자로 바꿔서 PEM형식의 파일로 만드는 거죠.

6bit씩 쪼개다 끝에 남는 부분은 =로 표시한다고 합니다.

그리고 시작은 ----- BEGIN, 끝은 ----- END로 구분합니다.

Base 64에 따른 문자 치환표

 

반면에 DER이란?

Distinguished Encoding Rules의 줄임말로 PEM을 바이너리로 인코딩된 파일 입니다.

BER이 상위집합이고 여기 하위로 존재하는 것이 DER, CER입니다.

저는 여기서 DER에 집중하고 있습니다. 왜냐면 자동차용 MCU들이 DER을 주로 지원하기 때문이죠.

DER은 ASN.1 (Abstract Syntax Notation One)의 줄임말로 추상구문 표기법이라고도 합니다.

바이너리 데이터를 구조를 정의하는 문법인데요. 

PEM to Hex로 변경한 후 이걸 해석하는 것도 또하나의 미션입니다.

왜냐? 저처럼 자동차용 SW 개발자는 결국 CAN통신이든 이더넷이든 바이트 배열로 치환해서 쏴줘야 하기 때문이죠.

그런데 ECU에서 수신했을때 잘 해석을 해줘야 Signature verifying을 하든 Update를 하든 할테니까요.

https://gchq.github.io/CyberChef/#recipe=PEM_to_Hex()

 

CyberChef

 

gchq.github.io

 

ASN.1 문법 이해

ASN.1 문법을 알면 사전정보가 없어도 수신한 바이트 배열을 해석할 수 있습니다.

Chat GPT에게 ASN.1의 주요태그 (Hex로 변환 후 각 라인에서 시작하는 첫번째 바이트에 대한 정보)

  1. Universal Tags:
    • 0x01: BOOLEAN
    • 0x02: INTEGER
    • 0x03: BIT STRING
    • 0x04: OCTET STRING
    • 0x05: NULL
    • 0x06: OBJECT IDENTIFIER
    • 0x0C: UTF8String
    • 0x13: PrintableString
    • 0x14: T61String (Teletex String)
    • 0x16: IA5String (ASCII String)
    • 0x17: UTCTime
    • 0x18: GeneralizedTime
    • 0x30: SEQUENCE
    • 0x31: SET
  2. Context-Specific Tags:
    • 0xA0 to 0xBF: Context-specific constructed tags
    • 0x80 to 0x9F: Context-specific primitive tags
  3. Application Tags:
    • 0x40 to 0x5F: Application-specific constructed tags
    • 0x20 to 0x3F: Application-specific primitive tags
  4. Private Tags:
    • 0xC0 to 0xFF: Private constructed tags
    • 0x60 to 0x7F: Private primitive tags

이 태그에 해당하는 데이터의 길이는? TLV( Type-Length-Value)로 표현

 

예시

1) 30 82 01 7F 30 81 EA ~~ : 82 -> 뒤에 2 바이트 (0x017F)의 길이 만큼 데이터가 이 태그에 해당하는 데이터, 길이가 256 바이트 이상부터 사용

2) 30 81 A1 22 30 ~: 81 -> 뒤에 1바이트  (0xA1)의 길이 만큼 데이터가 이 태그에 해당하는 데이터

3) 30 0D 06 09 2A ~~ : 0x0D 만큼 데이터가 이 태그에 해당하는 데이터, 길이는 최대 127bit = 0x7F까지만 사용 가능

반응형