2013-02-05 12 views
6

के साथ एक HTTPS URL तक पहुंचने के लिए यहां एक विषम समस्या का बिट। स्क्रिप्ट हम प्रयोग कर रहे है:पावरशेल में System.Net.WebClient का उपयोग SAN प्रमाणपत्र

$username = "itrpo" 
$url = "https://homepages.domain.com/cgi-bin/checkperms.cgi?user=$username" 
$homepagesUser = "REMOVED" 
$homepagesPass = "REMOVED" 
$webclient = New-Object System.Net.WebClient 
$webclient.Credentials = new-object System.Net.NetworkCredential($homepagesUser, $homepagesPass) 
$result = $webclient.DownloadString($url) 

जब मेरे डेस्कटॉप से ​​चल रहा है (Windows 8, PowerShell v3 नेट v4.0.30319 का प्रयोग करके) यह काम करता है। किसी सर्वर से इसे चलाने पर (Windows Server 2008 R2, PowerShell v2 .NET v2.0.50727 का उपयोग करके) यह नहीं करता है। आखिरकार यह लटकता है और त्रुटि देता है: "1" तर्क के साथ "डाउनलोडस्ट्रिंग" को अपवाद: "ऑपरेशन का समय समाप्त हो गया है"

नेटमोन का उपयोग करके मैं यह निर्धारित करने में कामयाब रहा कि सर्वर पर यह किसी भी टीएलएस को करने में विफल रहा था ग्राहक कुंजी विनिमय।

homepages.domain.com के लिए SSL प्रमाणपत्र वास्तव में एक SAN प्रमाणपत्र है, वास्तविक सर्वर नाम के लिए होमपेज एक उपनाम है (चलिए इसे servera.domain.com कहते हैं)। जब मैं स्क्रिप्ट में $ url बदल इतनी के रूप में वास्तविक सर्वर नाम का उपयोग करें:

$url = "https://servera.domain.com/cgi-bin/checkperms.cgi?user=$username" 

... यह काम किया, लेकिन यह आदर्श (यदि सेवा किसी अन्य मशीन स्क्रिप्ट टूट जाएगा करने के लिए ले जाया जाता है) नहीं है।

ऐसा लगता है कि PowerShell v2 (.NET v2) को SAN प्रमाणपत्र के साथ समस्याएं आ रही हैं? इसका समर्थन करने के लिए और सबूत यह है कि हम उपरोक्त स्टाइल स्क्रिप्ट का उपयोग किसी अन्य सर्वर के खिलाफ एक मानक SSL प्रमाणपत्र के साथ करते हैं जो ठीक से संचार करता है।

क्या यह वेब क्लाइंट क्लास में भिन्नता के कारण हो सकता है? http://msdn.microsoft.com/en-us/library/system.net.webclient%28v=vs.80%29.aspx और .NET v4 के तहत इसके लिए प्रलेखन: http://msdn.microsoft.com/en-us/library/system.net.webclient%28v=vs.100%29.aspx

मैं प्रोग्रामिंग वास्तव में ऊपर प्रलेखन ठीक से समझने के लिए कुछ पर्याप्त जानकारी नहीं है (या अगर मैं जानता हूँ कि यहाँ नेट वी 2 के तहत इसके लिए प्रलेखन है मैं सही रास्ते पर हूँ)।

आदर्श रूप से हम चाहते हैं कि स्क्रिप्ट चीजों को अपग्रेड किए बिना PowerShell v2 और .NET v2 के अंतर्गत काम करे या PowerShell को .NET v4 का उपयोग करने के लिए मजबूर करें। अगर मेरा संदेह सही है तो क्या ऐसा पैरामीटर है जिसे हम इस मुद्दे को "ठीक करने" के लिए स्क्रिप्ट को संशोधित करने का तरीका निर्दिष्ट कर सकते हैं?

किसी भी सलाह के लिए बहुत धन्यवाद।

+0

इसके बारे में काम कर रहे पूर्ण स्रोत कोड नमूने के साथ कोई अंतिम समाधान? – Kiquenet

+0

दुख की बात नहीं। मुझे काम करने के लिए नीचे दिए गए सुझाव नहीं मिल सका। हम सर्वर 2012 और पावरशेल v3 पर स्क्रिप्ट माइग्रेट कर रहे हैं। – Robin

+0

पीएस v3 का उपयोग कर कोई नमूना? – Kiquenet

उत्तर

4

मेरा झुकाव यह है कि यह PowerShell संस्करण (या सामान्य रूप से अंतर्निहित प्लेटफॉर्म विवरण) से कम है और प्रमाण पत्र और HTTPS हैंडशेक से संबंधित है। यह हो वहाँ वैकल्पिक विषय के नाम एक प्रमाणपत्र में एम्बेड को पहचानने में सुधार हो सकता था, लेकिन परीक्षण करने के लिए एक आसान तरीका यह अपनी स्क्रिप्ट में PowerShell की इस पंक्ति को जोड़ने के लिए होगा:

[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true } 

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

आप एमएसडीएन पृष्ठ पर ServerCertificateValidationCallback पर अधिक जानकारी देख सकते हैं जिसमें यह प्रतिनिधिमंडल में पास पैरामीटर शामिल है। आप सिद्धांत में केवल उस सर्वर पर उपयोग किए जा रहे प्रमाण पत्र को श्वेतसूची में डाल सकते हैं और उस के लिए सत्य लौट सकते हैं।

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