Как вы можете добавить сертификат для WebClient в Powershell - PullRequest
6 голосов
/ 11 апреля 2011

Я не хочу просматривать веб-страницу, на которой требуется аутентификация сертификата на стороне клиента. Как я могу предоставить свой Cert из Certstore на веб-запрос: Есть ли способ указать это в 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") 

PS: Может быть, это поможет: Как добавить сертификат в WebClient (C #)? Но я не понимаю .. ;-)

1 Ответ

10 голосов
/ 27 апреля 2011

Используя новую функциональность Add-Type в PowerShell v2, вы можете создать собственный класс, который затем можно использовать для создания типичного веб-запроса. Я включил в пользовательский класс метод, позволяющий вам добавлять сертификаты, которые можно использовать для аутентификации.

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

Возможно, вы захотите ограничить добавляемые сертификаты только одним (или одним), который вы хотите использовать, а не просто использовать каждый доступный сертификат в хранилище Current User, но вот пример, который просто загружает все из них :

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