Обход ошибок недействительных сертификатов SSL при вызове веб-сервисов в .Net

88

Мы настраиваем новый SharePoint, для которого у нас еще нет действующего сертификата SSL. Я хотел бы вызвать на нем веб-службу Lists, чтобы получить некоторые метаданные о настройке. Однако при попытке сделать это получаю исключение:

Базовое соединение было закрыто: не удалось установить доверительные отношения для безопасного канала SSL / TLS.

Вложенное исключение содержит сообщение об ошибке:

Удаленный сертификат недействителен согласно процедуре проверки.

Это правильно, поскольку мы используем временный сертификат.

Мой вопрос: как я могу сказать клиенту веб-службы .Net ( SoapHttpClientProtocol ) игнорировать эти ошибки?

jan.vdbergh
источник

Ответы:

18

Подход, который я использовал, когда столкнулся с этой проблемой, заключался в добавлении лица, подписавшего временный сертификат, в список доверенных органов на соответствующем компьютере.

Обычно я провожу тестирование с сертификатами, созданными с помощью CACERT, и добавление их в список доверенных лиц прошло гладко.

Это означает, что вам не нужно добавлять какой-либо специальный код в ваше приложение, и он правильно моделирует то, что произойдет, когда ваше приложение будет развернуто. Таким образом, я считаю, что это лучшее решение для программного отключения проверки.

Саймон Джонсон
источник
Это тоже была моя первая идея. К сожалению, срок действия сертификата истек, поэтому ему невозможно доверять.
jan.vdbergh
Есть ли причина, по которой вы не можете использовать кого-то вроде сертификата CA? Если это тестовый сертификат, вы можете просто продолжить. Я не уверен, есть ли способ отключить эти проверки!
Саймон Джонсон,
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
Это все, что вам нужно сделать, если вы хотите быть уязвимыми для атаки «Человек посередине» ...
Хаутман
2
В идеале вы должны делать это только в среде разработки.
Рон ДеФрейтас 08
79

Как и ответ Джейсона С.

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Я помещаю это в свой Main, смотрю на свой app.configи проверяю, если (ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True")перед вызовом этой строки кода.

Кейт Сирмонс
источник
24

Я решил это так:

Перед вызовом веб-службы ssl, которая вызывает эту ошибку, вызовите следующее:

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;
        };
}
Иман
источник
12

У меня была такая же ошибка при использовании 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;

будет обходить invaild ssl. Напишите его в конструктор веб-службы.

Hasanaydogar
источник
1

Для новичков вы можете расширить свой частичный класс обслуживания в отдельном CS-файле и добавить код, предоставленный imanabidi, для его интеграции.

Senthil
источник
1

Чтобы еще больше расширить пост Саймона Джонсона: в идеале вам нужно решение, которое имитирует условия, которые вы увидите в производственной среде, и изменение вашего кода не будет делать этого и может быть опасным, если вы забудете вынуть код перед его развертыванием.

Вам понадобится какой-то самоподписанный сертификат. Если вы используете IIS Express, у вас уже есть один из них, вам просто нужно его найти. Откройте Firefox или любой другой браузер, который вам нравится, и перейдите на свой сайт разработчика. Вы должны иметь возможность просматривать информацию о сертификате из строки URL, и в зависимости от вашего браузера вы сможете экспортировать сертификат в файл.

Затем откройте MMC.exe и добавьте оснастку «Сертификат». Импортируйте файл сертификата в хранилище доверенных корневых центров сертификации, и это все, что вам нужно. Важно убедиться, что он попадает в этот магазин, а не в какой-то другой, например «Личный». Если вы не знакомы с MMC или сертификатами, существует множество веб-сайтов с информацией о том, как это сделать.

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

Найджел Томас
источник