6

ここで少し奇妙な問題があります。使用しているスクリプトは次のとおりです。

$username = "itrpo"
$url = "https://homepages.domain.com/cgi-bin/checkperms.cgi?user=$username"
$homepagesUser = "REMOVED"
$homepagesPass = "REMOVED"
$webclient = New-Object System.Net.WebClient
$webclient.Credentials = new-object System.Net.NetworkCredential($homepagesUser, $homepagesPass)
$result = $webclient.DownloadString($url)

これをデスクトップ (Windows 8、.NET v4.0.30319 を使用する PowerShell v3) から実行すると、動作します。これをサーバー (Windows Server 2008 R2、.NET v2.0.50727 を使用する PowerShell v2) から実行すると、実行されません。最終的にハングし、次のエラーが返されます:「1」個の引数を指定して「DownloadString」を呼び出す例外:「操作がタイムアウトしました」

NetMon を使用して、サーバー上で TLS クライアント キー交換の実行に失敗していることを突き止めました。

Homepages.domain.com の SSL 証明書は実際には SAN 証明書であり、Homepages は実際のサーバー名 (servera.domain.com としましょう) のエイリアスです。スクリプトの $url を実際のサーバー名を使用するように変更すると、次のようになります。

$url = "https://servera.domain.com/cgi-bin/checkperms.cgi?user=$username"

...うまくいきましたが、これは理想的ではありません(サービスが別のマシンに移動すると、スクリプトが壊れます)。

PowerShell v2 (.NET v2) で SAN 証明書に問題があるように見えますか? これを裏付けるさらなる証拠は、正常に通信する標準 SSL 証明書を持つ別のサーバーに対して上記のスタイル スクリプトを使用することです。

使用している WebClient クラスの違いによるものでしょうか。.NET v2 でのドキュメントは次のとおりです: http://msdn.microsoft.com/en-us/library/system.net.webclient%28v=vs.80%29.aspx および .NET でのドキュメントv4: http://msdn.microsoft.com/en-us/library/system.net.webclient%28v=vs.100%29.aspx

上記のドキュメントを実際に正しく解釈するには、プログラミングについて十分に知りません (または、自分が正しい方向に進んでいるかどうかもわかりません)。

理想的には、スクリプトを PowerShell v2 および .NET v2 で機能させたいと考えています。アップグレードしたり、PowerShell に .NET v4 を使用させたりする必要はありません。私の疑いが正しければ、指定できるパラメータがありますか / この問題を「修正」するためにスクリプトを変更する方法はありますか?

アドバイスをありがとうございました。

4

1 に答える 1

5

私の推測では、これは PowerShell のバージョン (または基盤となるプラットフォームの詳細全般) とはあまり関係がなく、証明書と HTTPS ハンドシェイクに関係しているということです。証明書に埋め込まれた代替サブジェクト名の認識が改善された可能性がありますが、それをテストする簡単な方法は、PowerShell の次の行をスクリプトに追加することです。

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

これにより、信頼されているかどうか、期限切れなどに関係なく、すべての証明書が受け入れられるようになります。それはあなたのセットアップで起こっています。

ServerCertificateValidationCallbackの詳細については、デリゲートに渡されるパラメーターを含む MSDN ページを参照してください。理論的には、そのサーバーで使用している証明書をホワイトリストに登録し、そのサーバーに対して true を返すことができます。

于 2013-02-05T18:03:52.333 に答える