개발자 도구 · Base64 인코더 및 디코더
PEM 설명: 인증서와 키가 BEGIN과 END 사이에 Base64인 이유
· 배경
베이스64 인코딩
PEM 파일은 레이블이 지정된 armor 라인이 있는 Base64로 래핑된 DER 바이너리입니다. 이 게시물에서는 형식의 기원, 라인 규칙, 디코딩을 통해 배울 수 있는 것과 배울 수 없는 것에 대해 설명합니다.
'텍스트처럼 보이지만' 구문 분석에 실패한 인증서 — 헤더 오타, 잘못된 캐리지 리턴 및 아래 형식
PEM 파일은 텍스트 레이블로 묶인 Base64로 인코딩된 바이너리입니다. 이름은 암호화된 메시지에 이 형식을 사용하는 Privacy-Enhanced Mail(RFC 1421, 1992)에서 유래되었습니다. 이 형식은 오늘날 TLS 인증서, SSH 키 및 GPG 키에서 유지됩니다. 구조는 간단합니다. -----BEGIN CERTIFICATE-----(또는 BEGIN PRIVATE KEY, BEGIN PUBLIC KEY 등)을 말하는 줄, 그 뒤에 base64 텍스트의 64자 줄, -----END CERTIFICATE-----가 옵니다.
base64 본문은 구조화된 데이터(구체적으로 ASN.1 구조)를 직렬화하는 방법인 DER(Distinguished Encoding Rules)이라는 이진 형식으로 디코딩됩니다. base64를 디코딩하면 바이너리가 제공됩니다. 바이너리를 읽으려면 복잡한 ASN.1을 이해해야 합니다. PEM 아머는 바이너리 파일을 이메일로 보내거나 편집하기 어렵기 때문에 존재합니다. 순수 바이너리 형식의 인증서 파일은 이전 메일 시스템, USENET 또는 웹 양식을 통해 전달될 때 손상될 수 있습니다.
PEM 블록에 표시되는 텍스트 갑옷 — Base64 본문 주위의 레이블
바이너리를 base64로 인코딩하고 텍스트 레이블로 래핑하면 전체 인증서가 어떤 전송에서도 유지되는 7비트 ASCII 텍스트가 됩니다. 텍스트 편집기로 열 수 있습니다. 메일 시스템은 이를 손상시키지 않습니다. -----BEGIN 및 -----END 줄은 사람과 자동화된 도구에 대한 레이블입니다. 내부에 어떤 종류의 데이터가 있는지 명확하게 표시합니다. 인증서에는 CERTIFICATE라는 라벨이 붙어 있습니다. 개인 키에는 PRIVATE KEY라는 라벨이 붙어 있습니다.
레이블은 암호화 소프트웨어로 확인되지 않습니다. 그것은 단지 인간과 도구에 대한 힌트일 뿐입니다. PEM의 64 문자 줄 제한은 RFC 1421 및 이메일 base64와 동일한 MIME 추론에서 비롯됩니다. 이전 메일 시스템에는 줄 길이 제한이 있었고 64 문자는 1980년대 터미널에 적합합니다. PEM은 64 문자에서 base64 출력을 줄 끝(Windows의 경우 CR LF, Unix의 경우 LF)으로 래핑합니다.
레이블이 지정된 텍스트에서 디코딩된 바이트까지 — 이 저장소는 형식 기록을 설정하지 않습니다.
PEM 인증서를 디코딩할 때 파서는 armor 줄(------BEGIN..., -----END...)을 제거하고 줄을 끊은 다음 나머지 부분을 base64로 디코딩해야 합니다. 잘못된 캐리지 리턴이나 일치하지 않는 레이블로 인해 구문 분석이 중단될 수 있습니다. 줄 바꿈은 base64 표준의 일부가 아닙니다(RFC 4648 base64는 래핑 해제됨). it is specific to PEM. base64 내부에는 DER로 인코딩된 바이너리가 있습니다. DER은 데이터 구조를 표현하기 위한 복잡한 사양인 ASN.1(추상 구문 표기법)입니다.
인증서는 주체 이름, 공개 키, 서명 및 메타데이터를 포함하는 구조화된 레코드입니다. ASN.1은 바이트를 직접 설명하지 않습니다. 구조를 인코딩하는 방법을 설명합니다.
이 도구에 대한 입력으로서의 블록 분석 — 레이블을 제거하고 Base64 본문만 전달
인코딩은 태그-길이-값 삼중항으로 시작됩니다. 예를 들어, ASN.1의 SEQUENCE는 태그 0x30으로 인코딩되고 그 뒤에 콘텐츠 길이, 콘텐츠 자체가 옵니다. 인증서는 항상 0x30 0x82 바이트(시퀀스, 2바이트로 인코딩된 길이)로 시작하며, 이는 base64에서 MII로 나타납니다.
구문 분석 없이 인증서 확인: PEM 인증서 본문의 처음 세 문자는 거의 항상 MII입니다(base64에서는 0x30 0x82, SEQUENCE의 시작). PEM 블록이 0x30으로 디코딩되지 않으면 base64가 손상되었거나 레이블이 잘못된 것입니다. Base64 인코더 및 디코더 도구는 본문을 디코딩하고 16진수를 표시할 수 있습니다. Base64 라인을 붙여넣고(----BEGIN 및 END 아머 없이) 줄 바꿈을 제거하고 디코딩합니다.
디코딩 노출: 바이너리 바이트, 구문 분석된 인증서 필드 아님
출력이 30 82로 시작하는 바이너리인 경우 유효한 인증서 구조일 가능성이 높습니다. 횡설수설하거나 텍스트라면 디코딩이 실패했거나 base64가 잘못된 것입니다. 일반적인 PEM 오류: 레이블 불일치(예: PRIVATE KEY 레이블이 있는 인증서 본문), Windows 줄 끝 문제(일부 파서가 CRLF에서 질식함), armor 줄의 오타(추가 공백 또는 문자) 또는 줄 바꿈 누락.
도구는 -----BEGIN CERTIFICATE----- -----BEGIN CERT----- 또는 BEGIN CERTIFICATE가 아닌 것으로 예상합니다. 웹 브라우저 또는 PDF에서 PEM을 복사하여 붙여넣으면 ASCII 따옴표 대신 유니코드 따옴표나 스마트 따옴표가 삽입되어 레이블이 깨질 수 있습니다. 개인 키를 인증서 필드에 붙여넣는 것은 흔한 실수입니다. 레이블이 일치하지 않기 때문에 파서는 이를 거부합니다. PEM은 하나의 파일에서 여러 블록을 지원합니다.
작업된 예: 짧은 본문을 디코딩하고 인증서 서명을 주장하지 않고 바이트를 검사합니다.
SSH 키 파일에는 개인 키(PRIVATE KEY로 표시됨)와 공개 키(PUBLIC KEY로 표시됨)가 모두 포함되거나 여러 인증서 블록이 포함될 수 있습니다. 파서는 맨 위에서 파일을 읽고 -----BEGIN으로 시작하는 줄을 찾습니다. 하나를 찾으면 일치하는 레이블이 있는 -----END까지 읽고 본문을 추출하고 base64로 디코딩한 후 처리합니다. 그런 다음 계속해서 다음 블록을 찾습니다.
한 파일에 실수로 연결된 인증서 체인(인증서 및 그 중간체에 대한 여러 PEM 블록)은 모든 레이블이 올바른 경우 유효합니다. PEM 형식은 1990년대 초에 Privacy-Enhanced Mail(RFC 1421)에 대해 표준화되었습니다.
여기에 포함되지 않는 내용 — ASN.1 구조 구문 분석, 개인 키 암호화 및 PKCS#12 번들
RFC 7468(2015)는 정의를 현대화하여 줄 길이 규칙, 갑옷 줄 형식 및 엣지 케이스를 명확하게 했습니다. 이제 대부분의 도구와 표준은 RFC 7468를 참조합니다. 다른 바이너리-텍스트 형식(예: 일부 프로토콜의 DER-to-hex)이 존재하지만 base64 및 ASCII 레이블이 있는 PEM은 사람이 읽을 수 있고 일반 텍스트이며 복사 또는 전송이 쉽기 때문에 사실상 암호화 및 TLS의 표준입니다.
PEM 블록 구축: DER 바이너리(예: 암호화 라이브러리의 인증서)를 가져와서 base64로 인코딩하고 결과를 64 문자로 줄바꿈한 다음 -----BEGIN CERTIFICATE----- 및 -----END CERTIFICATE------ 라인으로 묶습니다. PEM 블록 구문 분석: -----BEGIN 및 -----END 행을 찾고, base64 본문을 추출하고(아머 및 줄바꿈 제거), base64 디코딩하여 바이너리를 가져온 다음 DER 및 ASN.1 바이너리를 구문 분석합니다.
요약: PEM은 레이블이 있는 Base64입니다. Base64 인코더 및 디코더가 브라우저에서 블록의 Base64 본체를 시도할 수 있는 로컬 위치를 제공하는 방법
대부분의 도구는 이를 자동화합니다. PEM을 직접 구성하는 경우는 거의 없습니다. 그러나 구조를 이해하면 구문 분석 오류를 디버깅하거나 인증서를 수동으로 확인할 때 유용합니다. PEM 인증서는 텍스트처럼 보이지만 내용은 이진 데이터입니다. 시작 및 끝 레이블을 읽어도 인증서에 포함된 내용은 알 수 없습니다. 주체 이름, 공개 키, 발급자 및 만료를 보려면 base64를 디코딩하고 ASN.1을 구문 분석해야 합니다.
Base64 인코더 및 디코더 도구는 본문을 디코딩하여 처음 몇 바이트를 검사할 수 있습니다. 전체 구문 분석을 위해서는 ASN.1 구문 분석기가 필요합니다(대부분의 프로그래밍 언어에는 이를 위한 라이브러리가 있습니다). 핵심 통찰력은 PEM이 컨테이너 형식이라는 것입니다. 즉, 인증서뿐만 아니라 DER로 인코딩된 모든 데이터를 보유합니다. 레이블은 의도된 용도를 알려주지만 파서는 데이터 유형을 올바르게 처리해야 합니다.