我在Powershell中调用一个库,它使用.NET HttpClient发出POST请求。客户端调用在后台线程上运行。它适用于HTTP。当我使用HTTPS时,我遇到了问题。服务器未使用有效的签名证书。我使用以下方法禁用了该检查:
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
只有与运行空间相关的错误才能满足:
System.Management.Automation.PSInvalidOperationException:没有 可用于在此线程中运行脚本的运行空间。你可以提供一个 在。的DefaultRunspace属性中 System.Management.Automation.Runspaces.Runspace类型。脚本块 你试图调用的是:$ true
从一些研究来看,它似乎与API是异步/使用任务这一事实有关。
非常感谢任何帮助。
答案 0 :(得分:3)
尝试使用证书政策吗?
add-type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class NoSSLCheckPolicy : ICertificatePolicy {
public NoSSLCheckPolicy() {}
public bool CheckValidationResult(
ServicePoint sPoint, X509Certificate cert,
WebRequest wRequest, int certProb) {
return true;
}
}
"@
[System.Net.ServicePointManager]::CertificatePolicy = new-object NoSSLCheckPolicy
答案 1 :(得分:1)
请注意,当您关闭验证时,您需要关闭所有内容 - 我写的验证器比@Trondh的推荐更加谨慎 - 不要&#39 ; t只返回true,确保证书至少有效(即使是自签名),并且仅允许特定域的自签名证书。
FWIW,我在Splunk工作时为.Net编写了一个Tuneable SSL Validator来处理Splunk默认使用自签名证书的事实。它有一个PowerShell模块,其中包含让您信任会话证书的命令,或者只是禁用证书链验证(因此您可以信任没有证书链的有效自签名证书)......并且它包含{{1}的包装器}和Invoke-WebRequest
甚至Invoke-RestMethod
添加Export-ODataEndpointProxy
开关,以便您只需为一个请求停用SSL。