C#証明書エラーを無視しますか?


159

リモートWebサービスへのWebサービスリクエスト中に次のエラーが発生します。

SSL / TLSセキュアチャネルの信頼関係を確立できませんでした。---> System.Security.Authentication.AuthenticationException:検証手順によると、リモート証明書は無効です。

とにかくこのエラーを無視して続行しますか?

リモート証明書が署名されていないようです。

私が接続しているサイトはwww.czebox.cz-なので、気軽にサイトにアクセスしてください。ブラウザでもセキュリティ例外がスローされます。

回答:


341

証明書検証ハンドラーを追加します。戻るtrueと、検証エラーを無視できます。

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

6
これは、最初に表示されるよりもさらに便利です。Managed Exchanged Web Services(EWS)の使用中にOPの問題に遭遇しました。そのマネージライブラリによって行われている低レベルのSOAP呼び出しにアクセスできなかったため、この回答は使用できないと思いました。しかし、もう一度見てみると、ServicePointManagerはそれ自体が独立していることに気付きました。したがって、ExchangeServiceを初期化する前に上記のコールバックを追加しました。これは魅力的なように機能しました。
Mark Meuer、2012

2
次に、バイパスをグローバルに適用する方法の例を示します。悪い習慣に私たちのすべてのため。(時々 、あなたは選択の余地がありません)jasig.275507.n4.nabble.com/...
snowYetis

1
これは一時的に問題を解決してくれてありがとう。このコードをWeb ApiのStartup.csに追加します
Sivalingaamorthy

2
@MarkMeuerは、私のEWS API問題の解決策をほぼあきらめようとしていましたが、その後、あなたのコメントを見ました。
Mahen

7
@MiguelVelosoはもちろんもちろん自由に投票できますが、質問も回答もセキュリティの側面については議論しないでください。トピックは明確に「検証エラーを無視する方法」であり、「なぜこれを行う/行わないのか」ではなく、全体として別のトピックです。コメンターが実際にこれ行う合理的なケースがあると指摘しているので、なぜOPがそれをしてはならないかについての議論に入ると、水が濁るだけです。だから私たちはトピックにこだわり、問題を解決します。
Peter Lillevold

40

すべての証明書を許可することは非常に強力ですが、危険な場合もあります。有効な証明書といくつかの特定の証明書のみを許可する場合は、次のようにすることができます。

.Netコア:

using (var httpClientHandler = new HttpClientHandler())
{
    httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) => {
        if (sslPolicyErrors == SslPolicyErrors.None)
        {
            return true;   //Is valid
        }

        if (cert.GetCertHashString() == "99E92D8447AEF30483B1D7527812C9B7B3A915A7")
        {
            return true;
        }
        return false;
    };
    using (var httpClient = new HttpClient(httpClientHandler))
    {
        var httpResponse = httpClient.GetAsync("https://example.com").Result;
    }
}

。ネットフレームワーク:

System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate (
    object sender,
    X509Certificate cert,
    X509Chain chain,
    SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
    {
        return true;   //Is valid
    }

    if (cert.GetCertHashString() == "99E92D8447AEF30483B1D7527812C9B7B3A915A7")
    {
        return true;
    }

    return false;
};

更新:

cert.GetCertHashString()Chromeで価値を得る方法:

SecureまたはNot Secureアドレスバーをクリックします。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

次に、[証明書]-> [詳細]-> [拇印]をクリックして、値をコピーします。忘れずにcert.GetCertHashString().ToLower()

ここに画像の説明を入力してください


3
@MiguelVeloso完全に同意します。これにより、セキュリティを完全に損なうことなく、(できれば)1つまたは2つの証明書のチェックをスキップできます。
Kemuel Sanchez、2017

Hash String証明書から取得するにはどうすればよいですか?
Kiquenet 2018年

@Kiquenetコードをデバッグしてcert.GetCertHashString()から実行するImmediate windowThumbprint、ブラウザーで証明書を確認するかMMC、ローカルにインストールされているかどうかを確認します。
オグラス

サーバーは私たちの管理下にありますが、本番環境で@Ogglasのコードを使用しても安全ですか?TLS / SSLを使用して、中間者のような攻撃を阻止できますか?
ピンポン、

非常に大きな助けをありがとう。
Wowo Ot

30

IgnoreBadCertificatesメソッド:

//I use a method to ignore bad certs caused by misc errors
IgnoreBadCertificates();

// after the Ignore call i can do what ever i want...
HttpWebRequest request_data = System.Net.WebRequest.Create(urlquerystring) as HttpWebRequest;

/*
and below the Methods we are using...
*/

/// <summary>
/// Together with the AcceptAllCertifications method right
/// below this causes to bypass errors caused by SLL-Errors.
/// </summary>
public static void IgnoreBadCertificates()
{
    System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);
}  

/// <summary>
/// In Short: the Method solves the Problem of broken Certificates.
/// Sometime when requesting Data and the sending Webserverconnection
/// is based on a SSL Connection, an Error is caused by Servers whoes
/// Certificate(s) have Errors. Like when the Cert is out of date
/// and much more... So at this point when calling the method,
/// this behaviour is prevented
/// </summary>
/// <param name="sender"></param>
/// <param name="certification"></param>
/// <param name="chain"></param>
/// <param name="sslPolicyErrors"></param>
/// <returns>true</returns>
private static bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    return true;
} 

2
これをコードで機能させるには、もう1行追加する必要がありました(websocket4netを使用しています)。System.Net.ServicePointManager.CheckCertificateRevocationList = false; サーバー証明書検証コールバックを設定した直後。
kalyanswaroop

24

失敗する理由は、署名されていないためではなく、ルート証明書がクライアントによって信頼されていないためです。SSL検証をオフにする代わりに、アプリが信頼するCAのリストにルートCA証明書を追加する方法もあります。

これは、アプリが現在信頼していないルートCA証明書です。

-----BEGIN CERTIFICATE-----
MIIFnDCCBISgAwIBAgIBZDANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJDWjEs
MCoGA1UECgwjxIxlc2vDoSBwb8WhdGEsIHMucC4gW0nEjCA0NzExNDk4M10xHjAc
BgNVBAMTFVBvc3RTaWdudW0gUm9vdCBRQ0EgMjAeFw0xMDAxMTkwODA0MzFaFw0y
NTAxMTkwODA0MzFaMFsxCzAJBgNVBAYTAkNaMSwwKgYDVQQKDCPEjGVza8OhIHBv
xaF0YSwgcy5wLiBbScSMIDQ3MTE0OTgzXTEeMBwGA1UEAxMVUG9zdFNpZ251bSBS
b290IFFDQSAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoFz8yBxf
2gf1uN0GGXknvGHwurpp4Lw3ZPWZB6nEBDGjSGIXK0Or6Xa3ZT+tVDTeUUjT133G
7Vs51D6z/ShWy+9T7a1f6XInakewyFj8PT0EdZ4tAybNYdEUO/dShg2WvUyfZfXH
0jmmZm6qUDy0VfKQfiyWchQRi/Ax6zXaU2+X3hXBfvRMr5l6zgxYVATEyxCfOLM9
a5U6lhpyCDf2Gg6dPc5Cy6QwYGGpYER1fzLGsN9stdutkwlP13DHU1Sp6W5ywtfL
owYaV1bqOOdARbAoJ7q8LO6EBjyIVr03mFusPaMCOzcEn3zL5XafknM36Vqtdmqz
iWR+3URAUgqE0wIDAQABo4ICaTCCAmUwgaUGA1UdHwSBnTCBmjAxoC+gLYYraHR0
cDovL3d3dy5wb3N0c2lnbnVtLmN6L2NybC9wc3Jvb3RxY2EyLmNybDAyoDCgLoYs
aHR0cDovL3d3dzIucG9zdHNpZ251bS5jei9jcmwvcHNyb290cWNhMi5jcmwwMaAv
oC2GK2h0dHA6Ly9wb3N0c2lnbnVtLnR0Yy5jei9jcmwvcHNyb290cWNhMi5jcmww
gfEGA1UdIASB6TCB5jCB4wYEVR0gADCB2jCB1wYIKwYBBQUHAgIwgcoagcdUZW50
byBrdmFsaWZpa292YW55IHN5c3RlbW92eSBjZXJ0aWZpa2F0IGJ5bCB2eWRhbiBw
b2RsZSB6YWtvbmEgMjI3LzIwMDBTYi4gYSBuYXZhem55Y2ggcHJlZHBpc3UvVGhp
cyBxdWFsaWZpZWQgc3lzdGVtIGNlcnRpZmljYXRlIHdhcyBpc3N1ZWQgYWNjb3Jk
aW5nIHRvIExhdyBObyAyMjcvMjAwMENvbGwuIGFuZCByZWxhdGVkIHJlZ3VsYXRp
b25zMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQW
BBQVKYzFRWmruLPD6v5LuDHY3PDndjCBgwYDVR0jBHwweoAUFSmMxUVpq7izw+r+
S7gx2Nzw53ahX6RdMFsxCzAJBgNVBAYTAkNaMSwwKgYDVQQKDCPEjGVza8OhIHBv
xaF0YSwgcy5wLiBbScSMIDQ3MTE0OTgzXTEeMBwGA1UEAxMVUG9zdFNpZ251bSBS
b290IFFDQSAyggFkMA0GCSqGSIb3DQEBCwUAA4IBAQBeKtoLQKFqWJEgLNxPbQNN
5OTjbpOTEEkq2jFI0tUhtRx//6zwuqJCzfO/KqggUrHBca+GV/qXcNzNAlytyM71
fMv/VwgL9gBHTN/IFIw100JbciI23yFQTdF/UoEfK/m+IFfirxSRi8LRERdXHTEb
vwxMXIzZVXloWvX64UwWtf4Tvw5bAoPj0O1Z2ly4aMTAT2a+y+z184UhuZ/oGyMw
eIakmFM7M7RrNki507jiSLTzuaFMCpyWOX7ULIhzY6xKdm5iQLjTvExn2JTvVChF
Y+jUu/G0zAdLyeU4vaXdQm1A8AEiJPTd0Z9LAxL6Sq2iraLNN36+NyEK/ts3mPLL

-----END CERTIFICATE-----

この証明書を使用してデコードおよび表示できます

この証明書デコーダまたは別の証明書デコーダ


はい!これは私のケースですが、VMなしでAzureに証明書を追加するにはどうすればよいですか?X509Store APIだけを使用できますか?私は明日それを試してみるつもりですが、すべての情報はここに歓迎されている
ジョアン・アントゥネス

7

クライアント構成でSSL証明書の検証を無効にします。

<behaviors>
   <endpointBehaviors>
      <behavior name="DisableSSLCertificateValidation">
         <clientCredentials>
             <serviceCertificate>
                <sslCertificateAuthentication certificateValidationMode="None" />
              </serviceCertificate>
           </clientCredentials>
        </behavior>

これはweb.configですか?ASP.NET Coreの代替はありますか?
Shimmy Weitzhandler

5

このコードは私のために働いた。TLS2を追加する必要があったのは、それが私が興味を持っているURLが使用していたものだからです。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback +=
    (sender, cert, chain, sslPolicyErrors) => { return true; };
using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(UserDataUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new
      MediaTypeWithQualityHeaderValue("application/json"));
    Task<string> response = client.GetStringAsync(UserDataUrl);
    response.Wait();

    if (response.Exception != null)
    {
         return null;
    }

    return JsonConvert.DeserializeObject<UserData>(response.Result);
}

3

SSL証明書をバイパス...

        HttpClientHandler clientHandler = new HttpClientHandler();
        clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };

        // Pass the handler to httpclient(from you are calling api)
        var client = new HttpClient(clientHandler)

2

ソケットを直接使用していて、クライアントとして認証している場合、Service Point Managerコールバックメソッドは機能しません。これが私にとってうまくいったことです。テスト目的でのみ使用してください

var activeStream = new SslStream(networkStream, false, (a, b, c, d) => { return true; });
await activeStream.AuthenticateAsClientAsync("computer.local");

ここで重要なのは、SSLストリームのコンストラクターでリモート証明書検証コールバックを提供することです。


1

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

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

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

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


1

これは.Net Coreで機能します。Soapクライアントを呼び出します。

client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication =
                new X509ServiceCertificateAuthentication()
                {
                    CertificateValidationMode = X509CertificateValidationMode.None,
                    RevocationMode = X509RevocationMode.NoCheck
                };  
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.