2012-02-04 11 views
17

मैं अपने स्थानीय मशीन के प्रमाणपत्र स्टोर में प्रोग्रामेटिक रूप से X509 प्रमाणपत्र (पीएफएक्स/पीकेसीएस # 12) आयात करने की कोशिश कर रहा हूं।सर्टिफिकेट स्टोर में प्रमाणपत्रों की एक श्रृंखला के साथ प्रोग्रामेटिक रूप से एक पीएफएक्स कैसे आयात करें?

  • रूट प्रमाणपत्र CA
    • संगठन प्रमाण पत्र सीए
      • संगठन 2 प्रमाण पत्र सीए
        • मेरे प्रमाण पत्र
        • : यह विशेष रूप से प्रमाण पत्र प्रमाण पत्र की एक श्रृंखला है, प्रमाणीकरण पथ कुछ इस तरह दिखता

कोड का उपयोग मैं इस तरह दिखता है:

cert = new X509Certificate2(pathToCert, password); 

if (cert != null) 
{ 
    var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
    store.Open(OpenFlags.ReadWrite); 
    if (!store.Certificates.Contains(cert)) 
    { 
     store.Add(cert); 
    } 
} 

इस कोड को प्रमाणपत्र आयात करता है, लेकिन यह श्रृंखला की अनदेखी करने लगती है। अगर मैं दुकान में प्रमाण पत्र की जांच, प्रमाणीकरण पथ केवल पता चलता है:

  • मेरे प्रमाण पत्र

हालांकि जब मैं pfx मैन्युअल आयात करते हैं तो पूरा पथ दिखाने करता है। क्या मैं यहां एक कदम छोड़ रहा हूं, या क्या मुझे कुछ पैरामीटर याद आ रहा है? क्या कोई इस पर कुछ प्रकाश डाला सकता है?

+0

एक पीएफएक्स आम तौर पर पीकेसीएस # 12 के साथ भ्रमित होता है, आपके मामले में आप केवल एक प्रमाणपत्र श्रृंखला चाहते हैं, जिसे आप आसानी से पीईएम फाइलों के साथ कर सकते हैं। लेकिन .. क्या आपकी अपनी निजी कुंजी फाइल है? इस मामले में आप पीकेसीएस # 12 – IanNorton

+0

@IanNorton चाहते हैं: यह वास्तव में एक पीकेसीएस # 12 प्रमाण पत्र है। ऐसा नहीं है कि इसमें कोई विकल्प है। –

+0

किस मामले में, आप इसे [pkcs # 12] के बारे में पढ़ना चाहते हैं [http://stackoverflow.com/questions/555184/decode-a-pkcs12-file) आपके पास एक पी 12 फ़ाइल है जिसमें x509 ऑब्जेक्ट्स हैं। – IanNorton

उत्तर

11

आप पीएफएक्स फ़ाइल को X509Certificate2Collection ऑब्जेक्ट के रूप में खोलकर अपने पीएफएक्स (और प्रत्येक को अपनी पसंद के प्रमाण स्टोर में आयात करें) में कर्टों को फिर से चलाने में सक्षम होना चाहिए।

यहाँ X509Certificate2Collection पर डॉक्स हैं:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2collection.aspx

MSDN कैसे संग्रह में प्रत्येक प्रमाणपत्र का निरीक्षण करने पर कि डॉक्स पेज में कुछ नमूना कोड प्रदान करता है।

एक बार जब आप सीएन/जारीकर्ता/प्रत्येक प्रमाण के बारे में अन्य जानकारी जानते हैं तो यह स्पष्ट होना चाहिए कि प्रत्येक प्रमाणपत्र स्टोर को किसके लिए जोड़ा जाना चाहिए।

http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509store.aspx

http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.storename.aspx

भी एक ऐसी ही तो सवाल करने के लिए मेरा उत्तर देखें:: कि के लिए आप जो स्टोर आप/जोड़ने के लिए खोलना चाहते हैं निर्दिष्ट करने के लिए X509Store वर्ग और StoreName गणन उपयोग कर सकते हैं

How to retrieve certificates from a pfx file with c#?

है कि इसका जवाब पर ताजा टिप्पणियों में से एक में उल्लेख किया है, जब आप वर्तमान उपयोगकर्ता के रूट की दुकान में एक प्रमाणपत्र आयात करने का प्रयास ("StoreName.Ro ओटी "और" StoreLocation.CurrentUser "नाम/स्थान के रूप में) आपको एक पॉपअप संवाद मिलेगा जो आपको पुष्टि करने के लिए कहता है।

हल करने के लिए मैंने प्रॉम्प्ट पर ठीक क्लिक करने के लिए बस मेरे प्रमाण आयात विधि में थोड़ा एमएस यूआई ऑटोमेशन कोड जोड़ा।

या, जैसा कि टिप्पणीकर्ता "कोडवायरियर" अन्य एसओ उत्तर की टिप्पणी में कहता है, पॉपअप संवाद से बचने के लिए आप रूटयू प्रमाणपत्र को CurrentUser के बजाय स्थानीयमाचिन स्टोर में डालने का प्रयास कर सकते हैं।

नमूना कोड:

string certPath = <YOUR PFX FILE PATH>; 
string certPass = <YOUR PASSWORD>; 

// Create a collection object and populate it using the PFX file 
X509Certificate2Collection collection = new X509Certificate2Collection(); 
collection.Import(certPath, certPass, X509KeyStorageFlags.PersistKeySet); 

foreach (X509Certificate2 cert in collection) 
{ 
    Console.WriteLine("Subject is: '{0}'", cert.Subject); 
    Console.WriteLine("Issuer is: '{0}'", cert.Issuer); 

    // Import the certificate into an X509Store object 
} 
+1

संग्रह में आयात करने के बाद, यह मेरे मामले में काम नहीं करता है, केवल एक प्रमाणपत्र (मेरा प्रमाणपत्र) है। मुझे लगता है कि आप कुछ पर हैं। –

+0

मुझे एक ही समस्या थी (जहां पीएफएक्स फ़ाइल को X509Certificate2 ऑब्जेक्ट के रूप में खोलना परिणामस्वरूप केवल पत्ता/उपयोगकर्ता प्रमाण आयात किया जा रहा था)। तो एक्स 50 9 प्रमाणपत्र 2 स्पष्ट रूप से तब तक काम नहीं करता जब तक कि आपको केवल पत्ती प्रमाण की आवश्यकता न हो। P50X को X509Certificate2Collection के रूप में खोलना ठीक था - जब आप ऐसा करते हैं और संग्रह की लंबाई की जांच करते हैं (या लूप में संग्रह में प्रत्येक प्रमाणपत्र के विषय/जारीकर्ता को मुद्रित करते हैं) क्या आप श्रृंखला में सभी कर्ट देखते हैं? –

+0

अंत में मुझे कहीं और मिल रहा है। मैंने अपने प्रमाण पत्र से एक नया निर्यात किया और अब ऐसा लगता है कि यह आपके कोड के साथ काम कर रहा है। यह अब सभी प्रमाण पत्र दिखाता है, रूट प्रमाण पत्र से बाहर ... कोई विचार? –

0

एक एक्स.50 9 प्रमाणपत्र में केवल एक श्रृंखला है जो इसे मूल प्रमाणपत्र (मध्यवर्ती प्राधिकरण समेत) से जोड़ती है, लेकिन ये प्रमाण पत्र प्रमाणपत्र में शामिल नहीं हैं। इस श्रृंखला का उपयोग तब किया जाता है जब एक अंतिम प्रमाणपत्र (जो स्वयं हस्ताक्षरित नहीं है) मान्य है - इसे एक रूट प्रमाणपत्र का नेतृत्व करना चाहिए जो विश्वसनीय है। प्रत्येक सीए की सार्वजनिक कुंजी को एक जारी प्रमाण पत्र के लिए हैश को डीकोड और सत्यापित करने के लिए उपयोग किया जाता है। रूट प्रक्रिया तक पहुंचने तक यह प्रक्रिया दोहराई जाती है। पूरी श्रृंखला की जांच के बाद, यदि रूट प्रमाणपत्र विश्वसनीय है तो अंतिम प्रमाणपत्र भी विश्वसनीय है। बेशक प्रक्रिया में अन्य सत्यापन भी शामिल हैं (जैसे प्रारंभ तिथि, समाप्ति तिथि, उदाहरण के लिए प्रमाणपत्र निरस्तीकरण सूची), लेकिन मैंने केवल श्रृंखला के उपयोग से संबंधित हिस्सा विस्तृत किया है।

तो आपने चेन के साथ "मेरा प्रमाणपत्र" सही ढंग से "रूट प्रमाणपत्र सीए" में आयात किया है - यह श्रृंखला "मेरा प्रमाणपत्र" में एन्कोड किया गया है और आप इसकी गुण देखकर इसकी पुष्टि कर सकते हैं, लेकिन यह श्रृंखला केवल एक लिंक है और इसमें "रूट प्रमाणपत्र सीए", "संगठन प्रमाण पत्र सीए" और "संगठन 2 प्रमाण पत्र सीए" प्रमाण पत्र शामिल नहीं हैं।

मुझे आशा है कि यह आपकी समस्या हल करे, लेकिन यदि ऐसा नहीं होता है, तो क्या आप इसे पूरा करने की कोशिश कर रहे हैं के बारे में अधिक विशिष्ट हो सकते हैं?

+0

प्रमाण पत्र पर सिद्धांत के लिए धन्यवाद। बात यह है कि, मैं आयात के दौरान श्रृंखला की जानकारी खो रहा हूं और मैं इसे अपने कोड में हल करने की कोशिश कर रहा हूं। –

5

भविष्य में संदर्भ के लिए, मैं ऐसा करने का एक और तरीका है की खोज की, X509Chain वस्तु का उपयोग कर:

var cert = new X509Certificate2(pathToCert, password); 

X509Chain chain = new X509Chain(); 
chain.Build(cert); 
for (int i = 0; i < chain.ChainElements.Count; i++) 
{ 
    //add to the appropriate store 
} 
+0

यह एक सामान्य समाधान बनाने के लिए आप "उचित स्टोर में" कोड साझा कर सकते हैं? –

0

जो कोई कोड जेनेरिक "उचित दुकान में" चाहता है के लिए समाधान

यह वही है जो मैंने वीबी का उपयोग करके बनाया है, इसलिए सी # को बंदरगाह के लिए मुश्किल नहीं होना चाहिए। मैंने उपरोक्त पदों का उपयोग शुरू करने के लिए किया था और मैं इस पर कुल नोओबी हूं।

Dim certPath = "C:\Users\08353153\Documents\Visual Studio 2015\Projects\WindowsApplication2\WindowsApplication2\bin\Debug\8870-thebigchess.pfx" 
    Dim certPass = "eduSTAR.NET" 
    Dim Collection As New X509Certificate2Collection 
    Collection.Import(certPath, certPass, X509KeyStorageFlags.PersistKeySet) 

    Dim certOne As X509Certificate2 = Collection(0) 
    Dim certTwo As X509Certificate2 = Collection(2) 
    Dim certThree As X509Certificate2 = Collection(1) 

    Dim personal As New X509Store(StoreName.My, StoreLocation.LocalMachine) 
    personal.Open(OpenFlags.ReadWrite) 
    personal.Add(certOne) 
    personal.Close() 

    Dim trust As New X509Store(StoreName.Root, StoreLocation.LocalMachine) 
    trust.Open(OpenFlags.ReadWrite) 
    trust.Add(certTwo) 
    trust.Close() 

    Dim intermed As New X509Store(StoreName.CertificateAuthority, StoreLocation.LocalMachine) 
    intermed.Open(OpenFlags.ReadWrite) 
    intermed.Add(certThree) 
    intermed.Close() 
संबंधित मुद्दे