2011-09-26 17 views
5

मैं एक पासवर्ड संरक्षित keyfile (पीएफएक्स) का उपयोग कर प्रोग्रामिंग रूप से एक असेंबली पर हस्ताक्षर करने की कोशिश कर रहा हूँ। हालांकि जब मैं StrongNameKeyPair का उपयोग करने का प्रयास करता हूं तो मुझे निम्न अपवाद मिलता है।पासवर्ड संरक्षित keyfile (pfx) के साथ StrongNameKeyPair का उपयोग कैसे करें?

StrongNameKeyPair के लिए सार्वजनिक कुंजी प्राप्त करने में असमर्थ। System.Reflection.StrongNameKeyPair.ComputePublicKey() पर System.Reflection.StrongNameKeyPair.get_PublicKey() पर

+0

यह हमें (और आप) की मदद करेगा यदि आपने हमें वह कोड दिखाया जो आपने उस त्रुटि को प्राप्त करने के लिए उपयोग किया था। – poupou

उत्तर

1

यह नहीं दिखता है माइक्रोसॉफ्ट की तरह अद्यतन StrongNameKeyPairSNK फ़ाइल स्वरूप के अलावा और कुछ का समर्थन करने के - दुर्भाग्य से घटती है, तो , एक आरएसए उदाहरण स्वीकार करने वाला कोई कन्स्ट्रक्टर नहीं।

वास्तव में मैं समझता हूँ कि विधानसभाओं strongnaming के लिए PKCS # 12 support एक अप्रत्यक्ष एक है, यानी ढांचे द्वारा सीधे उपकरण (MSBuild या VS.NET) और नहीं द्वारा प्रदान की है।

हालांकि आप अभी भी प्रोग्राम के Mono.Security StrongName वर्ग, GitHub में उपलब्ध से (MIT.X11 लाइसेंस) कोड को फिर से उपयोग करके किसी भी आरएसए उदाहरण का उपयोग करते हुए एक विधानसभा प्रवेश कर सकते हैं। यह थोड़ा और काम है - लेकिन यह किसी भी फ्रेमवर्क संस्करण और किसी भी (भविष्य) प्रारूप पर काम करेगा जो प्रचारित हो जाता है :-)

+0

StrongNameKeyPair में बाइट [] इनपुट के साथ एक कन्स्ट्रक्टर है। मुझे विश्वास है कि इसे पीएफएक्स से बनाने के लिए पर्याप्त है (मेरा जवाब देखें)। –

3

यहां सी # कोड का एक टुकड़ा है जो पासवर्ड-सुरक्षित से StrongNameKeyPair ऑब्जेक्ट बनाता है। .PFX फ़ाइल :

public static StrongNameKeyPair GetStrongNameKeyPairFromPfx(string pfxFile, string password) 
    { 
     X509Certificate2Collection certs = new X509Certificate2Collection(); 
     certs.Import(pfxFile, password, X509KeyStorageFlags.Exportable); 
     if (certs.Count == 0) 
      throw new ArgumentException(null, "pfxFile"); 

     RSACryptoServiceProvider provider = certs[0].PrivateKey as RSACryptoServiceProvider; 
     if (provider == null) // not a good pfx file 
      throw new ArgumentException(null, "pfxFile"); 

     return new StrongNameKeyPair(provider.ExportCspBlob(false)); 
    } 

नोट: मैं PFX यहाँ (उदाहरण के लिए दृश्य स्टूडियो मजबूत नाम यूआई फार्म) .नेट फ्रेमवर्क उपकरणों के द्वारा बनाया गया है मान एक विधानसभा मजबूत नाम निर्माण का समर्थन करने के। यह किसी भी पीएफएक्स के साथ ठीक नहीं हो सकता है।

+0

हालांकि X509Certificate2Collection अनावश्यक है (केवल X509Certificate2 का उपयोग करें) यह मुझे मिला सबसे अच्छा समाधान है। – Rafael

+0

@ राफेल - बिल्कुल। मैंने देखा कि उत्तर के बाद :-) –