PowerShell - 尝试在没有自签名证书问题的情况下进行 REST 调用的添加类型问题

PowerShell - Add-Type Issue trying to do REST call without self-signed cert issue

在 运行 尝试执行 REST API 调用并避免自签名证书问题后,我试图更好地理解 PowerShell 中的添加类型。代码如下

add-type @"
    using System.Net;
    using System.Security.Cryptography.X509Certificates;

    public class TrustAllCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(
            ServicePoint srvPoint, X509Certificate certificate,
            WebRequest request, int certificateProblem) {
            return true;
        }
    }
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("InternalApiKey", "d472f0e9-23c9-4fff-aec9-cc1f2d5d6a85")

$response = Invoke-RestMethod 'https://localhost:9443/api/GetStats/' -Method 'GET' -Headers $headers
$response | ConvertTo-Json

当我 运行 它因错误而中断。

“新对象:找不到类型 [TrustAllCertsPolicy]:验证是否已加载包含此类型的程序集。”然后,由于失败,我收到错误消息“Invoke-RestMethod:由于证书链中的错误,远程证书无效:PartialChain”

刚刚偶然发现它在 PowerShell 5.1.22000.282 中按预期工作 并且在 PowerShell 7.2.1 中没有。我可以进行哪些更改以使其在两个版本的 PowerShell 中都能正常工作?

更新:这个 link 有一些代码可以在两个版本的 PowerShell 中得到它 运行ning。我接受了我所做的答案,因为它最有帮助,而且我正在分享另一个答案。 https://github.com/PowerShell/PowerShell/issues/7092

在 PowerShell 7.x 中,web cmdlet 有一个 -SkipCertificateCheck 开关,您可以改用:

$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("InternalApiKey", "d472f0e9-23c9-4fff-aec9-cc1f2d5d6a85")

$response = Invoke-RestMethod 'https://localhost:9443/api/GetStats/' -SkipCertificateCheck -Method 'GET' -Headers $headers

如果端点已经在发送 JSON,您不妨改用 Invoke-WebRequest(而不是让 Invoke-RestMethod 从 JSON 转换为对象然后再返回ConvertTo-Json):

$response = Invoke-WebRequest 'https://localhost:9443/api/GetStats/' -SkipCertificateCheck -Method 'GET' -Headers $headers
$response.Content # this now contains the body of the raw response from the API, eg. JSON/XML/whatever