1

我有一些代码用于连接到我们拥有的 Web 服务器。服务器具有自签名证书。我目前正在与信任任何证书连接

[System.Net.ServicePointManager]::ServerCertificateValidationCallback {$true}.  

如何更改此设置,以便我可以使用自定义代码或针对本地商店中的证书测试远程服务器?例如,我可以将上面的代码更改为

[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$customValidator}

我想要做的是,而不是信任任何/所有证书,我只想信任它与我拥有的公钥 cer 文件匹配,或者我想使用自定义代码测试证书。我不太清楚的是如何处理自定义验证以及代码中的什么位置。我需要编写一个完整的类来处理自定义 SSL 验证还是有更好的方法来做到这一点?

$url = "https://myWebServer"
$web = New-Object Net.WebClient
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true } 
//[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { customSslCertValidation } #I would like to do something like this    
$output = $web.DownloadString($url) 
Write-Host $output
4

1 回答 1

0

尝试这样的事情:

[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {
  $c = [System.Security.Cryptography.X509Certificates.X509Certificate2]$args[1]
  ($c.Thumbprint -eq "StoredOrRetrievedHash")
}

这将根据字符串“StoredOrRetrievedHash”检查作为请求的一部分返回的证书的指纹。您可能希望将其替换为动态加载的证书中的详细信息。值得注意的是,脚本块委托的第一行将 $args 数组的第二个元素转换为X509Certificate2类型的对象,因为裸X509Certificate对象不公开 Thumbprint 属性。

注意:这仅适用于 PowerShell v2 及更高版本 - 在 v1 中,将任意脚本块分配给委托是很多额外的工作,而且坦率地说,通常不值得付出努力。

于 2012-04-23T17:03:48.393 回答