2011-04-11 12 views
6

'da nasıl sertifika ekleyebilirim? İstemci Tarafı Sertifika Kimlik Doğrulaması gerektiren bir Web sayfasını incelemem. Cert'imi Certstore'dan Webquest'e nasıl sağlayabilirim: Bunu Proxy'deki Kimlik Bilgileri odrunda belirtmenin bir yolu var mı?WebClient'e bir Powershell

$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") 

Not: Belki bu yardımcı olur: o zaman kullanabileceğiniz How can you add a Certificate to WebClient (C#)? Ama alamadım .. ;-)

+0

Bu SO sorusunun anlamı, ya bir HttpWebRequest'i doğrudan kullanmanız veya WebClient'i geçersiz kılmaktır, böylece sertifikayı ekleyebilirsiniz. – JasonMArcher

cevap

10

PowerShell v2 yeni Add-Type işlevselliğini kullanarak, özel bir sınıf zanaat olabilir tipik WebRequest'ınızı yapmak için. Kimlik doğrulaması için kullanılabilecek sertifika eklemenize izin vermek için özel sınıfta bir yöntem ekledim.

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 

Belki de sertifikaları burada sadece Geçerli Kullanıcı deposunda mevcut her sertifika kullanmak yerine kullanmak istiyorum, ama tıpkı bir (veya olanları) eklenmeden sınırlamak isteyeyim bir örnek olduğunu sadece Hepsini yükler:

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

Bu Mükemmel! Çok teşekkürler! – icnivad