2015-07-03 15 views
21

मैं एक WCF सेवा है कि एक ग्राहक है कि मेरे द्वारा विकसित नहीं है द्वारा सेवन किया जा करने के लिए है और यह भी कि यह नेट (संभवतः जावा) नहीं है पर काम कर रहा हूँ।WCF साथ म्युचुअल एसएसएल प्रमाणीकरण: कोई CertificateRequest और हाथ मिलाना चरण में CertificateVerify

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

मेरे समस्या यह है कि मैं सही WCF विन्यास इस तरह प्राप्त करने के लिए है कि क्लाइंट प्रमाणपत्र प्रमाणीकरण ठीक से काम करता नहीं कर पा रहे है।

enter image description here

इसके बाद ग्राहक को एक `प्रमाण पत्र अन्य बातों के अलावा सत्यापित करें 'के साथ उत्तर देना चाहिए: क्या मैं उम्मीद TLS हैंडशेक के भाग के रूप, सर्वर भी एक Certificate Request शामिल है कि, जैसा कि नीचे देखा है:

enter image description here

(नवीनतम) सेवा कॉन्फ़िगरेशन यह एक है। मैं कस्टम बाध्यकारी का उपयोग कर रहा हूं, प्रमाणीकरण मोड MutualSslNegotiated पर सेट है।

<bindings> 
    <customBinding> 
    <binding name="CarShareSecureHttpBindingCustom"> 
     <textMessageEncoding messageVersion="Soap11" /> 
     <security authenticationMode="MutualSslNegotiated"/> 
     <httpsTransport requireClientCertificate="true" /> 
    </binding> 
    </customBinding> 
</bindings> 

... 

<serviceBehaviors> 
    <behavior name="ServiceBehavior"> 
    <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" /> 
    <serviceDebug includeExceptionDetailInFaults="false" httpHelpPageEnabled="false" /> 
    <serviceCredentials> 
     <serviceCertificate findValue="..." storeLocation="LocalMachine" x509FindType="FindByIssuerName" storeName="My" /> 
     <clientCertificate> 
     <certificate findValue="..." storeName="My" storeLocation="LocalMachine" x509FindType="FindByIssuerName"/> 
     </clientCertificate> 
    </serviceCredentials> 
    </behavior> 
</serviceBehaviors> 

हैंडशेक का सर्वर हैलो हिस्सा इस तरह की सभी सेवा कॉन्फ़िगरेशन के लिए ऐसा प्रतीत होता है, मैंने प्रमाणपत्र प्रमाणपत्र की आवश्यकता नहीं है। enter image description here

अन्य चीजें मैं उल्लेख करना चाहिए:

  • सेवा स्वयं की मेजबानी की और एक गैर डिफ़ॉल्ट पोर्ट (नहीं 443) पर सुन रहा है। सर्वर एसएसएल प्रमाणपत्र इस बंदरगाह से जुड़ा हुआ है।
  • मैंने basicHttpBinding और wsHttpBidning को सुरक्षा मोड के साथ Transport पर सेट किया है और क्लाइंट प्रमाणीकरण Certificate पर सेट किया है, बिना किसी परिणाम (वास्तव में परिणाम)।

कोई भी विचार की सराहना की जाएगी।

+0

आप WCF अनुरेखण सक्षम करने के लिए प्रयास किया था और अगर वहाँ किसी भी विस्तृत त्रुटियों कर रहे हैं? – UserControl

+0

@UserControl: हाँ, ट्रेसिंग सक्षम है लेकिन दुर्भाग्यवश कोई संबंधित त्रुटियां नहीं हैं। –

+0

जंगली शॉट - सर्वर साइड पर लापता क्लाइंट प्रमाण ट्रस्ट श्रृंखला से कुछ रूट प्रमाण पत्र हैं? यही है, आपके पास ग्राहक का प्रमाण है, लेकिन इसकी श्रृंखला में कुछ रूट कर्ट गायब हैं ...? –

उत्तर

11

ठीक है, कुछ और प्रयासों के बाद मैंने इसे समझ लिया। दूसरों को एक ही मुद्दे में चलाने के मामले में इसे पोस्ट करना।

मुझे यह उल्लेख करना जारी रखना चाहिए कि इस व्यवहार को वास्तव में एमएसडीएन पर कहीं भी उल्लेख किया जाना चाहिए, जो किसी भी ऐसे स्थान पर है जो वास्तव में डब्ल्यूसीएफ सुरक्षा जानकारी की तलाश में किसी के लिए दिखाई दे रहा है और कुछ टूल के दस्तावेज में गहरी दफन नहीं किया गया है।

प्लेटफार्मों जहाँ मैं पुन: पेश और इसे ठीक कर लिया है: Windows 8.1 x64 और Windows Server 2008 R2 मानक।

जैसा कि मैंने उल्लेख किया है, मेरी समस्या यह है कि मैं कॉन्फ़िगर नहीं कर सका WCF सुरक्षा ऐसी है कि सेवा क्लाइंट प्रमाण पत्र की आवश्यकता होगी था। एक समाधान की तलाश करते समय मैंने देखा कि एक आम भ्रम यह है कि बहुत से लोग मानते हैं कि क्लाइंट प्रमाण पत्र भेज सकता है यदि यह है, तो बिना छेड़छाड़ की गई। यह निश्चित रूप से मामला नहीं है - सर्वर को पहले इसके लिए पूछना होगा और इसके अलावा, निर्दिष्ट करें कि कौन से सीए को through a CertificateRequest reply की अनुमति है।

संक्षेप में, मेरी स्थिति थी:

  • सेवा स्वयं के द्वारा होस्ट है।
  • सेवा गैर मानक पोर्ट (443 लेकिन 9 000 नहीं) पर HTTPS पर चलता है।

इसका मतलब था कि मुझे netsh.exe http add sslcert का उपयोग कर पोर्ट 9000 के लिए बाध्यकारी SSL प्रमाणपत्र बनाना था। खैर, बाध्यकारी बनाया गया था लेकिन एक पकड़ था। मैं केवल बस अपना बंधन पर जांच करने के netsh http show sslcert चलाने के बाद मुद्दा पाया:

IP:port      : 0.0.0.0:9000 
Certificate Hash    : ... 
Application ID    : ... 
Certificate Store Name  : MY 
Verify Client Certificate Revocation : Enabled 
Verify Revocation Using Cached Client Certificate Only : Disabled 
Usage Check     : Enabled 
Revocation Freshness Time : 0 
URL Retrieval Timeout  : 0 
Ctl Identifier    : (null) 
Ctl Store Name    : (null) 
DS Mapper Usage    : Disabled 
-->Negotiate Client Certificate : Disabled 

अपराधी, बंधन के अंतिम संपत्ति थी "क्लाइंट प्रमाणपत्र निगोशिएट", here प्रलेखित। जाहिर है, डिफ़ॉल्ट रूप से, यह संपत्ति अक्षम है। बाध्यकारी बनाते समय आपको इसे स्पष्ट रूप से सक्षम करने की आवश्यकता है।

बयान के साथ बंधन पुनः नीचे समस्या हल हो जाती: बाइंडिंग मैं आईआईएस में एक साधारण WCF सेवा की मेजबानी और वहाँ से क्लाइंट प्रमाणपत्र प्रमाणीकरण सक्षम करने की कोशिश की जाँच करने के लिए

netsh.exe http add sslcert ipport=0.0.0.0:9000 certhash=... appid=... certstorename=MY verifyclientcertrevocation=Enable VerifyRevocationWithCachedClientCertOnly=Disable UsageCheck=Enable clientcertnegotiation=Enable 

पहले। यह देखने के लिए बहुत उत्सुक था कि हालांकि आईआईएस द्वारा जारी CertificateRequest नहीं था, फिर भी यह 403.7 के साथ विफल रहा। यहां तक ​​कि आईआईएस ने उचित मानकों के साथ बाध्यकारी नहीं बनाया।

वैसे भी, अब यह काम करता है और इस तरह आप इसे ठीक कर सकते हैं।

नहीं भूल जाते हैं, सेवा विन्यास क्रम में रूप में अच्छी तरह (बाध्यकारी सुरक्षा) बदल प्रमाण पत्र बातचीत अनुमति देने के लिए:

<customBinding> 
    <binding name="CustomHttpBindingCustom" receiveTimeout="01:00:00"> 
    <textMessageEncoding messageVersion="Soap11" /> 
    <security authenticationMode="SecureConversation" requireSecurityContextCancellation="true"> 
     <secureConversationBootstrap allowInsecureTransport="false" authenticationMode="MutualSslNegotiated" requireSecurityContextCancellation="true"></secureConversationBootstrap> 
    </security> 
    <httpsTransport requireClientCertificate="true" /> 
    </binding> 
</customBinding> 
संबंधित मुद्दे