我正在开发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();
}
答案 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设置将无法帮助您。