How can you add a Certificate to WebClient in Powershell How can you add a Certificate to WebClient in Powershell powershell powershell

How can you add a Certificate to WebClient in Powershell


Using the new Add-Type functionality in PowerShell v2, you can craft a custom class that you can then use to make your typical WebRequest. I have included a method on the custom class to allow you to add certificates that can be used for authentication.

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

You would perhaps want to limit the certificates being added to just the one (or ones) you would want to use rather than just use every available certificate in the Current User store, but here is an example that just loads all of them:

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