.NetでWebサービスを呼び出すときに無効なSSL証明書エラーをバイパスする


87

有効なSSL証明書がまだない新しいSharePointをセットアップしています。リストWebサービスを呼び出して、セットアップに関するメタデータを取得します。ただし、これを実行しようとすると、例外が発生します。

基になる接続が閉じられました:SSL / TLSセキュアチャネルの信頼関係を確立できませんでした。

ネストされた例外には、エラーメッセージが含まれています。

検証手順によると、リモート証明書は無効です。

一時的な証明書を使用しているため、これは正しいです。

私の質問は、.Net Webサービスクライアント(SoapHttpClientProtocol)にこれらのエラーを無視するように指示するにはどうすればよいですか?

回答:


18

この問題に直面したときに使用したアプローチは、一時的な証明書の署名者を、問題のコンピューターの信頼できる機関のリストに追加することでした。

私は通常、CACERTで作成された証明書を使用してテストを行い、それらを信頼できる機関のリストに追加することで問題なく動作しました。

この方法でこれを行うと、アプリケーションにカスタムコードを追加する必要がなく、アプリケーションがデプロイされたときに何が起こるかを適切にシミュレーションできます。したがって、これはプログラムでチェックをオフにする優れたソリューションだと思います。


それも私の最初のアイデアでした。残念ながら、証明書も有効期限が切れているため、信頼することはできません。
jan.vdbergh 2008

CA証明書のようなものを使用できない理由はありますか?テスト証明書の場合は、そのまま続行できます。これらのチェックをオフにする方法があるかどうかはわかりません!
Simon Johnson

113

または、認証エラーを無視するコールバックデリゲートを登録できます。

...
ServicePointManager.ServerCertificateValidationCallback = MyCertHandler;
...

static bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error)
{
// Ignore errors
return true;
}

1
この静的メソッドをglobal.asaxに追加して、イベントを「OnApplicationStart」に設定しました。魅力のように働いた。おかげで
フアン・サモラ

1
@JuanZamora私はあなたがしたのと同じことをしました。出来た!
Sachin BR

5
「Man in the Middle」攻撃に対して脆弱になりたい場合は、これで十分です
Houtman

2
理想的には、これを開発環境でのみ行う必要があります。
Ron DeFreitas 16

79

ジェイソンSの答えのように:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

私はこれをメインに入れて、コード行を呼び出す前に自分app.configを調べてテストし(ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True")ます。


24

私はそれをこのように解決しました:

エラーの原因となるssl webserviceを呼び出す直前に、次を呼び出します。

using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

/// <summary>
/// solution for exception
/// System.Net.WebException: 
/// The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
/// </summary>
public static void BypassCertificateError()
{
    ServicePointManager.ServerCertificateValidationCallback +=

        delegate(
            Object sender1,
            X509Certificate certificate,
            X509Chain chain,
            SslPolicyErrors sslPolicyErrors)
        {
            return true;
        };
}

11

DownloadStringを使用して同じエラーが発生しました。このページの提案により、以下のように機能させることができました

System.Net.WebClient client = new System.Net.WebClient();            
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
string sHttpResonse = client.DownloadString(sUrl);

3
ServicePointManager.ServerCertificateValidationCallback +=
            (mender, certificate, chain, sslPolicyErrors) => true;

無効なsslをバイパスします。それをWebサービスコンストラクターに書き込みます。


1

初心者の場合は、部分的なサービスクラスを別のcsファイルで拡張し、「imanabidi」が提供するコードを追加して統合することができます。


1

Simon Johnsonsの投稿をさらに拡張するには-理想的には、本番環境で表示される条件をシミュレートするソリューションが必要です。コードを変更してもそれは実行されず、展開する前にコードを取り出すのを忘れると危険な場合があります。

何らかの自己署名証明書が必要になります。IIS Expressを使用している場合は、すでにこれらの1つを持っているので、それを見つける必要があります。Firefoxまたは任意のブラウザを開いて、開発用Webサイトにアクセスします。URLバーから証明書情報を表示でき、ブラウザによっては、証明書をファイルにエクスポートできるはずです。

次に、MMC.exeを開き、証明書スナップインを追加します。証明書ファイルをTrusted Root Certificate Authoritiesストアにインポートします。これだけで十分です。「Personal」のような他のストアではなく、必ずそのストアに入るようにすることが重要です。MMCや証明書に慣れていない場合は、これを行う方法に関する情報を掲載したWebサイトが多数あります。

これで、コンピュータ全体が、それ自体が生成した証明書を暗黙的に信頼するようになり、これを特別に処理するためのコードを追加する必要がなくなります。本番環境に移行しても、適切な有効な証明書がインストールされていれば、引き続き機能します。運用サーバーではこれを行わないでください。これは悪いことであり、サーバー自体以外のクライアントでは機能しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.