Как отправить запросы Https C # (с сертификатом клиента) без установки сертификата на хост-ОС - PullRequest
0 голосов
/ 21 октября 2019

Из моего консольного приложения я хочу выполнить http-запрос (GET) с использованием HttpClient. Я получил Сертификат клиента, ключ и Root CA (.pem файлы) от сервисной команды REST. Используя OpenSSL, я скопировал эти сертификаты (.pem) в файл .pfx. Я проверил этот сертификат, выпустив Http GET для остальной службы с сертификатом .pfx, прикрепленным с использованием Почтальон . Он работает как шарм.

Проблема в том, что мое Консольное приложение загружает сертификат клиента из файловой системы и выполняет HETP GET, он получает 403-forbidden ответ.

Клиентское приложение может успешно отправлять Http Get и Receive respose, когда я устанавливаю сертификат клиента на свой компьютер и запускаю тот же код.

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

Вот мой код.

namespace TestClientApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

            var x509Certificate2 = new X509Certificate2(@"C:\TestClientAppDir\clientCert.pfx"),"<password>");

            var handler = new HttpClientHandler();
            handler.ClientCertificates.Add(x509Certificate2);
            HttpClient client = new HttpClient(handler);
            try
            {
                var response = await client.GetAsync("https://rest service url");
                Console.WriteLine($"Server returned status: {response.IsSuccessStatusCode}, {response.StatusCode.ToString()} \n Content {await response.Content.ReadAsStringAsync()}");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                client.Dispose();
            }
            Console.Read();
        }
    }
}
...