122

ユーザーが提供した URL からコンテンツを読み取るプログラムを作成しています。私の問題は、次のようなコードにあります。

Uri uri = new Uri(url);
WebRequest webRequest = WebRequest.Create(uri);
WebResponse webResponse = webRequest.GetResponse();
ReadFrom(webResponse.GetResponseStream());

提供されたURLがURL である場合、これは壊れていhttps://ます。SSL暗号化コンテンツで動作するように、このコードを変更するのを手伝ってくれる人はいますか? ありがとう。

4

4 に答える 4

182

正しい方法で行っていますが、無効な SSL 証明書がインストールされているサイトにユーザーが URL を提供している可能性があります。実際の Web リクエストを行う前に次の行を挿入すると、これらの証明書の問題を無視できます。

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);

は次のようにAcceptAllCertifications定義されます

public bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    return true;
}
于 2009-02-18T14:24:33.440 に答える
20

これは私のために働いた:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
于 2017-01-05T12:01:24.077 に答える
18

このリンクはあなたの興味を引くでしょう:http://msdn.microsoft.com/en-us/library/ds8bxk2a.aspx

http接続の場合、WebRequestクラスとWebResponseクラスはSSLを使用してSSLをサポートするWebホストと通信します。SSLを使用するかどうかの決定は、指定されたURIに基づいてWebRequestクラスによって行われます。URIが「https:」で始まる場合、SSLが使用されます。URIが「http:」で始まる場合、暗号化されていない接続が使用されます。

于 2009-02-18T12:20:19.060 に答える
0

@LukeDuffによる最も投票された回答が正しく言うように、サーバーが無効または信頼されていない(または自己署名、技術的にも信頼されていない)証明書を使用している可能性があります。しかし、答えは盲目的に証明書を受け入れます。さらに悪いことに、信頼できる有効な証明書を期待するサイトであっても、どのサイトの証明書であっても。それはセキュリティ上の欠陥です。

ServicePointManager.ServerCertificateValidationコールバックを実装するときは、証明書を検証する必要があります。たとえば、既知の値に対して証明書のハッシュをチェックすることによって:

using System.Net;
using System.Net.Security;
using System.Security.Cryptography;
ServicePointManager.ServerCertificateValidationCallback +=
    (sender, certificate, chain, errors) =>
    {
        return
            (errors == SslPolicyErrors.None) ||
            certificate.GetCertHashString(HashAlgorithmName.SHA256).Equals(
                "EB8E0B28AE064ED58CBED9DAEB46CFEB3BD7ECA677...");
    };

を使用するX509Certificate.GetCertHashStringオーバーロードにはHashAlgorithmName.SHA256、.NET 4.8 が必要です。古いバージョンでは、SHA-1 ハッシュを返すパラメーターなしのオーバーロードを使用します。


無効な証明書が安全であることがわかっている場合、X509Certificate.Thumbprint プロパティをテストしても安全ですか?

コードの VB.NET バージョンについては、「VB.NET で自己署名 TLS/SSL 証明書を受け入れる」を参照してください。

于 2021-03-31T06:03:53.330 に答える