2011-03-18 90 views
38

我需要解析.PEM文件。
我知道「隱私增強電子郵件」的標準是在RFC 1421-24中定義的。但是他們似乎沒有提到我在OpenSSL.pem文件中找到的一些文本(例如「Key Attributes」,「BEGIN CERTIFICATE」等等)。 這是一個OpenSSL特定的格式嗎?指定PEM文件格式在哪裏?

+10

你是對的,它不是一個真正的標準。當SSLeay項目(後來成爲openssl項目)需要一種ASCII編碼方式來編碼各種公鑰和私鑰文件時,它們受到了您引用的PEM RFC的啓發,並因缺乏更好的名稱而將結果稱爲PEM文件。現在它引用幾乎所有base64編碼,並用BEGIN和END行包裝。 – 2011-03-19 01:31:58

+1

您的答案應作爲答案單獨發佈。 – 2011-03-21 15:27:14

+4

它在[RFC7468](http://tools.ietf.org/html/rfc7468)中定義。 – jariq 2015-04-18 07:41:23

回答

21

這通常是有益看現有的實現,看看他們做什麼。 OpenSSL/LibreSSL在crypto/pem/pem.h中定義了這些BEGIN和END標記。例如,目前的LibreSSL有以下幾種:

#define PEM_STRING_X509_OLD "X509 CERTIFICATE" 
#define PEM_STRING_X509  "CERTIFICATE" 
#define PEM_STRING_X509_PAIR "CERTIFICATE PAIR" 
#define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE" 
#define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST" 
#define PEM_STRING_X509_REQ "CERTIFICATE REQUEST" 
#define PEM_STRING_X509_CRL "X509 CRL" 
#define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY" 
#define PEM_STRING_PUBLIC "PUBLIC KEY" 
#define PEM_STRING_RSA  "RSA PRIVATE KEY" 
#define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY" 
#define PEM_STRING_DSA  "DSA PRIVATE KEY" 
#define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" 
#define PEM_STRING_PKCS7 "PKCS7" 
#define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA" 
#define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" 
#define PEM_STRING_PKCS8INF "PRIVATE KEY" 
#define PEM_STRING_DHPARAMS "DH PARAMETERS" 
#define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS" 
#define PEM_STRING_DSAPARAMS "DSA PARAMETERS" 
#define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY" 
#define PEM_STRING_ECPARAMETERS "EC PARAMETERS" 
#define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY" 
#define PEM_STRING_PARAMETERS "PARAMETERS" 
#define PEM_STRING_CMS  "CMS" 

據我所知,沒有BEGIN/END標記的主列表。它們在實現中根據需要定義得非常好。然後,如果您想與該實現進行交互操作,則可以將字符串添加到您自己的字符串中。

+0

謝謝!確實非常有幫助。這是我見過的最全面的名單.... – hopia 2011-03-18 23:25:59

2

我不確定它是否特定於OpenSSL,但PEM Encryption Format的文檔可能是您正在尋找的。

+1

謝謝,但我一直在尋找關於其他BEGIN-END語句正在使用的更全面的信息,例如「BEGIN CERTIFICATE」和「BEGIN PRIVATE KEY」。 – hopia 2011-03-18 17:16:57

+0

Fyi鏈接已關閉。 – 2017-03-29 07:25:17

13

爲了讓你開始:據我所知,如果有一部分是人類可讀的(包括文字和東西),這是爲了讓人類操作員知道有問題的證書是什麼,到期日期等等,對於快速手動驗證。所以你可以忽略這一點。

你會想要解析BEGIN-END塊之間的內容。

裏面,你會發現一個Base64編碼的實體,你需要Base64解碼成字節。這些字節表示DER編碼的證書/密鑰/等。我不確定你可以用什麼好的庫來分析DER數據。

作爲一個測試,瞭解什麼樣的數據每個塊內,你可以粘貼BEGIN-END塊之間有什麼這個網站,其中確實在JavaScript ASN.1解碼:

http://lapo.it/asn1js/

雖然我不會不會將任何生產環境私鑰粘貼到任何網站(儘管這似乎只是一個JavaScript)。

Base64編碼:http://en.wikipedia.org/wiki/Base64

DER:http://en.wikipedia.org/wiki/Distinguished_Encoding_Rules

ASN.1:http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One

+0

我可能會稍微誤解了問題的重點:) – 2011-03-18 17:44:33

+2

感謝您的回答。沒事兒。這個信息將有助於誰想要解析PEM文件。 – hopia 2011-03-18 23:32:43

8

我發現有關此問題的old thread。看起來封裝邊界沒有「官方」標準格式,並且確定這種格式的最佳方法是根據您在BEGIN聲明中找到的衆所周知的關鍵字猜測內容。

如個人回答,有關關鍵字的完整列表,請參閱OpenSSL crypto/pem/pem.h頭文件。

0

指定PEM文件格式在哪裏?

沒有一個地方。這取決於標準。你甚至可以製作自己的封裝邊界,並在你自己的軟件中使用它們。

正如@indiv所述,OpenSSL在<openssl dir>/crypto/pem/pem.h有一個相當全面的列表。

有人要求PKIX工作組提供一個列表,就像你在2006年要求的那樣。該工作組拒絕了。請參閱PEM file format rfc draft request

12

2015 2015更新的答案:由於用戶已經回答兩次,版主@royhowie刪除答案前:現在有RFC 7468 which defines the PEM headers。下面的引用只是一小部分,你應該閱讀實際的規範,這可能會停留在互聯網上的時間遠遠超過StackOverflow。

但@royhowie將每個答案都刪除爲「僅鏈接」,除非其中包含一些文本。因此,這裏是一些文本:

  • PKCS#10認證請求的文本編碼語法

    PKCS#10認證請求通過 「CERTIFICATE REQUEST」 標籤編碼。編碼數據必須是[RFC2986]中描述的BER(DER 強烈優選;參見附錄B)編碼的ASN.1 CertificationRequest結構。

  • ----- BEGIN CERTIFICATE REQUEST -----

    MIIBWDCCAQcCAQAwTjELMAkGA1UEBhMCU0UxJzAlBgNVBAoTHlNp​​bW9uIEpvc2Vm c3NvbiBEYXRha29uc3VsdCBBQjEWMBQGA1UEAxMNam9zZWZzc29uLm9yZzBOMBAG ByqGSM49AgEGBSuBBAAhAzoABLLPSkuXY0l66MbxVJ3Mot5FCFuqQfn6dTs + 9/CM EOlSwVej77tj56kj9R/j9Q + LfysX8FO9I5p3oGIwYAYJKoZIhvcNAQkOMVMwUTAY BgNVHREEETAPgg1qb3NlZnNzb24ub3JnMAwGA1UdEwEB/wQCMAAwDwYDVR0PAQH/ BAUDAwegADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDATAKBggqhkjOPQQDAgM/ADA8 AhxBvfhxPFfbBbsE1NoFmCUczOFApEuQVUw3ZP69AhwWXk3dgSUsK nuwL5g/ftAY dEQc8B8jAcnuOrfU

    ----- END CERTIFICATE REQUEST -----

    圖9:PKCS#10實施例

    標籤 「NEW CERTIFICATE REQUEST」 也廣泛使用。符合該文件的發電機 必須生成「CERTIFICATE REQUEST」 標籤。解析器可以將「新證書申請」視爲等同於 「證書請求」。^