Как получить HTTP-ответ в .NET Core несмотря на ошибку сертификата - PullRequest
1 голос
/ 10 апреля 2019

Я сделал небольшое консольное приложение в .NET Core для выполнения запросов REST / Http с использованием сертификатов .pfx / .p12 во время процесса проверки. Приложение работает очень хорошо, когда я предоставляю ему правильный сертификат с правильным паролем. Но он падает, когда я

  • загрузить недействительный сертификат
  • неверный пароль, связанный с сертификатом
  • если я скажу приложению не загружать сертификат, даже если сертификат необходим.

В частности, я получаю следующие исключения:

System.Net.Http.HttpRequestException: 'Не удалось установить соединение SSL, см. Внутреннее исключение.'

AuthenticationException: аутентификация не удалась, см. Внутреннее исключение.

Win32Exception: полученное сообщение было неожиданным или плохо отформатировано

Я бы предпочел получить ответ HTTP, соответствующий недействительному вызову, который, по-видимому, является тем, что я получаю, когда использую SOAPUI.

Я использую следующий метод для создания HttpClientHandler:

private static HttpClientHandler GetClientHandler(string certificate, string password)
{

    X509Certificate2 certPfx;

    try {
        certPfx = new X509Certificate2(certificate, password);
    }
    catch(CryptographicException e) {
        Console.WriteLine($ "Error occured while trying to load certificate: {e.Message}");
        return null;
    }

    var clientHandler = new HttpClientHandler();
    clientHandler.SslProtocols = SslProtocols.Tls12;
    clientHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
    clientHandler.ClientCertificates.Add(certPfx);
    clientHandler.ServerCertificateCustomValidationCallback += (HttpRequestMessage req, X509Certificate2 cert2, X509Chain chain, SslPolicyErrors err) = >true;
    return clientHandler;
}

И я использую следующий код для выполнения запроса POST:

using(var client = handler != null ? new HttpClient(handler, true) : new HttpClient())
{

    AddHeaders(client, headers);

    var httpContent = new StringContent(request.ToString(), Encoding.UTF8, "application/xml");

    Console.WriteLine("Response from service:");
    Console.WriteLine("----------------------");
    var response = await client.PostAsync(endpoint, httpContent);

    var responseString = await response.Content.ReadAsStringAsync();

    Console.WriteLine(responseString);
    Console.WriteLine("----------------------");
    Console.WriteLine("----------------------");
}
...