41

Visual Studio 2005 の使用 - C# 2.0、System.Net.WebClient.UploadData(Uri address, byte[] data) Windows Server 2003

したがって、コードの簡略化されたバージョンは次のとおりです。

static string SO_method(String fullRequestString)
{
    string theUriStringToUse = @"https://10.10.10.10:443"; // populated with real endpoint IP:port
    string proxyAddressAndPort = @"http://10.10.10.10:80/"; // populated with a real proxy IP:port
    Byte[] utf8EncodedResponse; // for the return data in utf8
    string responseString; // for the return data in utf16

    WebClient myWebClient = new WebClient(); // instantiate a web client
    WebProxy proxyObject = new WebProxy(proxyAddressAndPort, true);// instantiate & popuylate a web proxy
    myWebClient.Proxy = proxyObject; // add the proxy to the client
    myWebClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); // stick some stuff in the header

    UTF8Encoding utf8Encoding = new UTF8Encoding(false);// create a utf8 encoding
    Byte[] utf8EncodedRequest = HttpUtility.UrlEncodeToBytes(fullRequestString, utf8Encoding); // convert the request data to a utf8 byte array

    try
    {
        utf8EncodedResponse = myWebClient.UploadData(theUriStringToUse, "POST", utf8EncodedRequest); // pass the utf8-encoded byte array
        responseString = utf8Encoding.GetString(utf8EncodedResponse); // get a useable string out of the response
    }
    catch (Exception e)
    {
        // some other error handling
        responseString = "<CommError><![CDATA[" + e.ToString() + "]]></CommError>";// show the basics of the problem
    }
    return responseString;// return whatever ya got
}

これは私が得るエラーです:

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

リクエストが送信されたときに何が起こっているかを確認することはあまりできません。正しい宛先に到達していて、「証明書エラー」があると言われました。これはおそらく、私のリクエストの IP アドレスとそれが解決される URL の間に文字通りの不一致があるためです。ラウンドロビンすることになっている IP が複数あるため、URL を指定しても機能しません。私は証明書を添付していません-また、エンドポイントの所有者によると、添付することも想定されていません. 「彼ら」によると、証明書のエラーは「正常であり、無視することになっています。

問題の証明書は、サーバー上に「ちょうどそこに」ある多くのベリサイン証明書の1つであると思われます。証明書エラーを無視するために私が見た例はすべて、要求者が特定の x509 証明書を添付していることを暗示しているようです (私はそうではありません)。

.net WebServiceを調べて、ssl 検証をバイパスしました! これは私の問題を説明しています-ただし、参照する必要がある証明書(存在する場合)がわからないため、それもそうではありません。

どの証明書が問題を引き起こしているのかを実際に知らずに/気にせずにエラーを無視する方法はありますか?

  • そしてお願いします - 私は正確にはヘビーヒッターではないので、子供用手袋、小さな言葉、および「ダミー用」コード。

  • このトラフィックは専用回線を経由しているため、証明書エラーを無視することは、オープンなインターネット トラフィックほど大きな問題ではないと理解しています。

4

6 に答える 6

60

SSL 証明書は、マシンが信頼関係を確立するためのものです。ある IP アドレスを入力して別の IP アドレスと会話することになった場合、それは DNS ハイジャックのセキュリティ違反と同じように聞こえますが、これは SSL が回避するのに役立つようなものであり、おそらく我慢したくないものです。 「彼ら」から。

複数のマシンと通信する可能性がある場合 (理想的には、それらのマシンが 1 つのマシンとして表示されるようにします)、信頼を開始するために、考えられるマシンごとに証明書が必要になります。

信頼を無視するには (開発シナリオで一時的にこれを行う必要があっただけです)、次のスニペットはうまくいくかもしれませんが、使用する前に信頼を無視することの影響を考慮することを強くお勧めします。

public static void InitiateSSLTrust()
{
    try
    {
        //Change SSL checks so that all checks pass
        ServicePointManager.ServerCertificateValidationCallback =
           new RemoteCertificateValidationCallback(
                delegate
                { return true; }
            );
    }
    catch (Exception ex)
    {
        ActivityLog.InsertSyncActivity(ex);
    }
}
于 2009-08-19T16:49:53.087 に答える
20

これが古い投稿であることは認識していますが、これを行うためのより簡単な方法があることを示したかっただけです (.NET 3.5 以降を使用)。

たぶんそれは私のOCDだけかもしれませんが、このコードをできるだけ最小限に抑えたいと思っていました. これが最短の方法のようですが、以下に相当する長い方法もいくつかリストしました。

// 79 Characters (72 without spaces)
ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true;

.NET 2.0 での最短の方法 (これは、質問が具体的に求めていたものです)

// 84 Characters
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

ラムダ方式ではパラメーターを定義する必要があるのは残念です。そうしないと、さらに短くなる可能性があります。

さらに長い道のりが必要な場合は、いくつかの追加の代替手段を次に示します。

ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, errors) => true;

ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; };

// 255 characters - lots of code!
ServicePointManager.ServerCertificateValidationCallback =
    new RemoteCertificateValidationCallback(
        delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true;
        });
于 2014-06-26T01:37:27.123 に答える
12

これは、トーマスの提案 (ただし、これは .NET 4.0 コードです) に基づいて、使用しているコードの一部です (まだ洗練されていません。エラー処理のセットアップが正しく行われているとは思いませんが、近いはずです)。

var sslFailureCallback = new RemoteCertificateValidationCallback(delegate { return true; });

try
{

    if (ignoreSslErrors)
    {
        ServicePointManager.ServerCertificateValidationCallback += sslFailureCallback;
    }

    response = webClient.UploadData(Options.Address, "POST", Encoding.ASCII.GetBytes(Options.PostData));

}
catch (Exception err)
{
    PageSource = "POST Failed:\r\n\r\n" + err;
    return PageSource;
}
finally
{
    if (ignoreSslErrors)
    {
        ServicePointManager.ServerCertificateValidationCallback -= sslFailureCallback;
    }
}
于 2011-07-08T20:23:58.087 に答える
8

このコードは、予想よりもはるかに広範です。プロセス全体です。プロセスは、exe、このマシンの IIS、または DLLHost.exe である可能性があります。呼び出した後、常に true を返すデリゲートを削除することで、通常の状態に戻す finally ブロックを用意します。

于 2009-08-25T20:05:22.837 に答える
4

影響を受けない他のリクエストが実行されている可能性があるため、グローバルに無効にすることなく特定のドメインの SSL 検証を無効にしたかったので、この解決策を思いつきました (uri はクラス内の変数であることに注意してください:

        private byte[] UploadValues(string method, NameValueCollection data)
        {
            var client = new WebClient();

            try
            {
                ServicePointManager.ServerCertificateValidationCallback +=
                    ServerCertificateValidation;

                returnrclient.UploadValues(uri, method, parameters);

            }
            finally
            {
                ServicePointManager.ServerCertificateValidationCallback -=
                    ServerCertificateValidation;
            }
        }

        private bool ServerCertificateValidation(object sender,
            X509Certificate certificate, X509Chain chain,
            SslPolicyErrors sslPolicyErrors)
        {
            var request = sender as HttpWebRequest;
            if (request != null && request.Address.Host.Equals(
                this.uri.Host, StringComparison.OrdinalIgnoreCase))
                return true;
            return false;
        }
于 2016-10-06T15:29:23.043 に答える