C # Ігнорувати помилки сертифікату?


159

Я отримую таку помилку під час запиту веб-служби до віддаленої веб-служби:

Не вдалося встановити довірчі відносини для захищеного каналу SSL / TLS. ---> System.Security.Authentication.AuthenticationException: віддалений сертифікат недійсний відповідно до процедури перевірки.

Чи варто ігнорувати цю помилку і продовжувати?

Здається, віддалений сертифікат не підписаний.

Сайт, до якого я підключаюся, www.czebox.cz- тому сміливо відвідуйте його, і помічайте, що навіть браузери викидають винятки з безпеки.

Відповіді:


341

Додайте обробник сертифікатів. Повернення trueдозволить ігнорувати помилку перевірки:

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

6
Це навіть корисніше, ніж може здатися спочатку. Я зіткнувся з проблемою ОП під час використання керованих обмінних веб-сервісів (EWS). Я думав, що не можу використати цю відповідь, оскільки не мав доступу до дзвінків SOAP низького рівня, які здійснював ця керована бібліотека. Але коли я поглянув на це ще раз, я зрозумів, що ServicePointManager стоїть самостійно. Отже, я додав вищезазначений зворотний виклик перед ініціалізацією ExchangeService, і він спрацював як шарм.
Марк Мейер

2
Ось приклад того, як застосувати байпас в усьому світі. Для всіх нас у поганій практиці. (Іноді у вас немає вибору) jasig.275507.n4.nabble.com/…
snowYetis

1
велике спасибі, це тимчасово вирішує проблему. Додайте цей код у Startup.cs в Web Api
Sivalingaamorthy

2
@MarkMeuer майже збирався відмовитись від цього рішення для моєї проблеми з API EWS, але потім я побачив ваш коментар.
Mahen

7
@ MiguelVeloso ви можете безперечно звернути увагу, але майте на увазі, ні питання, ні відповідь не обговорюють питання безпеки цього. Тема явно "як ігнорувати помилку перевірки", а не "чому ми повинні робити / не робити цього", це взагалі інша тема. Вступаючи в дискусію про те, чому ОП не повинна робити це, це лише каламутить води, оскільки коментатори зазначили, що є розумні випадки, коли ви насправді це зробите. Тож ми дотримуємось теми і вирішуємо проблему.
Пітер Ліллевольд

40

Дозвіл усіх сертифікатів дуже потужний, але це також може бути небезпечно. Якщо ви хочете дозволити лише дійсні сертифікати плюс деякі певні сертифікати, це можна зробити так.

.Net core:

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;
    }
}

.Net Framework:

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 Повністю згоден. Це дозволяє пропустити перевірку на (сподіваємось) один або два сертифікати, не загрожуючи безпеці повністю.
Кемуель Санчес

ЧОМУ Я можу дістати Hash Stringз серта?
Кікенет

@Kiquenet Або налагоджуйте код, і запустіть cert.GetCertHashString()із сервера Immediate windowабо перевірте його Thumbprintу вашому браузері, або MMCякщо він встановлений локально.
Огглас

Сервер перебуває під нашим управлінням, чи все-таки безпечно використовувати @ Ogglas-код на виробництві? Використовуючи TLS / SSL, чи може бути зупинена атака, як людина-посередині?
Пінгпонг

Дякую Вам дуже велика допомога.
Wowo Ot

30

Метод IgnoreBadCertificate:

//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
Мені довелося додати ще один рядок, щоб це працювало з моїм кодом (я використовую websocket4net). System.Net.ServicePointManager.CheckCertificateRevocationList = false; Відразу після встановлення зворотного виклику підтвердження сертифіката сервера.
kalyanswaroop

24

Причина його відмови полягає не в тому, що він не підписаний, а в тому, що кореневий сертифікат не довіряється вашому клієнту. Замість того, щоб вимкнути перевірку SSL, альтернативним підходом було б додати кореневий сертифікат 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-----

Ви можете розшифрувати та переглянути цей сертифікат за допомогою

цей декодер сертифіката або інший декодер сертифікатів


Так! Це мій випадок, але як я можу додати сертифікат на Azure, без VM? Чи можу я просто використовувати API X509Store? Я спробую це завтра, але будь-яка інформація тут вітається
Жоао Антунес,

7

Відключення перевірки ssl cert у конфігурації клієнта.

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

Це web.config ? Будь-які альтернативи для ASP.NET Core?
Шиммі Вайцхандлер

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

Якщо ви використовуєте сокети безпосередньо та аутентифікуєтесь як клієнт, то метод зворотного виклику менеджера сервісних точок не працюватиме. Ось що для мене спрацювало. ВИКОРИСТОВУЙТЕ ЛИШЕ ДЛЯ ТЕСТУВАННЯ МІР .

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

Ключовим тут є надання права віддаленого відкликання перевірки сертифікату в конструкторі потоку SSL.


1

Для подальшого розширення посту BIGNUM - в ідеалі ви хочете, щоб рішення, яке буде імітувати умови, які ви побачите у виробництві та зміні вашого коду, цього не зробить і може бути небезпечним, якщо ви забудете вийняти код перед його розгортанням.

Вам знадобиться якийсь самовільний сертифікат. Якщо ви знаєте, що ви робите, ви можете використовувати розміщений у форматі двійковий BIGNUM, але якщо ні, ви можете піти на полювання на сертифікат. Якщо ви використовуєте IIS Express, у вас буде вже одна з них, вам доведеться її просто знайти. Відкрийте Firefox або будь-який браузер, який вам подобається, і перейдіть на свій веб-сайт розробників. Ви повинні мати можливість переглядати інформацію про сертифікат із рядка URL-адреси, і залежно від веб-переглядача ви зможете експортувати сертифікат у файл.

Потім відкрийте MMC.exe і додайте оснащення сертифіката. Імпортуйте файл свого сертифіката в магазин довірених кореневих сертифікатів і це все, що вам потрібно. Важливо переконатися, що він потрапляє в цей магазин, а не в інший магазин, наприклад "Особистий". Якщо ви не знайомі з MMC або сертифікатами, існує чимало веб-сайтів з інформацією про те, як це зробити.

Тепер ваш комп’ютер в цілому неявно буде довіряти будь-яким сертифікатам, які він створив сам, і вам не потрібно буде додавати код, щоб спеціально обробити це. Коли ви переходите до виробництва, він продовжить працювати, якщо у вас встановлений належний дійсний сертифікат. Не робіть цього на виробничому сервері - це було б погано, і це не буде працювати для інших клієнтів, крім тих, що знаходяться на самому сервері.


1

Це працює для .Net Core. Зателефонуйте своєму клієнту Soap:

client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication =
                new X509ServiceCertificateAuthentication()
                {
                    CertificateValidationMode = X509CertificateValidationMode.None,
                    RevocationMode = X509RevocationMode.NoCheck
                };  
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.