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
在 运行 尝试执行 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