का उपयोग करके उत्पन्न प्रमाण पत्र के साथ सर्वर के रूप में प्रमाणित करते समय मैं 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 प्रमाणपत्र बनाने का भी प्रयास किया है, लेकिन मुझे एक ही त्रुटि मिलती है, इसलिए मैंने सादगी के लिए उदाहरण कोड में इसे हटा दिया।
मैंने अपने v1 प्रमाणपत्र जेनरेटर को v3 संस्करण में बदलने की कोशिश की, लेकिन n ओ लाभ प्रमाण पत्र ख़रीदना हमारे लिए संभव नहीं है - हम अपनी सेवा के लिए इंस्टॉल-टाइम पर प्रमाणपत्र तैयार करने जा रहे हैं। जाहिर है कि इसमें एक विश्वसनीय प्रमाणीकरण पथ नहीं होगा, लेकिन फिर भी यह हमारे डेटा को एन्क्रिप्ट करने की अनुमति देता है क्योंकि इसे स्थानांतरित किया जाता है। –
मुझे नहीं लगता कि आप 'लापता एक्सटेंशन' और 'अमान्य सीएन' से क्या मतलब है, इस बारे में और अधिक जानकारी प्रदान कर सकते हैं? –
जो "के बारे में एक पुस्तक लिख सकता है" (एफएक्यू देखें) श्रेणी में आता है ;-) आपके पास 'मेकर्ट' (या वेब साइटों से कोई भी SSL प्रमाणपत्र) के आंतरिक भाग को देखकर ** न्यूनतम ** अनुमान हो सकता है बनाया गया। चारों ओर बकवास (दुख की बात है) लेकिन ब्राउज़र उन्हें भी स्वीकार करते हैं। – poupou