我需要解析.PEM文件。
我知道「隱私增強電子郵件」的標準是在RFC 1421-24中定義的。但是他們似乎沒有提到我在OpenSSL.pem文件中找到的一些文本(例如「Key Attributes」,「BEGIN CERTIFICATE」等等)。 這是一個OpenSSL特定的格式嗎?指定PEM文件格式在哪裏?
回答
這通常是有益看現有的實現,看看他們做什麼。 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標記的主列表。它們在實現中根據需要定義得非常好。然後,如果您想與該實現進行交互操作,則可以將字符串添加到您自己的字符串中。
謝謝!確實非常有幫助。這是我見過的最全面的名單.... – hopia 2011-03-18 23:25:59
我不確定它是否特定於OpenSSL,但PEM Encryption Format的文檔可能是您正在尋找的。
謝謝,但我一直在尋找關於其他BEGIN-END語句正在使用的更全面的信息,例如「BEGIN CERTIFICATE」和「BEGIN PRIVATE KEY」。 – hopia 2011-03-18 17:16:57
Fyi鏈接已關閉。 – 2017-03-29 07:25:17
爲了讓你開始:據我所知,如果有一部分是人類可讀的(包括文字和東西),這是爲了讓人類操作員知道有問題的證書是什麼,到期日期等等,對於快速手動驗證。所以你可以忽略這一點。
你會想要解析BEGIN-END塊之間的內容。
裏面,你會發現一個Base64編碼的實體,你需要Base64解碼成字節。這些字節表示DER編碼的證書/密鑰/等。我不確定你可以用什麼好的庫來分析DER數據。
作爲一個測試,瞭解什麼樣的數據每個塊內,你可以粘貼BEGIN-END塊之間有什麼這個網站,其中確實在JavaScript ASN.1解碼:
雖然我不會不會將任何生產環境私鑰粘貼到任何網站(儘管這似乎只是一個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
我可能會稍微誤解了問題的重點:) – 2011-03-18 17:44:33
感謝您的回答。沒事兒。這個信息將有助於誰想要解析PEM文件。 – hopia 2011-03-18 23:32:43
我發現有關此問題的old thread。看起來封裝邊界沒有「官方」標準格式,並且確定這種格式的最佳方法是根據您在BEGIN
聲明中找到的衆所周知的關鍵字猜測內容。
如個人回答,有關關鍵字的完整列表,請參閱OpenSSL crypto/pem/pem.h頭文件。
指定PEM文件格式在哪裏?
沒有一個地方。這取決於標準。你甚至可以製作自己的封裝邊界,並在你自己的軟件中使用它們。
正如@indiv所述,OpenSSL在<openssl dir>/crypto/pem/pem.h
有一個相當全面的列表。
有人要求PKIX工作組提供一個列表,就像你在2006年要求的那樣。該工作組拒絕了。請參閱PEM file format rfc draft request。
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 -----
MIIBWDCCAQcCAQAwTjELMAkGA1UEBhMCU0UxJzAlBgNVBAoTHlNpbW9uIEpvc2Vm 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」 標籤。解析器可以將「新證書申請」視爲等同於 「證書請求」。^
- 1. EC2上我的pem密鑰文件在哪裏?
- 2. 我應該在哪裏放置ApnsPHP的.pem文件?
- 3. WHM將SSL的.pem文件放在哪裏?
- 4. SAS在哪裏指定input @?
- 5. Facebook cookie格式的文檔在哪裏?
- 6. scanf在哪裏離開文件指針?
- 7. 我在哪裏可以獲得.doc文件格式的文檔
- 8. 我在哪裏把HTML格式的動作文件在mvc
- 9. UICollectionView自定義FlowLayout在哪裏指定
- 10. Android NDK - 在哪裏放置LOCAL_SHARED_LIBRARIES中指定的.so文件?
- 11. 指定N目錄在哪裏查找輸入文件
- 12. 我可以在哪裏指定clj文件中的warn-on-reflection?
- 13. 如何指定git在哪裏查找其配置文件?
- 14. PHP JQuery:在哪裏指定uploadify目標文件夾
- 15. 我在哪裏可以指定DLL的輸出文件夾?
- 16. 構造函數以類文件格式存儲在哪裏
- 17. 我在哪裏可以找到GNU ar文件格式規範?
- 18. 記錄文件`.bzr.log`的格式在哪裏?
- 19. 在WiX中,指定的ProductCode在哪裏?
- 20. 這裏定義的樣式在哪裏?
- 21. 自定義nanorc文件在哪裏?
- 22. GWT Guava gwt.xml定義文件在哪裏?
- 23. 如何指定鐺格式文件?
- 24. 指定TypeScript輸出文件名格式
- 25. 我在哪裏指定MVC 4
- 26. 實現IHierarchyData時在哪裏指定URL
- 27. 我在哪裏指定nhibernate cofiguartion
- 28. Flask,指定的static_folder在哪裏?
- 29. AngularJS依賴注入在哪裏指定?
- 30. 您在哪裏指定泛型類型?
你是對的,它不是一個真正的標準。當SSLeay項目(後來成爲openssl項目)需要一種ASCII編碼方式來編碼各種公鑰和私鑰文件時,它們受到了您引用的PEM RFC的啓發,並因缺乏更好的名稱而將結果稱爲PEM文件。現在它引用幾乎所有base64編碼,並用BEGIN和END行包裝。 – 2011-03-19 01:31:58
您的答案應作爲答案單獨發佈。 – 2011-03-21 15:27:14
它在[RFC7468](http://tools.ietf.org/html/rfc7468)中定義。 – jariq 2015-04-18 07:41:23