X.509

From IT Wiki
Revision as of 15:29, 16 August 2022 by 보안공부메모 (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
인증서 표기 공식 표준

X.509.png

X.509 인증서

구분 설명
버전 X.509 인증서 형식의 버전으로, 현재 v1-v3까지 있음
일련번호 CA에서 인증서를 발행할 때 마다 할당되는 유일한 번호
알고리즘 식별자 CA가 사용한 서명 알고리즘의 식별자
발행자 인증서를 발행한 CA의 이름
유효 개시 시간 인증서가 유효한 최초 시간
유효 만기 시간 인증서가 유효한 마지막 시간
주체 DN(Distinguished Name). 사람뿐만 아니라 서버도 해당
주체 공개키 암호용 또는 서명용 공개키, 키가 사용될 알고리즘의 종류, 키 길이 등 정보로 구성
알고리즘 공개키 알고리즘의 OID
공개키 주체의 공개키 값
서명값 CA의 서명 값

X.509 버전별 추가사항

  • 버전 2에서 추가된 영역
    • 인증 기관 고유 식별자 : 한 주체에 대해 둘 이상의 인증기관으로부터 인증서가 발급된 경우, 인증기관 구분
    • 주체 고유 식별자 : 주체를 식별하는 값, 예를 들어 같은 회사에 동명이인이 있는 경우 구분하기 위해 사용
  • 버전 3에서 추가된 영역
    • 확장 키 사용 : Key usage 항목으로 표시할 수 없는 세부적인 추가용도를 OID 형태로 표시. TLS 웹 서버 인증용, TLS 웹 클라이언트 인증용, 코드 서명용, 전자 우편용, IPSec 용 등을 지시
    • 인증기관 키 식별자 : 하나의 인증기관이 여러 개의 비밀키로 인증서를 발급한 경우, 서명 검증용 공개키를 식별하기 위해 사용. SHA-1해시 값인 KeyIdentifier, 발행기관 이름, 일련 번호로 구성
    • 주체 키 식별자 : 한 주체가 여러 키 쌍에 대해 발급받은 인증서를 가지고 있을 때, 인증서에 포함된 공개키를 구별하는데 사용
    • 키 용도 : 해당 공개키가 암호용인지 서명용인지를 해당 비트로 표시
    • 비밀키 사용기간 : 인증서의 유효기간과 서명용 비밀키의 사용시간이 다를 때 사용
    • CRL 배포 지점 : 폐기한 인증서의 리스트가 저장되어있는 곳의 URL
    • 주체 대체 이름 : DNS 이름, IP 주소, 메일 주소, 커버로스 이름 등 주체 이름에 대한 또 다른 이름
    • 발행자 대체 이름 : CA의 또 다른 이름
    • 기본 제한 : {CA 플래그, pathLenConstraint로 구성}
    • 기관 정보 액세스 : 인증기관이 제공하는 인증서 관련 서비스에 접근할 수 있는 URL이나 프로토콜 관련 정보
    • 주체 정보 액세스 : 인증서 주체가 제공할 수 있는 정보와 서비스에 접근하는 방법 제공, 주로 CA의 루트 인증서에 사용

키 종류 및 용도

  • digitalSignature : keyCertSign, cRLSign을 제외한 서명용도의 공개키
  • nonRepudiation : 부인방지를 위한 서명용 공개키
  • keyEncipherment : 공유 비밀키를 암호화할 때 사용하는 공개키
  • dataEncipherment : 데이터 암호용 공개키
  • keyAgreement : 키 분배 프로토콜에 사용할 공개키
  • keyCertSign : 루트 인증서의 서명용 공개키
  • CRLSign : CRL 서명용 공개키
  • encipheronly : keyAgreement 비트가 1일 때, 암호 전용 공개키 임을 지시
  • dncipheronly : keyAgreement 비트가 1일 때, 복호 전용 공개키 임을 지시

인증서 내용 예시

PEM 형태

인증서는 일반적으로 PEM 포맷으로 전달된다. 자세한 내용은 인증서 포맷 참고

-----BEGIN CERTIFICATE-----
MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG
EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy
NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB
f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr
Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43
rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc
eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==
-----END CERTIFICATE-----

Base64로 인코딩된 바이너리이며, 디코딩 및 파싱을 하면 아래와 같이 나온다. 디코더(예시)는 온라인에서 쉽게 찾을 수 있다.

파싱 결과

참고로 이 인증서는 AWS에서 발행한 루트 인증서이며, 일반적인 서버 인증서는 이것보다 내용이 많다. (확장 필드들을 더 많이 쓴다.)

800x800픽셀