2011-11-02 17 views
9

का उपयोग करके उत्पन्न प्रमाण पत्र के साथ सर्वर के रूप में प्रमाणित करते समय मैं BouncyCastle.Crypto dll का उपयोग करके प्रमाणपत्र बनाने का प्रयास कर रहा हूं, जिसका उपयोग सर्वर के रूप में SslStream को प्रमाणीकृत करने के लिए किया जाता है एक विंडोज सेवा प्रक्रिया में, जो स्थानीय सिस्टम खाते के तहत चलता है।"पैकेज को आपूर्ति किए गए प्रमाण-पत्रों को मान्यता नहीं मिली" त्रुटि जब BouncyCastle

हालांकि जब मैं SslStream.AuthenticateAsServer (प्रमाणपत्र) कॉल पर जाता हूं, तो यह त्रुटि संदेश के साथ Win32 अपवाद फेंकता है "पैकेज को प्रदान किए गए प्रमाण-पत्र मान्यता प्राप्त नहीं थे"।

इस त्रुटि संदेश के बारे में यहां कई प्रश्न हैं, लेकिन उनमें से कोई भी मेरी विशेष समस्या का वर्णन या हल करने लगते हैं।

आशा किसी को कुछ मदद की पेशकश करने में सक्षम हो सकता है कि में, मैं कोड मैं बना सकते हैं और प्रमाण पत्र स्थापित करने के लिए उपयोग कर रहा हूँ में शामिल हैं:

// First create a certificate using the BouncyCastle classes 
BigInteger serialNumber = BigInteger.ProbablePrime(120, new Random()); 
AsymmetricCipherKeyPair keyPair = GenerateKeyPair(); 

X509V1CertificateGenerator generator = new X509V1CertificateGenerator(); 
generator.SetSerialNumber(serialNumber); 
generator.SetIssuerDN(new X509Name("CN=My Issuer")); 
generator.SetNotBefore(DateTime.Today); 
generator.SetNotAfter(DateTime.Today.AddYears(100)); 
generator.SetSubjectDN(new X509Name("CN=My Issuer")); 
generator.SetPublicKey(keyPair.Public); 
generator.SetSignatureAlgorithm("SHA1WITHRSA"); 

Org.BouncyCastle.X509.X509Certificate cert = generator.Generate(
    keyPair.Private, SecureRandom.GetInstance("SHA1PRNG")); 

// Ok, now we have a BouncyCastle certificate, we need to convert it to the 
// System.Security.Cryptography class, by writing it out to disk and reloading 
X509Certificate2 dotNetCert; 

string tempStorePassword = "Password01"; // In real life I'd use a random password 
FileInfo tempStoreFile = new FileInfo(Path.GetTempFileName()); 

try 
{ 
    Pkcs12Store newStore = new Pkcs12Store(); 

    X509CertificateEntry entry = new X509CertificateEntry(cert); 

    newStore.SetCertificateEntry(Environment.MachineName, entry); 

    newStore.SetKeyEntry(
     Environment.MachineName, 
     new AsymmetricKeyEntry(keyPair.Private), 
     new [] { entry }); 

    using (FileStream s = tempStoreFile.Create()) 
    { 
     newStore.Save(s, 
      tempStorePassword.ToCharArray(), 
      new SecureRandom(new CryptoApiRandomGenerator())); 
    } 

    // Reload the certificate from disk 
    dotNetCert = new X509Certificate2(tempStoreFile.FullName, tempStorePassword); 
} 
finally 
{ 
    tempStoreFile.Delete(); 
} 

// Now install it into the required certificate stores 
X509Store targetStore = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
targetStore.Open(OpenFlags.ReadWrite); 
targetStore.Add(dotNetCert); 
targetStore.Close(); 

ठीक है, अब मैं बनाया है और प्रमाण पत्र स्थापित किया। इसके बाद मैं जेनरेट सर्टिफिकेट के थंबप्रिंट के साथ इसे आपूर्ति करके इस प्रमाणपत्र का उपयोग करने के लिए अपनी विंडोज सेवा को कॉन्फ़िगर करता हूं। इसके बाद मैं इस तरह के प्रमाणपत्र का उपयोग करता हूं:

// First load the certificate 
X509Certificate2 certificate = null; 

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
store.Open(OpenFlags.ReadOnly); 

foreach (X509Certificate2 certInStore in store.Certificates) 
{ 
    if (certInStore.Thumbprint == "...value not shown...") 
    { 
     certificate = certInStore; 
     break; 
    } 
} 

SslStream sslStream = new SslStream(new NetworkStream(socket, false), false); 

// Now this line throws a Win32Exception 
// "The credentials supplied to the package were not recognized" 
sslStream.AuthenticateAsServer(certificate); 

क्या किसी को पता है कि समस्या क्या हो सकती है?

अगर मैं 'मेकर्ट' के साथ बनाए गए प्रमाण पत्र को स्थापित करता हूं तो मुझे समस्या नहीं आती है, लेकिन यह उत्पादन प्रमाणपत्रों के लिए उपयुक्त नहीं है।

मैंने सर्वर प्रमाणीकरण के लिए एक अलग x509v1 सीए प्रमाण पत्र और फिर x509v3 प्रमाणपत्र बनाने का भी प्रयास किया है, लेकिन मुझे एक ही त्रुटि मिलती है, इसलिए मैंने सादगी के लिए उदाहरण कोड में इसे हटा दिया।

उत्तर

0

मैं यह त्रुटि लेकिन प्रमाण पत्र बना रहे हैं, याद नहीं है सहित एक वैध SSL/TLS के लिए प्रयोग की जाने वाली, नहीं है:

  • v1 (नहीं v3) प्रमाण पत्र,
  • अनुपलब्ध एक्सटेंशन;
  • अमान्य सीएन;
  • ...

कई आरएफसी है कि इस बारे में बात करती है, टीएलएस पर RFC5246 (1.2) सहित रहे हैं।

अंत में अपने खुद प्रमाण पत्र बनाने और अधिक नहीं उपयुक्तmakecert द्वारा किए गए लोगों का उपयोग कर (लेकिन पिछले एक न्यूनतम एक SSL/TLS सर्वर प्रमाणपत्र के लिए प्रयोग करने योग्य होने के लिए सेट उत्पन्न कर सकते हैं) की तुलना में है।

मैं तुम्हें एक अच्छा जाना जाता प्रमाणपत्र प्राधिकारी (CA), एक SSL/TLS प्रमाणपत्र से खरीदने के लिए, उत्पादन के लिए दृढ़ता से सुझाव है । इससे आपको अधिकांश ब्राउज़रों और उपकरणों द्वारा मान्यता प्राप्त एक कार्यकारी प्रमाणपत्र मिल जाएगा।

+0

मैंने अपने v1 प्रमाणपत्र जेनरेटर को v3 संस्करण में बदलने की कोशिश की, लेकिन n ओ लाभ प्रमाण पत्र ख़रीदना हमारे लिए संभव नहीं है - हम अपनी सेवा के लिए इंस्टॉल-टाइम पर प्रमाणपत्र तैयार करने जा रहे हैं। जाहिर है कि इसमें एक विश्वसनीय प्रमाणीकरण पथ नहीं होगा, लेकिन फिर भी यह हमारे डेटा को एन्क्रिप्ट करने की अनुमति देता है क्योंकि इसे स्थानांतरित किया जाता है। –

+0

मुझे नहीं लगता कि आप 'लापता एक्सटेंशन' और 'अमान्य सीएन' से क्या मतलब है, इस बारे में और अधिक जानकारी प्रदान कर सकते हैं? –

+0

जो "के बारे में एक पुस्तक लिख सकता है" (एफएक्यू देखें) श्रेणी में आता है ;-) आपके पास 'मेकर्ट' (या वेब साइटों से कोई भी SSL प्रमाणपत्र) के आंतरिक भाग को देखकर ** न्यूनतम ** अनुमान हो सकता है बनाया गया। चारों ओर बकवास (दुख की बात है) लेकिन ब्राउज़र उन्हें भी स्वीकार करते हैं। – poupou

17

वह विशेष त्रुटि संदेश घंटी बजता है। मुझे लगता है कि या तो आपने निजी कुंजी को प्रमाणपत्र के साथ स्टोर नहीं किया है, या, Windows सेवा के पास निजी कुंजी तक पहुंच नहीं है। इस जांच करने के लिए प्रमाण पत्र को खोलने एमएमसी स्नैप-इन:

  1. भागो एमएमसी (जैसेप्रारंभ मेनू)
  2. फ़ाइल मेनू> जोड़ें से/स्नैप में निकालें
  3. करें बाएँ फलक में "प्रमाण पत्र" और फिर
  4. चुनें "कंप्यूटर खाता" (LocalMachine के लिए जोड़ें क्लिक करें) फिर अगला क्लिक करें, और उसके बाद

प्रमाण पत्र पर नेविगेट करें और दाएं फलक में डबल-क्लिक करें। आने वाले सामान्य टैब पर, आपको टेक्स्ट के साथ नीचे एक छोटा सा आइकन दिखाना चाहिए, "आपके पास एक निजी कुंजी है जो इस प्रमाणपत्र से मेल खाती है।" यदि नहीं, तो यह समस्या है। निजी कुंजी सहेजा नहीं गया था।

तो निजी कुंजी मौजूद है, यह संवाद निरस्त करने के लिए ठीक क्लिक करें, और उसके बाद दाएँ फलक में प्रमाण पत्र पर राइट क्लिक करें और पॉप-अप मेनू पर चयन करें: सभी टास्क> प्रबंधित निजी कुंजी। उस संवाद में, सुनिश्चित करें कि सेवा के अंतर्गत चलाए गए विंडोज खाते में निजी कुंजी तक पहुंच पढ़ी गई है। यदि ऐसा नहीं होता है, तो यह समस्या है।

संपादित करें: ओह, आपने लिखा है कि सेवा स्थानीय सिस्टम के रूप में चलती है, इसलिए यह एक लापता निजी कुंजी होनी चाहिए, अगर यह इन दो समस्याओं में से एक है। मैं वैसे भी अपने उत्तर में कुंजी एक्सेस चेक छोड़ दूंगा, किसी और के लिए जो इसे हिट करता है और स्थानीय सिस्टम के रूप में नहीं चल रहा है।

+0

हम्म, मुझे नहीं लगता कि यह इन समस्याओं में से एक है - मेरे पास निश्चित रूप से प्रमाण पत्र से संबंधित एक निजी कुंजी है (मैं आपके द्वारा वर्णित आइकन और टेक्स्ट देख सकता हूं) । मैंने "निजी कुंजी प्रबंधित करें" संवाद में जाने और प्रमाण पत्र के लिए सभी को पूर्ण नियंत्रण प्रदान करने का प्रयास किया लेकिन मुझे अभी भी वही त्रुटि मिलती है। –

+0

इस उत्तर की जांच करें और देखें कि यह मदद करता है: http://stackoverflow.com/questions/2322560/certificate-problem-with-a-new-machine-credentials-supplied-to-package-not-rec –

+0

कोशिश करने की एक और बात आपके 'नए X509Certificate2 (...)' में तीसरा X509KeyStorageFlags पैरामीटर जोड़ता है, उदाहरण के लिए X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet, बस यह सुनिश्चित करने के लिए कि जब आप इसे स्टोर में सहेजते हैं तो सबकुछ सही ढंग से रेखांकित हो जाता है। –

6

इस समाधान को ऑनलाइन मिला लेकिन मुझे क्रेडिट देने के लिए स्रोत नहीं मिला।

जब से मैं AuthenticateAsClient() (ग्राहक सत्यापन के लिए) के साथ "साख पैकेज को आपूर्ति की मान्यता प्राप्त नहीं थे" समस्या में पड़ गए, मैं दस्तावेज़ के लिए मैं इसे कैसे हल करना चाहते हैं। यह एक ही अंत लक्ष्य के साथ एक अलग विधि है। चूंकि यह प्रमाणीकरणएसर सर्वर() के लिए उपयोगी हो सकता है, यह पता लगाया क्यों नहीं।

यहां मैं एक बीसी प्रमाणपत्र को .NET प्रमाणपत्र में परिवर्तित करता हूं। इसे अपनी निजीकी संपत्ति को स्टोर करने के लिए इसे .NET X509Certificate2 में परिवर्तित करने में एक अतिरिक्त चरण जोड़ें।

Org.BouncyCastle.X509.X509Certificate bcCert; 

X509Certificate dotNetCert = DotNetUtilities.ToX509Certificate(bcCert); 
X509Certificate2 dotNetCert2 = new X509Certificate2(dotNetCert); 

समस्या आए जब एक .NET निजी कुंजी के लिए एक BouncyCastle निजी कुंजी जोड़ने। X509 प्रमाण पत्र ठीक रूपांतरित हो गए लेकिन निजी कुंजी नहीं। मैंने प्रदान की गई DotNetUtilities का उपयोग कर बीसी निजी कुंजी को RSACryptoServiceProvider में परिवर्तित कर दिया। दुर्भाग्यवश ऐसा लगता है कि रूपांतरण पूरा नहीं हुआ है। तो मैंने एक और RSACryptoServiceProvider बनाया जिसे मैंने तब शुरू किया। तब मैंने अपनी बनाई गई निजी कुंजी को आयात किया।

// Apparently, using DotNetUtilities to convert the private key is a little iffy. Have to do some init up front. 
RSACryptoServiceProvider tempRcsp = (RSACryptoServiceProvider)DotNetUtilities.ToRSA((RsaPrivateCrtKeyParameters)ackp.Private); 
RSACryptoServiceProvider rcsp = new RSACryptoServiceProvider(new CspParameters(1, "Microsoft Strong Cryptographic Provider", 
      new Guid().ToString(), 
      new CryptoKeySecurity(), null)); 

rcsp.ImportCspBlob(tempRcsp.ExportCspBlob(true)); 
dotNetCert2.PrivateKey = rcsp; 

उसके बाद, मैं X509Certificate2 ऑब्जेक्ट को सीधे मुख्य स्टोर में सहेजने में सक्षम था। मुझे वास्तविक फ़ाइल की आवश्यकता नहीं थी इसलिए मैंने उस चरण को छोड़ दिया।

+0

यह उत्तर मेरे लिए बेहद उपयोगी था। निश्चित नहीं है कि DotNetUtilities रूपांतरण क्यों सही काम नहीं कर रहा है, लेकिन यह मेरी समस्या को एक ही त्रुटि के साथ हल किया! धन्यवाद! –

5

कभी-कभी समस्या होती है जब एप्लिकेशन प्रमाणपत्र तक पहुंचने का प्रयास करता है, तो प्रमाणपत्र तक पहुंचने के लिए पर्याप्त विशेषाधिकार नहीं होता है, तो समस्या व्यवस्थापक के रूप में एप्लिकेशन चलाकर हल हो सकती है।

+0

धन्यवाद, मेरे लिए यह चाल है –

+0

इच्छा है कि मैं इसे दो बार ऊपर उठा सकता हूं, यह मुझे कुछ महीने पहले जला दिया, और आज मुझे जला दिया, और इस जवाब ने दोनों मौकों पर मदद की। – Sully

0

पहले, हर बार जब मैंने इस मुद्दे में भाग लिया है, तो मुझे अपने स्थानीय मशीन प्रमाण पत्र से प्रमाणपत्र को हटाना होगा और इसे फिर से आयात करना होगा। तो यह सब खुश लग रहा है। मैं यह नहीं देख सकता कि यह वैश्विक अनुमतियाँ समस्या या अमान्य प्रमाण कैसे हो सकता है यदि इसे फिर से आयात करने से समस्या ठीक हो जाती है।

मैं अंत में कैसे तय करता हूं कि यह Windows संसाधन किट से winhttpcertcfg उपकरण का उपयोग कर रहा था ताकि प्रमाण का उपयोग करने वाले विशिष्ट उपयोगकर्ता को अनुमति प्रदान की जा सके।

वाक्य रचना होगा:

"C:\Program Files (x86)\Windows Resource Kits\Tools\winhttpcertcfg" -i cert.p12 -c LOCAL_MACHINE\My -a UserWhoUsesTheCert -p passwordforp12 
0

मैं जब .NET अनुप्रयोग से एक WCF बाकी सेवा है जहाँ मैं क्लाइंट प्रमाणपत्र संलग्न करना बुला समान मुद्दा था, मुझे बस इतना करना था कि "नेटवर्क्स सर्विसेज] में प्रमाण पत्र तक पहुंच प्रदान की गई थी, मेरे आईआईएस पूल डिफ़ॉल्ट पूल था जो इसका उपयोग नेटवर्क्स सेवा उपयोगकर्ता खाते का उपयोग करता है।

मैंने जो गलती की थी, मैंने प्रमाण पत्र को अन्य स्टोर से स्थानीय मशीन -> कार्मिक स्टोर जहां प्रमाण पत्र को पासवर्ड से संरक्षित किया गया था। प्रमाणपत्र को स्पष्ट रूप से आवश्यक स्टोर में आयात करना चाहिए।

1

मेरे लिए Windows Server 2012 R2 (.net 4.6.1 पर काम करता है)) - "सभी कार्य> निजी कुंजी प्रबंधित करें" और प्रत्येक तक पहुंच सेट करें (IS_IUSRS पर सेट करना पर्याप्त नहीं था)

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

  • कोई संबंधित समस्या नहीं^_^