Клиент.NET, подключающийся к ssl Web API
У меня есть веб-API ASP.NET, который я хотел бы использовать с ssl. В настоящее время сервер использует самозаверяющий сертификат, и в настоящий момент разрешены как http, так и https. У меня есть очень простой тестовый клиент, который отлично работает для http, но не работает для https. Я хотел бы знать, как изменить код клиента ниже, чтобы он работал с https. В настоящее время IE, Firefox и Chrome могут подключаться к веб-API с использованием http и https (с предупреждениями cert), поэтому я полагаю, что мне не нужно ничего менять на сервере, только в коде клиента. Вот код клиента:
static void Main(string[] args)
{
try
{
if (args.Length != 1)
{
Console.WriteLine("Please provide a url, and only a url.");
return;
}
var url = new Uri(args[0]);
var urlAuthority = url.GetLeftPart(UriPartial.Authority);
var urlPathQuery = args[0].Substring(urlAuthority.Length);
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(urlAuthority);
HttpResponseMessage response = client.GetAsync(urlPathQuery).Result;
if (response.IsSuccessStatusCode)
Console.WriteLine(response.Content.ReadAsAsync<string>().Result); // expecting scalar results only
else
Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
}
catch (Exception ex)
{
Exception tempEx = ex;
while (tempEx != null)
{
Console.WriteLine(tempEx.Message);
tempEx = tempEx.InnerException;
}
}
}
Когда я запускаю приведенный выше код с моим http URL, он работает нормально. Когда я изменяю URL на https, печатаются следующие ошибки:
One or more errors occurred.
An error occurred while sending the request.
The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
The remote certificate is invalid according to the validation procedure.
У меня один вопрос: должен ли клиент вручную отправить открытый ключ на сервер, чтобы он знал, как отправить зашифрованный ответ, или это происходит автоматически за кулисами? И, во-вторых, теперь, увидев последнюю ошибку, мне интересно, нужно ли мне что-то еще делать внутри клиента, чтобы игнорировать предупреждения сертификата и просто полагать, что этот сертификат в порядке, чтобы продолжить?
3 ответа
Взгляните на C# Игнорировать ошибки сертификата, ТАК вопрос. Я полагаю, что вы можете добавить обработчик проверки сертификата, используя ServicePointManager, чтобы обойти проверку сертификата. Возможно, было бы неплохо использовать подписанный сертификат в вашей производственной среде.
ServicePointManager
.ServerCertificateValidationCallback +=
(sender, cert, chain, sslPolicyErrors) => true;
Это сработало для меня. Просто добавьте следующее перед вызовом GetAsync.
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
Это будет игнорировать ошибки SSL. Это рекомендуется только в среде интрасети или другой закрытой сети, где идентификация сервера не может быть подделана.
Это сообщение об ошибке означает, что клиент не доверяет сертификату сервера во время рукопожатия SSL. Некоторые браузеры немного прощают и дают вам "красную полосу", но вызов из кода приведет к 401 и отклоненному вызову.
Вам не нужно ничего делать с настройками сертификата клиента в IIS (потому что я предполагаю, что вы не используете сертификат клиента).
Это сообщение об исключении говорит вам, что цепочка самозаверяющих сертификатов отклоняется при проверке на клиенте. Вы можете обойти это, экспортировав (без закрытого ключа) самоподписанный сертификат и установив его на клиентском компьютере в качестве корневого сертификата.
Если это не работает, вам нужно создать новый CA (сертификат центра сертификации), а затем создать новый сертификат сервера, который подписан с CA. Этот CA, наконец, должен быть установлен на клиентском компьютере в качестве корневого сертификата.
Это хороший пост, который показывает процесс с использованием makecert и pvk2pfx.
РЕДАКТИРОВАТЬ: похоже, что может быть способ настроить HttpClient
игнорировать ошибки SSL. Но я настоятельно рекомендую, чтобы вы с самого начала старались не иметь ошибок SSL.