Подтвердить что ты не робот

Подключение .NET к веб-интерфейсу ssl

У меня есть API-интерфейс ASP.NET, который я бы хотел использовать с ssl. В настоящее время сервер использует самозаверяющий сертификат, и в этот момент разрешены как http, так и https. У меня очень простой тестовый клиент, который отлично работает для http, но не работает для https. Я хотел бы знать, как изменить код клиента ниже, чтобы он работал с https. В настоящее время IE, Firefox и Chrome могут подключаться к веб-API, используя как http, так и https (с предупреждениями о сертификатах), поэтому это заставляет меня думать, что мне не нужно ничего изменять на сервере, как раз в клиентском коде. Здесь код клиента:

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.

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

4b9b3361

Ответ 1

Взгляните на С# Игнорировать ошибки сертификата Вопрос SO. Я считаю, что вы можете добавить обработчик проверки сертификатов, используя ServicePointManager, чтобы обойти проверку сертификата. Возможно, было бы неплохо использовать подписанный сертификат в вашей рабочей среде.

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

Ответ 2

Это сработало для меня. Просто добавьте следующее перед вызовом GetAsync.

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Это игнорирует ошибки SSL. Это рекомендуется только в среде интрасети или в другой закрытой сети, где идентификаторы сервера нельзя подделать.

Ответ 3

Это сообщение об ошибке означает, что клиент не доверяет серверному сертификату во время установления связи SSL. Некоторые браузеры немного более прощающие и дают вам "красную полосу", но вызов из кода приведет к ошибке 401 и отклоненному вызову.

Вам не нужно ничего делать с настройками сертификата клиента в IIS (потому что я предполагаю, что вы не используете сертификат клиента).

Это сообщение об исключении сообщает вам, что самоподписанная цепочка сертификатов отклоняется при проверке на клиенте. Вы можете обойти это, экспортируя (без закрытого ключа), самозаверяющий сертификат и устанавливая его на клиентской машине в качестве корневого сертификата.

Если это не сработает, вам необходимо создать новый сертификат CA (сертификат центра сертификации), а затем сгенерировать новый сертификат сервера, подписанный с CA. Этот CA, наконец, должен быть установлен на клиентской машине в качестве корневого сертификата.

Это хороший пост, который показывает процесс с использованием makecert и pvk2pfx.

EDIT: Похоже, может быть способ настроить HttpClient на игнорирование ошибок SSL. Но я настоятельно рекомендую вам попытаться не иметь ошибок SSL с самого начала.