.NET (C#) 2.0 Windows アプリによって、Visual Studio によって生成された Web サービス プロキシ経由で、同じく C# (2.0) で記述された Web サービスに対して生成された、シンプルな Web サービス呼び出しがあります。これは数年間機能しており、実行されている 12 か所ほどの場所で引き続き機能しています。
新しいサイトでの新しいインストールで問題が発生しています。Web サービスを呼び出そうとすると、次のメッセージが表示されて失敗します。
SSL/TLS セキュア チャネルの信頼関係を確立できませんでした
Web サービスの URL は SSL (https://) を使用しますが、これは他の多くの場所から長い間機能しており (現在も機能し続けています)。
どこを調べればよいですか? これは、このインストールに固有の Windows と .NET 間のセキュリティ問題なのでしょうか? もしそうなら、信頼関係をどこで設定すればよいのでしょうか? わかりません!
ベストアンサー1
次のスニペットは、呼び出し先のサーバーの SSL 証明書に問題があるケースを修正します。たとえば、証明書が自己署名されているか、証明書とサーバーのホスト名が一致していない可能性があります。
直接制御できないサーバーを呼び出す場合、接続していると思われるサーバーと通信しているかどうか確信が持てなくなるため、これは危険です。ただし、内部サーバーを扱っていて、「正しい」証明書を取得するのが現実的でない場合は、次のコードを使用して、Web サービスに証明書の問題を無視して勇敢に処理を続けるように指示します。
最初の 2 つはラムダ式を使用し、3 つ目は通常のコードを使用します。最初のものは任意の証明書を受け入れます。最後の 2 つは、少なくとも証明書のホスト名が期待どおりであるかどうかを確認します。...
参考になれば幸いです。
//Trust all certificates
System.Net.ServicePointManager.ServerCertificateValidationCallback =
((sender, certificate, chain, sslPolicyErrors) => true);
// trust sender
System.Net.ServicePointManager.ServerCertificateValidationCallback
= ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName"));
// validate cert by calling a function
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);
// callback used to validate the certificate in an SSL conversation
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
{
bool result = cert.Subject.Contains("YourServerName");
return result;
}