2009-05-12 7 views
12

तो मुझे एक सेवा संदर्भ को सी # कंसोल एप्लिकेशन में जोड़ा गया है जो ओरेकल से उजागर की गई एक वेब सेवा को कॉल करता है।एक सी # क्लाइंट लागू करें जो SSL पर WebServices का उपयोग करता है?

मुझे सबकुछ सेटअप मिला है और यह एसएसएल (http) का उपयोग नहीं करते समय आड़ू की तरह काम करता है। मैं अब SSL का उपयोग करके इसे सेट अप करने का प्रयास कर रहा हूं, और मैं इसे सेवा संदर्भ (या यहां तक ​​कि वेब संदर्भ) में जोड़ने के साथ समस्याओं में भाग रहा हूं। उदाहरण के लिए, जब URL को विजुअल स्टूडियो में जोड़ने का प्रयास किया जाता है, तो यूआरएल (https) जिस पर सेवा का खुलासा किया जा रहा है, उचित वेब विधियों को वापस नहीं कर रहा है।

अंतर्निहित कनेक्शन बंद था: प्रेषण पर एक अनपेक्षित त्रुटि हुई। परिवहन स्ट्रीम से एक अप्रत्याशित ईओएफ या 0 बाइट प्राप्त हुआ। मेटाडाटा एक संदर्भ है कि हल नहीं किया जा सकता है: 'https://srs204.mywebsite.ca:7776/SomeDirectory/MyWebService?WSDL'

एक और व्याकुलता मुझे मिल गया है प्रमाण पत्र प्रबंधन और तैनाती के संबंध में है। मेरे पास लगभग 1000 बाहरी क्लाइंट साइटें हैं जिन्हें इस छोटी उपयोगिता का उपयोग करने की आवश्यकता होगी और उन्हें वेब सेवा से कनेक्ट करने के लिए उपयुक्त प्रमाणपत्र स्टोर में स्थापित प्रमाणपत्र की आवश्यकता होगी। इसे संभालने के लिए सबसे अच्छा तरीका सुनिश्चित नहीं है। क्या उन्हें जड़ की दुकान में रहने की ज़रूरत है?

मैंने विभिन्न विकल्पों पर वेब पर कुछ घंटों बिताए हैं लेकिन कहीं भी एक अच्छा साफ जवाब नहीं मिल सकता है।

संक्षेप में, मैं सवाल यहां की एक जोड़ी मिल गया है:

1) कोई भी दृश्य स्टूडियो कि SSL का उपयोग में वेब सेवा की स्थापना पर कुछ अच्छे संबंध हैं?

2) मुझे प्रमाणपत्र कैसे पंजीकृत करना चाहिए? यह किस स्टोर में मौजूद होना चाहिए? क्या मैं इसे पंजीकृत करने के लिए CertMgr जैसे कुछ उपयोग कर सकता हूं?

एक अच्छी किताब/ट्यूटोरियल/जो कुछ भी मुझे इस तरह कुछ स्थापित करने पर सामान्य अच्छे प्रथाओं को दिखाएगा। मुझे बस यह नहीं लग रहा है!

+0

क्या आपने उस व्यक्ति से जांच की जिसने वेब साइट बनाई है यह देखने के लिए कि यह उनके अंत में कैसे कॉन्फ़िगर किया गया है? –

+0

वे इस बिंदु पर एक ही इमारत में हैं, इसलिए यदि यह कुछ सर्वर से संबंधित है, तो मैं इसे बदल सकता हूं। मैं ब्राउज़र में https यूआरएल खींच सकता हूं और यह मुझे मानक ओरेकल वेब सेवा परीक्षण पृष्ठ दिखाता है। तो मैं इसे मार सकता हूँ। जब मैं उस यूआरएल को दबाता हूं तो मुझे प्रमाण पत्र स्वीकार करने के लिए कहा जाता है। मुझे दो .cer फ़ाइलों (विकास सर्वर के लिए एक, उत्पादन सर्वर के लिए एक) के साथ प्रदान किया गया है, जिसे पंजीकृत होने की आवश्यकता होगी। –

+1

यदि आप ब्राउज़र में यूआरएल (https) खोलते हैं, तो क्या आप देखते हैं कि आप क्या उम्मीद करेंगे? क्या अन्य लोग बिना किसी समस्या के https पर इस सेवा का उपयोग कर रहे हैं? मुझे यकीन नहीं है कि ऑरैकल वेब सर्विसेज कैसे काम करता है, लेकिन यदि यह आईआईएस पर या उसके माध्यम से होस्ट किया गया है, तो आपको डोमेन नाम (webservice.servicehost.com) को एसएसएल होस्ट हेडर के रूप में जोड़ना होगा। – Nate

उत्तर

28

ठीक है, मैंने इसे समझ लिया है। मुझे इससे ज्यादा समय लगता है कि मुझे बात करने की परवाह है, लेकिन मैं अपना समाधान साझा करना चाहता था क्योंकि यह मानक देखने के लिए मेरा एक बड़ा पालतू शिखर है। "ओह मैंने इसे ठीक किया! धन्यवाद!" पोस्ट जो हर किसी को वास्तव में क्या हुआ पर लटका छोड़ देता है।

तो।

जड़ समस्या यह है कि डिफ़ॉल्ट दृश्य स्टूडियो 2008 एसएसएल हाथ मिलाना और Oracle/जावा आधारित वेब सेवा है कि मैं करने के लिए उपयोग कर रहा था SSL3 कनेक्ट करने के लिए कोशिश कर रहा था के लिए TLS का उपयोग करता था।

आप "जोड़ें सेवा संदर्भ ..." विजुअल स्टूडियो 2008 में उपयोग करते हैं, आप SSL3 होना चाहिए सेवा बिंदु प्रबंधक के लिए no way to specify that the security protocol है।

जब तक।

आप एक स्थिर WSDL दस्तावेज़ और use wsdl.exe to generate a proxy class ले।

wsdl /l:CS /protocol:SOAP /namespace:MyNamespace MyWebService.wsdl 

तो फिर तुम एक पुस्तकालय (.dll) में जो प्रॉक्सी वर्ग कर देते हैं और "संदर्भ" अपने नेट परियोजनाओं में जोड़ने के लिए C Sharp Compiler उपयोग कर सकते हैं।

csc /t:library /r:System.Web.Services.dll /r:System.Xml.dll MyWebService.cs 
इस बिंदु आप यह भी सुनिश्चित है कि आप अपने "संदर्भ" में System.Web.Services को शामिल किया है और साथ ही बनाने की जरूरत पर

अब आप कोड में एक मुद्दा बिना अपने वेब सेवा को कॉल करने के लिए सक्षम होना चाहिए। इसे काम करने के लिए आपको सेवा को तुरंत चालू करने से पहले कोड की एक जादू रेखा की आवश्यकता होगी।

// We're using SSL here and not TLS. Without this line, nothing workie. 
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 

ठीक है, इसलिए मैं अपने देव बॉक्स पर परीक्षण बहुत अच्छा था क्योंकि मैं अपने आप से बहुत प्रभावित महसूस कर रहा था। फिर मैंने किसी अन्य क्लाइंट बॉक्स पर तैनात किया और यह अनुमति/प्राधिकरण समस्या के कारण फिर से कनेक्ट नहीं होगा। यह मुझे प्रमाण पत्र की तरह गंध करता है (जो भी वे गंध करते हैं)। इसे हल करने के लिए, मैं स्थानीय मशीन पर विश्वसनीय रूट पर साइट के लिए प्रमाण पत्र पंजीकृत करने के लिए used certmgr.exe

certmgr -add -c "c:\someDir\yourCert.cer" -s -r localMachine root 

यह मुझे प्रमाण पत्र को हमारे क्लाइंट साइटों में वितरित करने और उपयोगकर्ताओं के लिए स्वचालित रूप से इंस्टॉल करने की अनुमति देता है। मुझे अभी भी यकीन नहीं है कि कैसे "सुरक्षा अनुकूल" विंडोज़ के विभिन्न संस्करण स्वचालित प्रमाणपत्र पंजीकरण के संबंध में होंगे, लेकिन यह अब तक बहुत अच्छा काम करता है।

आशा इस जवाब कुछ लोगों में मदद करता है। इस पर आपकी सभी मदद के लिए भी उड़ाने के लिए धन्यवाद और कुछ अंतर्दृष्टि प्रदान करना।

+1

यदि आप इसके साथ आते हैं तो हमेशा अपने प्रश्नों का उत्तर दें। तुमने मुझे सर बचा लिया है (मेरे पास एक वेब सर्वर विज्ञापन था जो टीएलएस समर्थित था। पता चला कि यह नहीं था!) ​​ – DFTR

+0

मैं बस एसओ ब्राउज़ कर रहा था। इस पर वास्तव में कोई सवाल नहीं था, लेकिन आपका संकल्प देखने में बहुत खुशी हुई। ऐसा लगता है कि इसमें बहुत सारे शोध हुए। महान स्पष्टीकरण! धन्यवाद! – jason

+0

सुनकर बहुत खुशी हुई कि मैंने किसी की मदद की और उम्मीद है कि थोड़ा दर्द बचाया! :) –

4

ऐसा लगता है कि वेब सेवा स्वयं हस्ताक्षरित प्रमाणपत्र का उपयोग कर रही है। स्पष्ट रूप से यह सबसे अच्छा तरीका नहीं है।

मान लें कि आप एक बड़े संगठन हैं और यह आंतरिक है आप अपना खुद का विश्वसनीय प्रमाणपत्र प्राधिकरण स्थापित कर सकते हैं, यह Active Directory के साथ विशेष रूप से आसान है। उस सीए से ओरेकल सेवा की मेजबानी करने वाला सर्वर प्रमाण पत्र का अनुरोध कर सकता है और आप मशीन स्टोर के विश्वसनीय रूट में रखकर अपने आंतरिक सीए के रूट प्रमाणपत्र पर भरोसा करने के लिए एडी नीति का उपयोग कर सकते हैं। यह वेब सेवा पर प्रमाणपत्र को मैन्युअल रूप से भरोसा करने या स्वीकार करने की आवश्यकता को हटा देगा।

यदि क्लाइंट मशीन बाहरी हैं तो आपको या तो Verisign, Thawte, GeoTrust आदि जैसे किसी प्रसिद्ध सीए से "वास्तविक" प्रमाण पत्र खरीदने के लिए सेवा का खुलासा करने वाले लोगों को प्राप्त करना होगा या भाग के रूप में अपने इंस्टॉल का सार्वजनिक प्रमाणपत्र बंडल करें और इसे प्रत्येक मशीन पर मशीन स्तर पर विश्वसनीय रूट प्रमाणपत्र प्राधिकरणों में स्थापित करें। इसमें समस्याएं हैं, उदाहरण के लिए प्रमाणपत्र को निरस्त करने का कोई तरीका नहीं है, लेकिन प्रॉम्प्ट को हटा देगा।

+0

प्रतिक्रिया के लिए धन्यवाद! मुझे दो प्रमाणपत्र प्रदान किए गए हैं। "विकास" सर्वर के लिए एक और "उत्पादन" सर्वर के लिए दूसरा। हमारी ग्राहक साइटें बाहरी हैं इसलिए मुझे मैन्युअल रूप से कर्ट पंजीकृत करने की चिंता करनी होगी। भरोसेमंद रूट मशीन स्टोर में लाने के लिए सबसे अच्छे तरीके से कोई भी अच्छा लिंक? उत्पादन प्रमाण पत्र जीटीई साइबर ट्रस्ट से है और यह एक वैश्विक रूट प्रमाण पत्र है जिसमें सभी जारी करने वाली नीतियां और सभी आवेदन नीतियां शामिल हैं। –

+1

तो आपको लाइव सर्वर के बारे में चिंता करने की आवश्यकता नहीं होगी, फिर यह बॉक्स से बाहर काम करेगा क्योंकि जीटीई एक विश्वसनीय रूट है (मुझे लगता है कि आप थोड़ा उलझन में हैं - यह संभावना नहीं है कि लाइव सर्वर के पास इसका रूट प्रमाण है, यह है शायद सिर्फ एक सामान्य प्रमाण)। जांचने के लिए मैं लाइव सेवा का संदर्भ जोड़ूंगा और देखें कि क्या होता है। यदि यह सब अच्छा है तो देव के लिए आपको केवल अपनी मशीन पर प्रमाण स्थापित करने की आवश्यकता है। एमएमसी शुरू करें और स्थानीय मशीन का उपयोग करने के लिए कह रहे हैं, cerificates snapin जोड़ें। फिर विश्वसनीय रूट में देव प्रमाण आयात करें। – blowdart

+0

गोचा। मैंने एमएमसी चलाया है, यह सुनिश्चित करने के लिए कि प्रमाणपत्र कंप्यूटर को स्थानीय कंप्यूटर के लिए "विश्वसनीय रूट" में जोड़ा गया है, प्रमाण पत्र स्नैप-इन का उपयोग किया गया है। अभी भी सेवा के विकास संस्करण से कनेक्ट नहीं हो सकता है। मैं वास्तव में उत्पादन संस्करण के खिलाफ परीक्षण नहीं कर सकता क्योंकि हम अभी तक विकास से बाहर नहीं हैं। मैं उन्हें मेरे लिए कुछ सेट अप करने की कोशिश करने में सक्षम हो सकता हूं। क्या विकास का प्रमाण पत्र उनके अंत में कुछ गलत हो सकता है? अगर मुझे अपने सिस्टम पर सही प्रमाणपत्र स्थापित है, तो मुझे त्रुटि के बिना HTTPS सेवा संदर्भ जोड़ने में सक्षम होना चाहिए? –

1

चटाई, और मैं

मैं ऐसे मुद्दों भी था एक तरह से एक दूरस्थ मशीन पर विश्वसनीय रूट करने के लिए प्रमाणपत्र जोड़ने certmgr.exe का उपयोग कर से बचने के लिए किया है।

X509Store store; 
store = new X509Store("ROOT", StoreLocation.LocalMachine); 
store.Open(OpenFlags.ReadWrite); 
store.Add(certificate); 

'प्रमाण पत्र वस्तु' इस तरह बनाया जा सकता है:

X509Certificate2 certificate = new X509Certificate2("Give certificate location path here"); 
+0

हे प्रतिक्रिया के लिए धन्यवाद! हम पहले से ही हमारी क्लाइंट साइटों पर एक कस्टम स्क्रिप्ट के साथ तैनात हैं जो certmgr.exe का उपयोग कर रहा है लेकिन मुझे यह समाधान बहुत बेहतर लगता है। अगली बार एक बदलाव होने पर हम उस कोड में वापस खोदने पर इसे एक शॉट देंगे। –

1

इस महान टिप के लिए धन्यवाद, अपना सामान पर चारों ओर एक नज़र ले लिया और आप अच्छा विचारों का एक बहुत कुछ चल रहा है। यहां जोड़ने के लिए मेरा थोड़ा सा तरीका है - मैं वेबमाइड्स को समझ रहा हूं और (आश्चर्य!) यह वही समस्या है जैसे ओरेकल ऐप सर्वर से आप जुड़े हैं (टीएलएस के बजाय एसएसएल 3)। आपका दृष्टिकोण बहुत अच्छा काम करता है, यहां मेरा परिशिष्ट है।

को देखते हुए स्थिर वर्ग "फैक्टरी," इन दोनों काम-बांका आइटम प्रदान करते हैं:

/// <summary> 
/// Used when dispatching code from the Factory (for example, SSL3 calls) 
/// </summary> 
/// <param name="flag">Make this guy have values for debugging support</param> 
public delegate void CodeDispatcher(ref string flag); 

/// <summary> 
/// Run code in SSL3 -- this is not thread safe. All connections executed while this 
/// context is active are set with this flag. Need to research how to avoid this... 
/// </summary> 
/// <param name="flag">Debugging context on exception</param> 
/// <param name="dispatcher">Dispatching code</param> 
public static void DispatchInSsl3(ref string flag, CodeDispatcher dispatcher) 
{ 
    var resetServicePoint = false; 
    var origSecurityProtocol = System.Net.ServicePointManager.SecurityProtocol; 
    try 
    { 
    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3; 
    resetServicePoint = true; 
    dispatcher(ref flag); 
    } 
    finally 
    { 
    if (resetServicePoint) 
    { 
     try { System.Net.ServicePointManager.SecurityProtocol = origSecurityProtocol; } 
     catch { } 
    } 
    } 
} 

और फिर इस सामग्री का उपभोग करने के (के रूप में आप कोई संदेह नहीं है पहले से ही अनुमान लगाया है, लेकिन वैसे भी यहाँ में एक ड्रम रोल डाल) :

var readings = new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading[] { 
     new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() { 
     attrID = 1, created = DateTime.Now.AddDays(-1), reading = 17.34, userID = 2 
     }, 
     new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() { 
     attrID = 2, created = DateTime.Now.AddDays(-2), reading = 99.76, userID = 3 
     }, 
     new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() { 
     attrID = 3, created = DateTime.Now.AddDays(-5), reading = 82.17, userID = 4 
     } 
    }; 
    ArchG2.Portal.Utils.wmArchG201.Factory.DispatchInSsl3(ref flag, (ref string flag_inner) => 
    { 
     // creates the binding, endpoint, etc. programatically to avoid mucking with 
     // SharePoint web.config. 
     var wsFireWmdReading = ArchG2.Portal.Utils.wmArchG201.Factory.Get_fireWmdReading(ref flag_inner, LH, Context); 
     wsFireWmdReading.fireWmdReading(readings); 
    }); 

यह चाल है - जब मुझे कुछ और समय मिलता है तो मैं थ्रेडिंग समस्या (या नहीं) को हल करूंगा।

+0

+1 - बहुत बढ़िया। कभी-कभी इन प्रकार की अस्पष्ट त्रुटियों और फिक्सेस को ढूंढना मुश्किल होता है। पोस्टिंग और कुडोस के लिए धन्यवाद! –

1

जब से मैं टिप्पणी करने के लिए कोई प्रतिष्ठा है, मैं SSL3 मजबूर कर के लिए चटाई Nadrofsky के जवाब और कोड नमूना भी

के समान एक त्रुटि के लिए समाधान है, जबकि बनाने के दौरान त्रुटि हुई है कि उल्लेख करना चाहते हैं HTTP अनुरोध https://xxxx/whatever पर। यह इस तथ्य के कारण हो सकता है कि सर्वर प्रमाणपत्र को HTTPS मामले में HTTP.SYS के साथ ठीक से कॉन्फ़िगर नहीं किया गया है। यह क्लाइंट और सर्वर के बीच सुरक्षा बाध्यकारी की मेलसमूह के कारण भी हो सकता है।

बस

// We're using SSL here and not TLS. Without this line, nothing workie. 
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 

का उपयोग के रूप में चटाई द्वारा उल्लेख किया है। HTTPS में एक एसएपी नेटवेवर पीआई सर्वर के साथ परीक्षण किया गया। धन्यवाद!

+0

अरे, पोस्टिंग और खुशी के लिए धन्यवाद मैं मदद कर सकता हूं !! :) –

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