在信任之前,针对本地存储的证书测试远程服

时间:2012-04-23 13:53:18

标签: powershell

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

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

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

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

我想做的是,我不想信任任何/所有证书,只有当它与我拥有的公钥文件匹配或者我想使用自定义代码测试证书时,我才会信任它。我不太清楚的是如何处理自定义验证以及代码中的哪一点。我是否需要编写一个完整的类来处理自定义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

1 个答案:

答案 0 :(得分:0)

尝试这样的事情:

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

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

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