如何忽略SSL证书是由未知的证书颁发机构签署的问题?

时间:2011-07-21 19:14:22

标签: c# asp.net ssl powershell

我正在开发c#应用程序来调用Exchange Management Shell Cmdlet。除了“目标计算机上的服务器证书(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 个答案:

答案 0 :(得分:3)

我同意Brent的意见,在创建Uri之前,尝试将ServicePointManager调用作为您的第一个调用。

然而,委托也缺少一些参数。试一试:

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

答案 1 :(得分:3)

我认为布伦特是正确的:需要进入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代码的程度。

答案 2 :(得分:3)

WSManConnectionInfo对象有两个属性可以跳过证书检查。

connectionInfo.SkipCACheck = true;

connectionInfo.SkipCNCheck = true;

答案 3 :(得分:1)

在黑暗中拍摄:可能在创建运行空间实例之前设置ServicePointManager委托。我只是推测构造运行空间实例可能会捕获并存储来自ServicePointManager的委托。

另外,请确保代表回答的问题是您的想法。是在问“有效的证书吗?”还是在问“证书无效?”如果是后者,那么将你的委托改为{return false; }

最后一件事:powershell是从单独的进程执行的吗?如果是,那么ServicePointManager设置将无法帮助您。