Tệp Pem là gì và nó khác với các Định dạng tệp khóa được tạo bằng OpenSSL khác như thế nào?


1343

Tôi chịu trách nhiệm duy trì hai máy chủ Debian. Mỗi khi tôi phải làm bất cứ điều gì với chứng chỉ bảo mật, tôi sẽ Google hướng dẫn và đánh bại cho đến khi cuối cùng nó hoạt động.

Tuy nhiên, trong các tìm kiếm của tôi, tôi thường đi qua các định dạng tập tin khác nhau ( .key, .csr, .pem) nhưng tôi chưa bao giờ có thể tìm thấy một lời giải thích tốt về mục đích của mỗi định dạng tập tin là gì.

Tôi đã tự hỏi nếu những người tốt ở đây tại ServerFault có thể cung cấp một số làm rõ về vấn đề này?


Câu trả lời:


1655

SSL đã tồn tại đủ lâu, bạn nghĩ rằng sẽ có sự đồng ý về các định dạng chứa. Và bạn nói đúng, có. Quá nhiều tiêu chuẩn như nó xảy ra. Vì vậy, đây là những gì tôi biết, và tôi chắc chắn những người khác sẽ hòa nhập.

  • .csr - Đây là Yêu cầu Ký Chứng chỉ. Một số ứng dụng có thể tạo ra những thứ này để nộp cho cơ quan cấp chứng chỉ. Định dạng thực tế là PKCS10 được định nghĩa trong RFC 2986 . Nó bao gồm một số / tất cả các chi tiết chính của chứng chỉ được yêu cầu, chẳng hạn như chủ đề, tổ chức, trạng thái, không có gì, cũng như khóa chung của chứng chỉ để được ký. Chúng được ký bởi CA và một chứng chỉ được trả lại. Chứng chỉ được trả về là chứng chỉ chung (bao gồm khóa chung nhưng không phải khóa riêng), bản thân nó có thể có một vài định dạng.
  • .pem - Được xác định trong RFC 1421 đến 1424 , đây là định dạng chứa có thể chỉ bao gồm chứng chỉ chung (chẳng hạn như cài đặt Apache và tệp chứng chỉ CA /etc/ssl/certs) hoặc có thể bao gồm toàn bộ chuỗi chứng chỉ bao gồm khóa chung, khóa riêng và chứng chỉ gốc. Một cách khó hiểu, nó cũng có thể mã hóa CSR (ví dụ như được sử dụng ở đây ) vì định dạng PKCS10 có thể được dịch sang PEM. Tên này là từ Thư được tăng cường bảo mật (PEM) , một phương pháp không thành công cho email an toàn nhưng định dạng chứa nó được sử dụng và là bản dịch cơ bản64 của các khóa AS50.1 x509.
  • .key - Đây là tệp được định dạng PEM chỉ chứa khóa riêng của một chứng chỉ cụ thể và chỉ là một tên thông thường và không phải là một tiêu chuẩn. Trong các bản cài đặt Apache, cái này thường nằm trong /etc/ssl/private. Các quyền trên các tệp này rất quan trọng và một số chương trình sẽ từ chối tải các chứng chỉ này nếu chúng bị đặt sai.
  • .pkcs12 .pfx .p12 - Được xác định ban đầu bởi RSA trong Tiêu chuẩn mã hóa khóa công khai (viết tắt PKCS), biến thể "12" ban đầu được Microsoft cải tiến và sau đó được gửi dưới dạng RFC 7292 . Đây là định dạng chứa mật khẩu chứa cả cặp chứng chỉ chung và riêng. Không giống như các tệp .pem, thùng chứa này được mã hóa hoàn toàn. Openssl có thể biến tệp này thành tệp .pem có cả khóa chung và khóa riêng:openssl pkcs12 -in file-to-convert.p12 -out converted-file.pem -nodes

Một vài định dạng khác xuất hiện theo thời gian:

  • .der - Một cách để mã hóa cú pháp ASN.1 trong tệp nhị phân, tệp .pem chỉ là tệp .der được mã hóa Base64. OpenSSL có thể chuyển đổi chúng thành .pem ( openssl x509 -inform der -in to-convert.der -out converted.pem). Windows xem đây là các tệp Chứng chỉ. Theo mặc định, Windows sẽ xuất các chứng chỉ dưới dạng các tệp được định dạng .DER với một phần mở rộng khác nhau. Như...
  • .cert .cer .crt - Tệp được định dạng .pem (hoặc hiếm khi .der) có phần mở rộng khác nhau, một tệp được Windows Explorer công nhận là chứng chỉ, nhưng .pem thì không.
  • .p7b .keystore - Được xác định trong RFC 2315 là PKCS số 7, đây là định dạng được Windows sử dụng để trao đổi chứng chỉ. Java hiểu những điều này một cách tự nhiên và thường sử dụng .keystorenhư một phần mở rộng thay thế. Không giống như chứng chỉ kiểu .pem, định dạng này có một cách xác định để bao gồm chứng chỉ đường dẫn chứng nhận.
  • .crl - Một danh sách thu hồi chứng chỉ. Cơ quan cấp chứng chỉ sản xuất những thứ này như một cách để ủy quyền lại chứng chỉ trước khi hết hạn. Đôi khi bạn có thể tải chúng từ các trang web CA.

Tóm lại, có bốn cách khác nhau để trình bày chứng chỉ và các thành phần của chúng:

  • PEM - Được quản lý bởi RFC, phần mềm nguồn mở được sử dụng tốt hơn. Nó có thể có nhiều phần mở rộng (.pem, .key, .cer, .cert, v.v.)
  • PKCS7 - Một tiêu chuẩn mở được sử dụng bởi Java và được Windows hỗ trợ. Không chứa tài liệu khóa riêng.
  • PKCS12 - Một tiêu chuẩn riêng của Microsoft mà sau này được xác định trong RFC cung cấp bảo mật nâng cao so với định dạng PEM văn bản thuần túy. Điều này có thể chứa tài liệu khóa riêng. Nó được các hệ thống Windows ưu tiên sử dụng và có thể được chuyển đổi tự do sang định dạng PEM thông qua việc sử dụng openssl.
  • DER - Định dạng cha của PEM. Thật hữu ích khi nghĩ về nó như một phiên bản nhị phân của tệp PEM được mã hóa cơ sở64. Không được sử dụng thường xuyên bên ngoài Windows.

Tôi hi vọng cái này giúp được.


297
Điều tuyệt vời về các tiêu chuẩn là có rất nhiều lựa chọn ...
squillman

36
.crt là một phần mở rộng phổ biến khác cho .cert và .cer
David Pashley

44
PEM là một định dạng tệp có thể bao gồm một chứng chỉ (còn gọi là khóa chung), khóa riêng hoặc thực sự cả hai được nối với nhau. Đừng quá chú ý đến phần mở rộng tập tin; nó có nghĩa là Thư được tăng cường bảo mật, việc sử dụng nó không được sử dụng nhiều nhưng định dạng tệp bị kẹt.
Dan Carley

20
Câu trả lời rất hữu ích, nhưng tôi không nghĩ rằng bạn đã bao phủ định dạng .pub được tạo bởi ssh-keygen. Sẽ rất hữu ích khi biết làm thế nào mối quan hệ đó với phần còn lại.
Jez

24
Không thể không chú ý "Email tăng cường bảo mật" sẽ cung cấp từ viết tắt "PEE" trái ngược với "PEM". Các RFC có xu hướng sử dụng cụm từ "Thư được tăng cường bảo mật"
Aidan

141

PEM tự nó không phải là một chứng chỉ, nó chỉ là một cách mã hóa dữ liệu. Chứng chỉ X.509 là một loại dữ liệu thường được mã hóa bằng PEM.

PEM là chứng chỉ X.509 (có cấu trúc được xác định bằng ASN.1), được mã hóa bằng ASN.1 DER (quy tắc mã hóa phân biệt), sau đó chạy qua mã hóa Base64 và bị kẹt giữa các dòng neo văn bản đơn giản (BEGIN CERTIFICATE và END CERTIFICATE ).

Bạn có thể biểu diễn cùng một dữ liệu bằng cách sử dụng các biểu diễn PKCS # 7 hoặc PKCS # 12 và tiện ích dòng lệnh openssl có thể được sử dụng để thực hiện việc này.

Lợi ích rõ ràng của PEM là an toàn khi dán vào phần thân của email vì nó có các dòng neo và sạch 7 bit.

RFC1422 có nhiều chi tiết hơn về tiêu chuẩn PEM vì nó liên quan đến khóa và chứng chỉ.


1
Làm thế nào để bạn làm điều này "bằng cách sử dụng dòng lệnh openssl"?
Samik R

2
Để chuyển đổi tệp DER (.crt .cer .der) sang PEM : openssl x509 -inform der -in cert.cer -out cert.pem. Để chuyển đổi tệp PEM sang DER : openssl x509 -outform der -in cert.pem -out certi.der. Để chuyển đổi tệp PKCS # 12 (.pfx .p12) có chứa khóa riêng và chứng chỉ sang PEM : openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes. Để chuyển đổi tệp chứng chỉ PEM và khóa riêng sang PKCS # 12 (.pfx .p12): openssl pkcs12 -export -out cert.pfx -inkey privateKey.key -in cert.crt -certfile CACert.crtTừ đây
mpeac

54

Đôi khi một .crttập tin đã là một .pem. Xem: https://stackoverflow.com/questions/991758/openssl-pem-key


4
Quả thực là đúng, tôi chỉ nhận thấy điều này ngày hôm nay. Tôi đã phải nhập một chứng chỉ PEM trong loadbalancer rackspace và tôi đã tự hỏi nếu crt được tạo ra có định dạng đó. Nhưng nó hoạt động như vậy, vì vậy đó cũng là kết luận của tôi, hầu hết các .crt này đều có định dạng PEM.
Glenn Plas

@GlennPlas tập trung thay vì nội dung của tệp, không phải tên hoặc phần mở rộng của nó. Nó có thể được gọi .foobarcho tất cả những gì quan trọng ...
Patrick Mevzek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.