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

Try something like this:

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

This checks the Thumbprint of the certificate returned as part of the request against the string "StoredOrRetrievedHash". You would want to replace that with the details from your certificate loaded in dynamically. It is worth noting that the first line of the scriptblock delegate casts the second element of the $args array to be an object of type X509Certificate2, as the bare X509Certificate object doesn't expose the Thumbprint property.

Note: this only works in PowerShell v2 and later - in v1 assigning an arbitrary scriptblock to a delegate was a lot of extra work and quite frankly, just not worth the effort typically.

于 2012-04-23T17:03:48.393 に答える