2011-04-11 21 views
6

में वेब क्लाइंट में प्रमाणपत्र कैसे जोड़ सकते हैं मैं क्लाइंट साइड सर्टिफिकेट प्रमाणीकरण की आवश्यकता वाले वेबपृष्ठ की जांच नहीं करना चाहता हूं। मैं अपने प्रमाण को सर्टस्टोर से वेबरेक्वेस्ट में कैसे प्रदान कर सकता हूं: प्रॉक्सी के भीतर Credentials odr में इसे निर्दिष्ट करने का कोई तरीका है?पावरहेल

$webclient = New-Object Net.WebClient 
# The next 5 lines are required if your network has a proxy server 
$webclient.Credentials = [System.Net.CredentialCache]::DefaultCredentials 
if($webclient.Proxy -ne $null)  { 
    $webclient.Proxy.Credentials = ` 
      [System.Net.CredentialCache]::DefaultNetworkCredentials 
} 
# This is the main call 
$output = $webclient.DownloadString("$URL") 

पुनश्च: हो सकता है कि इस मदद करता है: How can you add a Certificate to WebClient (C#)? लेकिन मैं यह नहीं मिलता है .. ;-)

+0

एसओ सवाल का मतलब यह है कि आपको या तो सीधे HttpWebRequest का उपयोग करना होगा, या वेब क्लाइंट को ओवरराइड करना होगा ताकि आप प्रमाणपत्र जोड़ सकें। – JasonMArcher

उत्तर

10

PowerShell v2 में नए Add-Type कार्यक्षमता का उपयोग करना, आप एक कस्टम वर्ग तैयार कर सकते हैं कि आप तो उपयोग कर सकते हैं अपने ठेठ WebRequest बनाने के लिए। मैंने कस्टम क्लास पर एक विधि शामिल की है ताकि आपको प्रमाण पत्र जोड़ने की अनुमति मिल सके जिसका प्रमाणीकरण के लिए उपयोग किया जा सके।

PS C:\> $def = @" 
public class ClientCertWebClient : System.Net.WebClient 
{ 
    System.Net.HttpWebRequest request = null; 
    System.Security.Cryptography.X509Certificates.X509CertificateCollection certificates = null; 

    protected override System.Net.WebRequest GetWebRequest(System.Uri address) 
    { 
     request = (System.Net.HttpWebRequest)base.GetWebRequest(address); 
     if (certificates != null) 
     { 
      request.ClientCertificates.AddRange(certificates); 
     } 
     return request; 
    } 

    public void AddCerts(System.Security.Cryptography.X509Certificates.X509Certificate[] certs) 
    { 
     if (certificates == null) 
     { 
      certificates = new System.Security.Cryptography.X509Certificates.X509CertificateCollection(); 
     } 
     if (request != null) 
     { 
      request.ClientCertificates.AddRange(certs); 
     } 
     certificates.AddRange(certs); 
    } 
} 
"@ 

PS C:\> Add-Type -TypeDefinition $def 

आप शायद सीमित करने के लिए प्रमाण पत्र सिर्फ एक (या वाले) में जोड़ा जा रहा आप बल्कि उपयोग करने के लिए की तुलना में सिर्फ वर्तमान उपयोगकर्ता की दुकान में हर उपलब्ध प्रमाण पत्र का उपयोग करना चाहते हैं, लेकिन यहाँ चाहेगा एक उदाहरण है कि अभी उन सभी को लोड करता है:

PS C:\> $wc = New-Object ClientCertWebClient 
PS C:\> $certs = dir cert:\CurrentUser\My 
PS C:\> $wc.AddCerts($certs) 
PS C:\> $wc.DownloadString("http://stackoverflow.com") 
+0

यह बिल्कुल सही है! आपका बहुत बहुत धन्यवाद! – icnivad