2015-02-17 10 views
7

मैं पर .pem फ़ाइल (base64 एनकोडेड क्रिप्टोग्राफी जानकारी) है। क्या ओपनएसएसएल कमांड लाइन का उपयोग यह पता लगाने के लिए किया जाना चाहिए कि इसमें सार्वजनिक कुंजी या निजी कुंजी है या नहीं?मुझे कैसे पता चलेगा कि .pem फ़ाइल में सार्वजनिक या निजी कुंजी है या नहीं?

रूप this StackOverflow question में बताया गया है, पर .pem दोनों हो सकते हैं।

चूंकि फ़ाइल की सामग्री किसी अन्य मशीन पर .pem प्रमाणपत्र भेजते समय बस गड़बड़ कर रही है, मैं यह सुनिश्चित करना चाहता हूं कि मैं सार्वजनिक कुंजी निर्यात कर रहा हूं और अपनी निजी कुंजी नहीं दे रहा हूं।

उत्तर

1

मैं पर .pem फ़ाइल (base64 एनकोडेड क्रिप्टोग्राफी जानकारी) है। क्या ओपनएसएसएल कमांड लाइन का उपयोग यह पता लगाने के लिए किया जाना चाहिए कि इसमें सार्वजनिक कुंजी या निजी कुंजी है या नहीं?

सामान्य रूप से, आपको यह निर्धारित करने के लिए पीईएम फ़ाइल की पहली पंक्ति का निरीक्षण करना होगा।

OpenSSL (एक बेहतर शब्द की कमी के लिए) उपलब्ध एन्कोडेड चीजों के एक सबसेट का पता लगा सकते। आप <openssl src>/crypto/pem/pem.h की जांच करके ओपनएसएसएल डीकोड कर सकते हैं की सूची देख सकते हैं। फ़ाइल से:

#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" 

कुछ चीजें दूसरों की तुलना में अधिक कठिन होंगी। उदाहरण के लिए, अपनी स्पष्ट क्या एक RSA PUBLIC KEY है, लेकिन इसके इतना स्पष्ट नहीं एक PUBLIC KEY है क्या। इस मामले में, आप दो चीजों में से एक करते हैं। सबसे पहले, आप ASN.1/DER चीज़ को डीकोड करते हैं और फिर उपलब्ध होने पर इसके ओआईडी को देखते हैं। दूसरा, आप डेटा संरचना में कोशिश करते हैं और लोड करते हैं जिसे आप उम्मीद करते हैं।

दूसरी रणनीति का एक उदाहरण के रूप में, आप PEM_read_bio_RSAPrivateKey के साथ एक RSA निजी कुंजी में एक पीईएम ब्लॉब लोड करने का प्रयास करेंगे। यदि यह सफल होता है, तो यह एक आरएसए निजी कुंजी है। इसके विफल रहता है, तो यह एक क्षतिग्रस्त RSA निजी कुंजी हो सकता है, या यह एक चुनाव आयोग निजी कुंजी हो सकता है, या यह एक पीईएम ब्लॉब नहीं हो सकता।


2006 में, पीकेक्स कार्यकारी समूह के साथ चीजों के नाम मानकीकृत करने के लिए एक अनुरोध किया गया था। यह आईईटीएफ के भीतर बधिर कानों पर गिर गया। PEM file format rfc draft request देखें। (? सब): इससे पहले कि यह बाहर चला जाता है

(file $KEYFILE | grep -i private >/dev/null) && echo Private || echo Public-or-unknown 

कुछ महत्वपूर्ण सामग्री स्क्रीन करने के लिए:

2

एक व्यावहारिक सन्निकटन है कि ज्यादातर पकड़ने चाहिए के रूप में मानव गलतियों मैं सिर्फ file और grep सिफारिश करेंगे

for f in *; do (file $f | grep -i private >/dev/null) && file $f; done 

खाली आउटपुट = उम्मीद है कि कोई रहस्य नहीं, आगे बढ़ सकता है।

संबंधित मुद्दे