Tiếng Việt

Công cụ dành cho nhà phát triển · Bộ mã hóa và giải mã Base64

PEM đã giải thích: tại sao chứng chỉ và khóa là Base64 giữa BEGIN và END

· Lý lịch

base64 mã hóa

PEM áo giáp: nhãn BEGIN và END và gói 64 cột Base64 của nhị phân DER
Hình minh họa vector ToolAcre gốc

Tệp PEM là tệp nhị phân DER được gói trong Base64 với các đường giáp được gắn nhãn. Bài đăng này giải thích nguồn gốc của định dạng, quy tắc dòng của nó cũng như những gì bạn có thể và không thể tìm hiểu bằng cách giải mã một định dạng.

Chứng chỉ 'trông giống như văn bản' nhưng không thể phân tích cú pháp — lỗi đánh máy ở tiêu đề, dấu xuống dòng và định dạng bên dưới

Tệp PEM là tệp nhị phân được mã hóa Base64 được gói trong nhãn văn bản. Tên này xuất phát từ Thư tăng cường quyền riêng tư (RFC 1421, 1992), sử dụng định dạng này cho thư được mã hóa. Định dạng này vẫn tồn tại cho đến ngày nay trong chứng chỉ TLS, khóa SSH và khóa GPG. Cấu trúc rất đơn giản: một dòng có nội dung -----BEGIN CERTIFICATE----- (hoặc BEGIN PRIVATE KEY, BEGIN PUBLIC KEY, v.v.), theo sau là các dòng 64 ký tự của văn bản base64, theo sau là -----END CERTIFICATE------.

Phần thân base64 giải mã thành định dạng nhị phân được gọi là DER (Quy tắc mã hóa phân biệt), đây là một cách để tuần tự hóa dữ liệu có cấu trúc (cụ thể là cấu trúc ASN.1). Giải mã base64 cung cấp cho bạn hệ nhị phân; việc đọc tệp nhị phân đòi hỏi phải hiểu ASN.1, điều này rất phức tạp. Lớp bảo vệ PEM tồn tại vì tệp nhị phân khó gửi qua email và chỉnh sửa. Tệp chứng chỉ ở dạng nhị phân thuần túy sẽ bị hỏng khi được chuyển qua hệ thống thư cũ, USENET hoặc biểu mẫu web.

Lớp giáp văn bản hiển thị trong khối PEM - nhãn xung quanh phần thân Base64

Bằng cách mã hóa base64 nhị phân và gói nó trong nhãn văn bản, toàn bộ chứng chỉ sẽ trở thành văn bản 7-bit ASCII tồn tại trong mọi quá trình truyền tải. Một trình soạn thảo văn bản có thể mở nó; một hệ thống thư sẽ không làm hỏng nó. Các dòng -----BEGIN và -----END là nhãn dành cho con người và các công cụ tự động; họ đánh dấu rõ ràng loại dữ liệu bên trong. Chứng chỉ được gắn nhãn CERTIFICATE; khóa riêng được gắn nhãn PRIVATE KEY.

Nhãn không được xác minh bằng phần mềm mật mã; nó chỉ là gợi ý cho con người và công cụ. Giới hạn dòng 64 ký tự trong PEM xuất phát từ RFC 1421 và lý do MIME tương tự như email base64: hệ thống thư cũ có giới hạn độ dài dòng và 64 ký tự phù hợp với thiết bị đầu cuối những năm 1980. PEM bao bọc đầu ra base64 ở 64 ký tự bằng một dòng kết thúc (CR LF trên Windows, LF trên Unix).

Từ văn bản được gắn nhãn đến byte được giải mã - kho lưu trữ này không thiết lập lịch sử định dạng

Khi giải mã chứng chỉ PEM, trình phân tích cú pháp phải loại bỏ các dòng giáp (------BEGIN..., -----END...) và ngắt dòng, sau đó giải mã base64 phần còn lại. Việc trả về đầu dòng bị lạc hoặc nhãn không khớp có thể làm hỏng quá trình phân tích cú pháp. Việc gói dòng không phải là một phần của tiêu chuẩn base64 (RFC 4648 base64 chưa được gói); nó dành riêng cho PEM. Bên trong base64 là mã nhị phân DER. DER là ASN.1 (Ký hiệu cú pháp trừu tượng), một đặc tả phức tạp để biểu diễn cấu trúc dữ liệu.

Chứng chỉ là một bản ghi có cấu trúc chứa tên chủ đề, khóa chung, chữ ký và siêu dữ liệu. ASN.1 không mô tả trực tiếp các byte; nó mô tả cách mã hóa cấu trúc.

Cấu trúc của khối làm đầu vào cho công cụ này - xóa nhãn và chỉ chuyển phần thân Base64

Quá trình mã hóa bắt đầu bằng bộ ba giá trị độ dài thẻ. Ví dụ: SEQUENCE trong ASN.1 được mã hóa dưới dạng thẻ 0x30, theo sau là độ dài của nội dung, tiếp theo là chính nội dung đó. Chứng chỉ luôn bắt đầu bằng byte 0x30 0x82 (trình tự, độ dài được mã hóa thành hai byte), xuất hiện dưới dạng MII trong base64.

Kiểm tra chứng chỉ mà không phân tích cú pháp: ba ký tự đầu tiên của nội dung chứng chỉ PEM hầu như luôn là MII (là 0x30 0x82 trong base64, phần đầu của SEQUENCE). Nếu khối PEM không giải mã thành 0x30 thì base64 bị hỏng hoặc nhãn sai. Công cụ mã hóa & giải mã Base64 có thể giải mã phần nội dung và hiển thị cho bạn mã hex: dán các dòng base64 (không có giáp -----BEGIN và END), xóa ngắt dòng và giải mã.

Giải mã nào cho thấy: byte nhị phân, trường chứng chỉ không được phân tích cú pháp

Nếu đầu ra là nhị phân bắt đầu bằng 30 82 thì đó có thể là cấu trúc chứng chỉ hợp lệ. Nếu đó là văn bản hoặc văn bản vô nghĩa thì việc giải mã không thành công hoặc base64 sai. Các lỗi PEM thường gặp: nhãn không khớp (ví dụ: nội dung chứng chỉ có nhãn PRIVATE KEY), sự cố kết thúc dòng của Windows (một số trình phân tích cú pháp bị nghẹt CRLF), lỗi đánh máy trong dòng giáp (thêm dấu cách hoặc ký tự) hoặc thiếu ngắt dòng.

Các công cụ mong đợi -----BEGIN CERTIFICATE---- không phải -----BEGIN CERT----- hoặc BEGIN CERTIFICATE. Sao chép-dán PEM từ trình duyệt web hoặc PDF có thể đưa ra dấu ngoặc kép Unicode hoặc dấu ngoặc kép thông minh thay vì dấu ngoặc kép ASCII, phá vỡ nhãn. Dán khóa riêng vào trường chứng chỉ là một lỗi phổ biến; trình phân tích cú pháp sẽ từ chối nó vì nhãn không khớp. PEM hỗ trợ nhiều khối trong một tệp.

Ví dụ đã hoạt động: giải mã phần nội dung ngắn và kiểm tra byte mà không xác nhận chữ ký chứng chỉ

Tệp khóa SSH có thể chứa cả khóa riêng tư (được gắn nhãn PRIVATE KEY) và khóa chung (được gắn nhãn PUBLIC KEY) hoặc nhiều khối chứng chỉ. Trình phân tích cú pháp sẽ đọc tệp từ trên cùng, tìm kiếm các dòng bắt đầu bằng -----BEGIN. Khi tìm thấy, nó sẽ đọc cho đến khi -----END có nhãn phù hợp, trích xuất và giải mã base64 nội dung rồi xử lý nội dung đó. Sau đó nó tiếp tục tìm kiếm khối tiếp theo.

Chuỗi chứng chỉ được nối ngẫu nhiên (nhiều khối PEM cho chứng chỉ và các khối trung gian của nó) trong một tệp sẽ hợp lệ nếu tất cả các nhãn đều chính xác. Định dạng PEM đã được chuẩn hóa cho Thư tăng cường quyền riêng tư (RFC 1421) vào đầu những năm 1990.

Điều này không bao gồm những gì — phân tích cú pháp cấu trúc ASN.1, mã hóa khóa riêng tư và các gói PKCS#12

RFC 7468 (2015) đã hiện đại hóa định nghĩa, làm rõ các quy tắc về độ dài đường, định dạng đường giáp và các trường hợp cạnh. Hiện tại, hầu hết các công cụ và tiêu chuẩn đều tham chiếu RFC 7468. Hiện có các định dạng nhị phân thành văn bản khác (như DER-to-hex đối với một số giao thức), nhưng PEM với nhãn base64 và ASCII là tiêu chuẩn thực tế cho mật mã và TLS vì nó là văn bản thuần túy, dễ đọc và dễ sao chép hoặc gửi.

Xây dựng khối PEM: lấy mã nhị phân DER (ví dụ: chứng chỉ từ thư viện mật mã), mã hóa thành base64, gói kết quả ở 64 ký tự bằng dấu ngắt dòng và bao quanh nó bằng các dòng -----BEGIN CERTIFICATE----- và -----END CERTIFICATE-----. Phân tích cú pháp khối PEM: tìm các dòng -----BEGIN và -----END, trích xuất phần thân base64 (loại bỏ lớp giáp và ngắt dòng), giải mã base64 để lấy mã nhị phân, sau đó phân tích mã nhị phân DER và ASN.1.

Bài học rút ra: PEM là Base64 có nhãn — cách bộ mã hóa và giải mã Base64 cung cấp cho bạn một địa điểm cục bộ để thử phần thân Base64 của khối, hoàn toàn trong trình duyệt

Hầu hết các công cụ đều tự động hóa việc này; bạn hiếm khi xây dựng PEM bằng tay. Nhưng việc hiểu cấu trúc này rất hữu ích khi gỡ lỗi phân tích cú pháp hoặc khi xác minh chứng chỉ theo cách thủ công. Chứng chỉ PEM trông giống như văn bản nhưng nội dung là dữ liệu nhị phân. Đọc nhãn bắt đầu và kết thúc không cho bạn biết chứng chỉ chứa gì; bạn phải giải mã base64 và phân tích cú pháp ASN.1 để xem tên chủ đề, khóa chung, nhà phát hành và ngày hết hạn.

Công cụ mã hóa & giải mã Base64 có thể giải mã nội dung để bạn có thể kiểm tra một vài byte đầu tiên. Để phân tích cú pháp đầy đủ, bạn cần có trình phân tích cú pháp ASN.1 (hầu hết các ngôn ngữ lập trình đều có thư viện cho việc này). Thông tin chi tiết quan trọng là PEM là định dạng vùng chứa: nó chứa mọi dữ liệu được mã hóa DER chứ không chỉ các chứng chỉ. Nhãn cho bạn biết mục đích sử dụng nhưng trình phân tích cú pháp phải xử lý loại dữ liệu một cách chính xác.