"एक आंतरिक त्रुटि हुई।" जब X509Certificate2 के साथ pfx फ़ाइल लोड कर रहा है


79

मैं स्व-हस्ताक्षरित प्रमाणपत्र (c #) का उपयोग करने की कोशिश कर रहा हूं:

X509Certificate2 cert = new X509Certificate2(
    Server.MapPath("~/App_Data/myhost.pfx"), "pass");

एक साझा वेब होस्टिंग सर्वर पर और मुझे एक त्रुटि मिली:

System.Security.Cryptography.CryptographicException: An internal error occurred.

स्टैक ट्रेस के साथ समाप्त होता है

System.Security.Cryptography.CryptographicException.
    ThrowCryptogaphicException(Int32 hr) +33
System.Security.Cryptography.X509Certificates.X509Utils.
    _LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, 
        Boolean persistKeySet, SafeCertContextHandle& pCertCtx) +0
System.Security.Cryptography.X509Certificates.X509Certificate.
    LoadCertificateFromFile(String fileName, Object password, 
        X509KeyStorageFlags keyStorageFlags) +237
System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(
    String fileName, String password) +131

मेरी देव मशीन पर यह ठीक लोड होता है। कारण मैं * .pfx नहीं * .cer फ़ाइल लोड करता हूं क्योंकि मुझे एक निजी कुंजी एक्सेस की आवश्यकता है (सेर फ़ाइल लोड ठीक है)। मैं अपने देव mochine पर pfx की तरह है कि:

makecert -r -n "CN=myhost.com, E=admin@myhost.com" -sky exchange -b 01/01/2009
    -pe -sv myhost.pvk myhost.cer
<b>pvk2pfx</b> -pvk myhost.pvk -spc myhost.cer -pfx myhost.pfx -po pass</code>

मैं संस्करण v5.131.3790.0 का उपयोग कर रहा हूँ


शायद यह लेख मदद कर सकता है: codeproject.com/KB/WCF/wcfcertports.aspx
Emmanuel

मुझे त्रुटि संदेश मिल रहा था the system cannot find the file specified। @ रैंडी लेवी द्वारा जवाब मेरे लिए काम किया!
जेस

जवाबों:


145

निजी कुंजी के लिए स्थानीय कंप्यूटर स्टोर का उपयोग करें:

X509Certificate2 cert = new X509Certificate2("myhost.pfx", "pass",
    X509KeyStorageFlags.MachineKeySet);

MachineKeySetके रूप में वर्णित है "निजी कुंजी को वर्तमान उपयोगकर्ता स्टोर के बजाय स्थानीय कंप्यूटर स्टोर में संग्रहीत किया जाता है"। कोई झंडे के साथ डिफ़ॉल्ट उपयोगकर्ता स्टोर में जगह के लिए है।

भले ही आप डिस्क से प्रमाणपत्र पढ़ रहे हों और उसे किसी ऑब्जेक्ट में संग्रहीत कर रहे हों लेकिन निजी कुंजी अभी भी Microsoft क्रिप्टोग्राफ़िक एपीआई क्रिप्टोग्राफ़िक सेवा प्रदाता कुंजी डेटाबेस में संग्रहीत हैं। होस्टिंग सर्वर पर ASP.NET प्रक्रिया में उपयोगकर्ता स्टोर तक पहुंचने की अनुमति नहीं है।

एक अन्य दृष्टिकोण (नीचे कुछ टिप्पणियों के अनुसार) IIS कॉन्फ़िगरेशन या ऐप पूल पहचान को संशोधित करना है - जो काम करते हैं। हालाँकि, यह मानता है कि इन कॉन्फ़िगरेशन वस्तुओं तक पहुंच है जो मामला नहीं हो सकता है (उदाहरण के लिए साझा होस्टिंग वातावरण में)।


3
हाँ, यह मदद करता है, धन्यवाद। आप समझा सकते हैं क्यों? डॉक्स कहते हैं कि कुछ भी मददगार नहीं है।

2
आपने मेरा दिन बचाया। विचित्र रूप से पर्याप्त है, यह मेरी मशीन पर .NET 4.0
मार्क क्लेमेंट

1
वास्तव में, सभी को X509KeyStorageFlags.MachineKeySet पैरामीटर सेट करने की आवश्यकता थी। यह वास्तव में दुखद है कि अपवाद को केवल "एक आंतरिक त्रुटि हुई" कहा गया है। बहुत मददगार नहीं।
निकोली

2
आप ऐप पूल को सौंपे गए खाते में निजी कुंजी पर अधिक विशेषाधिकार भी जोड़ सकते हैं। या एप्लिकेशन पूल पहचान को "स्थानीय सेवा" में बदलें।
गुज़रात

1
और एक तेज फिक्स / वर्कअराउंड चेक के लिए: stackoverflow.com/questions/9951729/…
सिप्रियान तियोसानु

13

मैंने रैंडी को मशीनकेसेट में बदलने के समाधान की कोशिश की, लेकिन फिर त्रुटि संदेश मिला:

"कुंजी निर्दिष्ट राज्य में उपयोग के लिए मान्य नहीं है"

इसलिए थोड़ा घूमने के बाद मुझे एक पोस्ट मिली जिसने इसे बदलने का सुझाव दिया:

var certificate = new X509Certificate2(certKeyFilePath, passCode, 
X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet |       
X509KeyStorageFlags.PersistKeySet );

और इसने मेरे मुद्दों को सुलझा दिया।

मैंने अभी तक IIS कॉन्फ़िगरेशन में सेटिंग ऐप पूल सेटिंग को बदलने के सुझाव का प्रयास नहीं किया है। ऐसा करने के लिए अपनी साइट के ऐप पूल के लिए एडवांस्ड सेटिंग्स में जाएं और फिर "लोड यूजर प्रोफाइल" को सही पर सेट करें। जब यह सेटिंग गलत होती है, तो कुंजी कंटेनर स्पष्ट रूप से पहुंच योग्य नहीं होते हैं।


मुझे उपर्युक्त त्रुटि मिल रही थी और आपके समाधान ने इसे हल करने में मदद की है। धन्यवाद।
डॉटकोडर

मुझे ऐसी टिप्पणियां पसंद नहीं हैं जो इस तरह से मदद नहीं करती हैं (लेकिन मैं आपको बताता हूं कि आप मेरा दिन बचाते हैं। धन्यवाद!
रासपुतिनो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.