как игнорировать SSL-сертификат, подписанный неизвестной проблемой центра сертификации? - PullRequest
6 голосов
/ 21 июля 2011

Я разрабатываю приложение на c # для вызова командлетов командной консоли Exchange. Он всегда выходит с исключением «Сертификат сервера на конечном компьютере (208.243.XX.2XX: 443) содержит следующие ошибки:
Сертификат SSL подписан неизвестным центром сертификации.
Сертификат SSL содержит общее имя (CN), которое не соответствует имени хоста. «

Но я написал код для принятия всех сертификатов, не знаю, почему все равно получаю ошибку.

Мой код:

    PSCredential credential = new PSCredential("administrator", securePwd);

    WSManConnectionInfo connectionInfo = new WSManConnectionInfo(new Uri("https://208.243.49.20/powershell"), "http://schemas.microsoft.com/powershell/Microsoft.Exchange", credential);
    connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Basic;

    Runspace runspace = System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace(connectionInfo);
    PowerShell powershell = PowerShell.Create();
    PSCommand command = new PSCommand();
    command.AddCommand("New-Mailbox");
    command.AddParameter("Name", "TestName");
    powershell.Commands = command;
    ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(
    delegate { return true; }
);
    try
    {
        runspace.Open();//This is where the exception happens
        powershell.Runspace = runspace;
        Collection<PSObject> result= powershell.Invoke();
    }

Ответы [ 4 ]

3 голосов
/ 24 октября 2011

WSManConnectionInfo объект имеет два свойства для пропуска проверок сертификатов.

connectionInfo.SkipCACheck = true;

connectionInfo.SkipCNCheck = true;
3 голосов
/ 22 июля 2011

Я согласен с Брентом, попробуйте сделать вызов ServicePointManager первым вызовом, который вы делаете, прежде чем даже создавать Uri.

Однако в делегате также отсутствуют некоторые параметры.Дайте этому шанс:

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
3 голосов
/ 22 июля 2011

Я думаю, что Брент прав: нужно быть в процессе PowerShell.Вам понадобится строка, подобная следующей в вашем PS:

[System.Net.ServicePointManager]::ServerCertificateValidationCallback += { $true }

Выполнена ли следующая проверка на ненадежном сайте SSL и подтверждено, что она переопределяет ошибку:

$url = "https://www.us.army.mil"
$wc = new-object system.net.webclient
$x = $wc.downloadstring($url) # will fail
[System.Net.ServicePointManager]::ServerCertificateValidationCallback += { $true }
$x = $wc.downloadstring($url) # should succeed

...Тем не менее, странно, что вы говорите, что исключение происходит при открытии пространства выполнения, если это так, то, возможно, нет, поскольку вы даже не дошли до точки выполнения кода PowerShell.

1 голос
/ 21 июля 2011

Снимок в темноте: возможно, установите делегат ServicePointManager перед созданием экземпляра пространства выполнения. Я просто предполагаю, что конструкция экземпляра runspace может захватить и сохранить делегата из ServicePointManager.

Кроме того, убедитесь, что вопрос, на который ответил делегат, это то, что вы думаете. Это спрашивает "действительный сертификат?" или это спрашивает "недействительный сертификат?" Если последнее, то измените ваш делегат на {return false; }

Последнее, что: PowerShell выполняется из отдельного процесса? Если да, то настройка ServicePointManager вам не поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...