2011-04-11 9 views
6

Quiero examinar una página web que requiera Autenticación de certificado de cliente. ¿Cómo puedo proporcionar mi Certificado del Certstore a la Webrequest: ¿Hay alguna manera de especificar esto en Credenciales odr dentro del Proxy?Cómo puede agregar un Certificado a WebClient en 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") 

PS: Tal vez esto ayuda: How can you add a Certificate to WebClient (C#)? Pero yo no lo entiendo .. ;-)

+0

Lo que significa esa pregunta es que o bien tiene que usar una HttpWebRequest directamente, o anular WebClient para que pueda agregar el certificado. – JasonMArcher

Respuesta

10

El uso de la nueva funcionalidad Add-Type en PowerShell v2, puedes crear una clase personalizada que luego se puede utilizar para hacer su típica WebRequest. He incluido un método en la clase personalizada para permitirle agregar certificados que se pueden usar para la autenticación.

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 

Se podría tal vez desee limitar los títulos que se añaden a sólo el uno (o unos) que se desea utilizar en lugar de utilizar todos los certificados disponibles en el almacén del usuario actual, pero aquí es un ejemplo que se acaba carga todos ellos:

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

¡Esto es perfecto! ¡Muchas gracias! – icnivad

Cuestiones relacionadas