2012-07-13 14 views
5

के साथ हैंडशेक को पूरा करने में असमर्थ है। मेरे पास एक पूरी तरह से परिचालन प्रणाली है जहां openssl आधारित क्लाइंट एक openssl सर्वर से इंटरैक्ट करते हैं। प्रत्येक ग्राहक का अपना प्रमाणपत्र होता है जो सर्वर द्वारा मान्य होता है। Openssl (X509, पेम) के साथ प्रमाण पत्र उत्पन्न किए गए हैं। वे स्वयं हस्ताक्षरित हैं।एसएसएलस्ट्रीम क्लाइंट स्टनल सर्वर

अब मैं एसएसएलस्ट्रीम के आधार पर एक परीक्षण क्लाइंट लिखना चाहता हूं। मैंने एसएसएलस्ट्रीम क्लास documentation से क्लाइंट उदाहरण का उपयोग किया।

मेरा एसएसएलस्ट्रीम क्लाइंट हैंडशेक को पूरा करने में असमर्थ है। स्टनल ने क्लाइंट के बारे में शिकायत शिकायत नहीं की है। यह वायर्सहार्क में पुष्टि की गई है (हैंडशेक संदेशों में प्रमाणपत्र लंबाई: 0)।

इनर अपवाद:

मेरे क्लाइंट निम्न अपवाद को प्रदर्शित करता है

X509Certificate cert = new X509Certificate2(filename, password); 
X509CertificateCollection certColl = new X509CertificateCollection(); 
certColl.Add(cert); 

: संदेश प्राप्त हुआ अप्रत्याशित या बुरी तरह से स्वरूपित

था इस तरह मैं अपने प्रमाण पत्र लोड है मैंने प्रमाणपत्र को विभिन्न गुणों को पुनर्प्राप्त करने का प्रयास किया (उदा: GetSerialNumberString())। यह काम करता हैं। सत्यापित विधि गलत लौटाती है। यह अगली बात है जिसे मैं जांचने जा रहा हूं।

मैं कैसे सेटअप मेरी SslStream कोई फर्क नहीं लगता है (एक ही परिणाम): प्रमाणीकरण के साथ

sslStream.AuthenticateAsClient(serverName); 

SslStream sslStream = new SslStream(
    client.GetStream(), 
    false, 
    new RemoteCertificateValidationCallback(ValidateServerCertificate), 
    new LocalCertificateSelectionCallback(SelectLocalCertificate)); 

ही:

sslStream.AuthenticateAsClient(serverName); 

sslStream.AuthenticateAsClient(serverName, 
    certColl, 
    SslProtocols.Tls, 
    true); 

SelectLocalCertificate कहा जाता है (दो बार) और मेरे प्रमाण पत्र देता हो जाता है। ValidateServerCertificate वर्तमान में कभी नहीं कहा जाता है (मेरे आश्चर्य के लिए)।

मैं इसे कैसे डीबग कर सकता हूं? यदि आप मेरी समस्या का सामना कर सकते हैं तो भी बेहतर होगा।

अद्यतन

मैं प्रलेखन से X509Chain example के आधार पर श्रृंखला सत्यापन प्रदर्शन करने के लिए एक समारोह जोड़ लिया है। यह प्रमाण पत्र के बारे में जानकारी के सभी प्रकार प्रदर्शित करता है, दो पेचीदा संदेशों सहित:

Element certificate is valid: False 
Element error status length: 1 

अंत में, मैं वास्तव में जब इस बात की पुष्टि फोन की तुलना में अधिक विवरण नहीं है।

openssl verify cert.pem के उत्पादन में कुछ भी असामान्य रिपोर्ट नहीं करता।

error 18 at 0 depth lookup:self signed certificate 
OK 

अद्यतन

मैं पीईएम से निजी कुंजी और प्रमाणपत्र निकाला, और मैं एक cert.pfx (PKCS12) उत्पन्न। मुझे अपने व्यक्तिगत कुंजी स्टोर में cert.pfx आयात करने में कोई समस्या नहीं थी। मेरे प्रमाणपत्र विवरण में, मैं एक संलग्न आइकन को इंगित करने वाला एक छोटा आइकन देख सकता हूं।

मैं अपने ग्राहक संशोधित मेरी निजी दुकान से प्रमाण पत्र को पुनः प्राप्त करने। लेकिन मुझे वही सटीक विफलता मिल रही है।

+0

एसएसएल क्लाइंट के लिए आपको एक प्रमाणपत्र और एक कुंजी की आवश्यकता है। आपको जांचना चाहिए कि पीईएम फ़ाइल में दोनों शामिल हैं या नहीं, अन्यथा आप एक महत्वपूर्ण हिस्सा खो रहे हैं। – Robert

+0

पीईएम में एक ---- BEGIN प्रमाण पत्र ----- ब्लॉक और निजी कुंजी ----- BEGIN आरएसए निजी कुंजी ----- ब्लॉक के तहत प्रमाणपत्र शामिल है। –

उत्तर

4

समाधान मेरी विंडोज मशीन पर मेरा सीए रूट प्रमाणपत्र आयात करना था। मेरा ग्राहक अब हैंडशेक पूरा करने में सक्षम है!

एक और पूर्ण एसएसएलस्ट्रीम उदाहरण के लिए खोज करके समाधान मिला। http://geekswithblogs.net/luskan/archive/2007/10/01/115758.aspx के लिए धन्यवाद।

+0

आपको विश्वसनीय प्राधिकरण फ़ोल्डर में विंडोज स्टोर में रूट सीए प्रमाण पत्र स्थापित करना होगा और आपको क्लाइंट प्रमाणपत्र को विंडोज स्टोर से लोड करना होगा, यह फ़ाइल से क्लाइंट प्रमाणपत्र लोड करते समय काम नहीं करता है। इसलिए क्लाइंट और सर्वर रूट सीए दोनों विंडोज स्टोर में होना चाहिए। धन्यवाद – AlexandruC

+0

विंडोज/.NET आपको एक निजी कुंजी का उपयोग करने की अनुमति नहीं देता है अगर यह प्रमाणपत्र स्टोर में नहीं है। यह डिजाइन द्वारा है। –

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