क्या आप जानते हैं जो प्रमाण पत्र प्रमाण पत्र की जांच करने के लिए, यदि आपके पास रूट और मध्यवर्ती की सार्वजनिक कुंजी लोड कर सकते हैं जड़ और मध्यवर्ती प्रमाणपत्र हो सकता है तो X509Chain
वस्तु की ChainPolicy.ExtraStore
संग्रह में प्रमाणपत्र।
मेरे कार्य भी एक Windows एक प्रमाण पत्र स्थापित करने के लिए फॉर्म्स आवेदन, केवल अगर यह मेरे देश की सरकार के नाम से जाना जाता "राष्ट्रीय रूट प्रमाणपत्र" पर निर्भर जारी किया गया था लिखने के लिए वहाँ भी था। सीए की एक सीमित संख्या है जिसे राष्ट्रीय वेब सेवाओं के कनेक्शन प्रमाणित करने के लिए प्रमाण पत्र जारी करने की अनुमति है, इसलिए मेरे पास एक था प्रमाणपत्र में सीमित सेट जो श्रृंखला में हो सकता है और लक्ष्य मशीन पर गायब हो सकता है। मैं आवेदन की एक उप-निर्देशिका "प्रमाणपत्र" में सीए के के सभी सार्वजनिक कुंजी और सरकारी रूट प्रमाणपत्र एकत्र:
दृश्य स्टूडियो में, मैं समाधान के लिए निर्देशिका प्रमाणपत्र जोड़ा गया है और के रूप में एम्बेडेड इस निर्देशिका में सभी फ़ाइलों को चिह्नित संसाधन। यह मुझे मेरे सी # लाइब्रेरी कोड में "विश्वसनीय" प्रमाणपत्रों के संग्रह की गणना करने की अनुमति देता है, प्रमाण पत्र जांचने के लिए एक श्रृंखला बनाने के लिए, भले ही जारीकर्ता प्रमाणपत्र स्थापित नहीं है।मैं इस उद्देश्य के लिए X509Chain के लिए एक आवरण वर्ग बनाया:
private class X509TestChain : X509Chain, IDisposable
{
public X509TestChain(X509Certificate2 oCert)
: base(false)
{
try
{
ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
ChainPolicy.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority;
if (!Build(oCert) || (ChainElements.Count <= 1))
{
Trace.WriteLine("X509Chain.Build failed with installed certificates.");
Assembly asmExe = System.Reflection.Assembly.GetEntryAssembly();
if (asmExe != null)
{
string[] asResources = asmExe.GetManifestResourceNames();
foreach (string sResource in asResources)
{
if (sResource.IndexOf(".cert.") >= 0)
{
try
{
using (Stream str = asmExe.GetManifestResourceStream(sResource))
using (BinaryReader br = new BinaryReader(str))
{
byte[] abResCert = new byte[str.Length];
br.Read(abResCert, 0, abResCert.Length);
X509Certificate2 oResCert = new X509Certificate2(abResCert);
Trace.WriteLine("Adding extra certificate: " + oResCert.Subject);
ChainPolicy.ExtraStore.Add(oResCert);
}
}
catch (Exception ex)
{
Trace.Write(ex);
}
}
}
}
if (Build(oCert) && (ChainElements.Count > 1))
Trace.WriteLine("X509Chain.Build succeeded with extra certificates.");
else
Trace.WriteLine("X509Chain.Build still fails with extra certificates.");
}
}
catch (Exception ex)
{
Trace.Write(ex);
}
}
public void Dispose()
{
try
{
Trace.WriteLine(string.Format("Dispose: remove {0} extra certificates.", ChainPolicy.ExtraStore.Count));
ChainPolicy.ExtraStore.Clear();
}
catch (Exception ex)
{
Trace.Write(ex);
}
}
}
बुला समारोह में, मैं अब सफलतापूर्वक जांच कर सकता है एक अज्ञात प्रमाणपत्र राष्ट्रीय मूल प्रमाणपत्र से निकला है, तो:
bool bChainOK = false;
using (X509TestChain oChain = new X509TestChain(oCert))
{
if ((oChain.ChainElements.Count > 0)
&& IsPKIOverheidRootCert(oChain.ChainElements[oChain.ChainElements.Count - 1].Certificate))
bChainOK = true;
if (!bChainOK)
{
TraceChain(oChain);
sMessage = "Root certificate not present or not PKI Overheid (Staat der Nederlanden)";
return false;
}
}
return true;
तस्वीर को पूरा करने के लिए : रूट प्रमाणपत्र की जांच करने के लिए (आमतौर पर यह स्थापित किया जाता है क्योंकि यह विंडोज अपडेट में शामिल है, लेकिन सिद्धांत में भी गायब हो सकता है), मैं दोस्ताना नाम और थंबप्रिंट की तुलना प्रकाशित मूल्यों से करता हूं:
private static bool IsPKIOverheidRootCert(X509Certificate2 oCert)
{
if (oCert != null)
{
string sFriendlyName = oCert.FriendlyName;
if ((sFriendlyName.IndexOf("Staat der Nederlanden") >= 0)
&& (sFriendlyName.IndexOf(" Root CA") >= 0))
{
switch (oCert.Thumbprint)
{
case "101DFA3FD50BCBBB9BB5600C1955A41AF4733A04": // Staat der Nederlanden Root CA - G1
case "59AF82799186C7B47507CBCF035746EB04DDB716": // Staat der Nederlanden Root CA - G2
case "76E27EC14FDB82C1C0A675B505BE3D29B4EDDBBB": // Staat der Nederlanden EV Root CA
return true;
}
}
}
return false;
}
मुझे यकीन नहीं है कि यह चेक बिल्कुल सुरक्षित है, लेकिन मेरे मामले में विंडोज फॉर्म एप्लिकेशन के ऑपरेटर को सुनिश्चित करने के लिए एक वैध प्रमाणपत्र तक पहुंच सुनिश्चित है। सॉफ़्टवेयर का लक्ष्य केवल प्रमाणपत्र सूची को फ़िल्टर करना है ताकि उसे कंप्यूटर की मशीन स्टोर में केवल सही प्रमाणपत्र स्थापित करने में मदद मिल सके (सॉफ़्टवेयर इंटरमीडिएट और रूट प्रमाणपत्र की सार्वजनिक कुंजी भी इंस्टॉल करता है, यह सुनिश्चित करने के लिए कि रनटाइम व्यवहार वेब सेवा क्लाइंट सही है)।
मैंने सवाल संपादित किया है, यह एक .NET 2.0 विनफॉर्म एप्लिकेशन है। – RainerM