2011-08-25 16 views
7

सत्यापित करें मैं स्टोर का उपयोग करने के बजाए प्रोग्रामेटिक रूप से प्रमाण पत्र का उपयोग करने की कोशिश कर रहा हूं। मैं X509Certificate2 फाइलनाम और पासवर्ड के साथ बना रहा हूं।डब्ल्यूसीएफ सर्टिफिकेट चेन, प्रोग्रामेटिक रूप से

यह ठीक काम करता है जब मैंने विश्वसनीय लोगों में प्रमाणपत्र स्टोर में रूट प्रमाणपत्र मैन्युअल रूप से जोड़ा है। हालांकि, मुझे हर तैनाती पर ऐसा करने की ज़रूरत नहीं है - मैं इसके बजाय प्रोग्रामेटिक रूप से भी निपटूंगा।

जब मैं प्रमाणपत्र स्टोर से रूट प्रमाणपत्र को हटाता हूं तो मुझे अपवाद मिलता है।

मैंने जो कुछ भी पढ़ा है, वह कहता है कि मुझे प्रमाणपत्र स्टोर में रूट प्रमाणपत्र मैन्युअल रूप से जोड़ना है, या ट्रस्ट चेन काम नहीं करेगा।

प्रश्न: क्या ट्रस्ट चेन स्थापित करने के लिए कोई प्रोग्रामेटिक तरीका है, इसलिए मुझे इसे मैन्युअल रूप से करने की ज़रूरत नहीं है?

कोड लगता है:

 var serverCert = new X509Certificate2("FullPathToMyCertificate.cer", "Password"); 
     Client.ClientCredentials.ServiceCertificate.DefaultCertificate = serverCert; 

अपवाद है, जो occures जब मैं ग्राहकों का इस्तेमाल करने की कोशिश, यह है:

System.IdentityModel.Tokens.SecurityTokenValidationException 

The X.509 certificate CN=notrealcertname, OU=TPA, OU=BMP, OU=Projects, O=Somebody, C=US is not in the trusted people store. 
The X.509 certificate CN=notrealcertname, OU=TPA, OU=BMP, OU=Projects, O=Somebody, C=US chain building failed. 
The certificate that was used has a trust chain that cannot be verified. 
Replace the certificate or change the certificateValidationMode. 
A certificate chain could not be built to a trusted root authority. 

उत्तर

4

इस्तेमाल किया घटक डिफ़ॉल्ट रूप से श्रृंखला की पुष्टि करता है - जब श्रृंखला सत्यापित नहीं किया जा सकता है कि आप उस अपवाद प्राप्त करते हैं। आप कोड में श्रृंखला के सत्यापन सहित सब कुछ करना चाहते हैं तो आप implement "custom validation" and integrate that into the WCF Host की जरूरत है:

Client.ServiceCertificate.Authentication.CertificateValidationMode = 
       X509CertificateValidationMode.Custom; 
Client.ServiceCertificate.Authentication.CustomCertificateValidator = 
    new MyCertificateValidator(); 

एक अन्य विकल्प मान्यता पूरी तरह निष्क्रिय करने के लिए होगा (उत्पादन के लिए नहीं !!!)

Client.ServiceCertificate.Authentication.CertificateValidationMode = 
       X509CertificateValidationMode.None; 

संपादित करें - टिप्पणी के बाद:

मान्य के लिए अपने आप को श्रृंखला आप X509Chain और X509Store पर एक नज़र रखना चाहिए - एक विचार कैसे इस तरह के एक श्रृंखला सत्यापन लागू किया जा सकता Verify की Mono's implementation पर एक नज़र पाने के लिए ... मूल रूप से आप माता-पिता और इतने के लिए एक X509Certificate2Collection खोज करने के लिए Find विधि का उपयोग पर ... कस्टम सत्यापन के साथ सत्यापन मानदंड आपके ऊपर है (मान्य हस्ताक्षर, समाप्त नहीं हुआ ...)।

MSDN पर कुछ संदर्भ लिंक:

+0

त्वरित प्रतिक्रिया, याहिया के लिए बहुत बहुत धन्यवाद। तो, आइए, मान लें कि मैं एक ** CustomCertificateValidator ** को कार्यान्वित करना चाहता हूं जो कि जब मैं ** कस्टम प्रमाणपत्र प्रमाणक ** का उपयोग नहीं करता हूं तो डिफ़ॉल्ट व्यवहार की नकल करता है लेकिन विश्वसनीय लोगों में प्रमाणपत्र स्टोर में मैन्युअल रूप से रूट प्रमाणपत्र जोड़ दिया है। मैं अपने ** कस्टम प्रमाणपत्र प्रमाण पत्र ** में क्या रखूंगा? संभावित रूप से डिफ़ॉल्ट व्यवहार विश्वसनीय सर्वर में रूट प्रमाण के विरुद्ध ** serverCert ** का मूल्यांकन करता है, ठीक है, और क्लाइंट को प्रतिक्रिया प्राप्त करने देता है।यह मूल्यांकन करने के लिए यह क्या करता है? धन्यवाद, स्टीव। – Steve

+0

ग्राहक यहां क्या संदर्भित करता है (क्लाइंट। सेवा प्रमाणपत्र में कहें।), कृपया कृपया? बहुत धन्यवाद। – iTSrAVIE

+1

यह एक नामस्थान नहीं है। यह कोड मानता है कि यह System.ServiceModel.ClientBase <> से व्युत्पन्न कक्षा में निहित है और यह "क्लाइंटबेस" खुलासा करता है, जो कि 'क्लाइंट क्रेडेंशियल्स' संपत्ति कहता है, जिस पर आप कर सकते हैं। 'सेवा प्रमाणपत्र' तब 'प्रमाणीकरण' फिर '। सर्टिफिकेट वैलिडेशन मोड "और इसी तरह। अगर आपको बिल्कुल पता होना चाहिए, तो सेवा प्रमाणपत्र एक कक्षा X509CertificateRecipientClientCredential है – quetzalcoatl

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