Почему при подключении сертификата клиента появляется сообщение «Не удалось создать безопасный канал SSL / TLS»? - PullRequest
0 голосов
/ 08 февраля 2019

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

Код выглядит следующим образом (возможно, он содержит много вещей, которые не требуются при поиске неуловимого решения):

// build stuff
var httpClientHandler = new HttpClientHandler
{
    AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip,
    ClientCertificateOptions = ClientCertificateOption.Manual
};
var certificate = new X509Certificate(certName, password, X509KeyStorageFlags.UserKeySet);
httpClientHandler.ClientCertificates.Add(certificate);
var request = new HttpRequestMessage(HttpMethod.Post, url)
{
    Content = new StringContent(requestBody, Encoding.UTF8, "application/xml")
};
var httpClient = new HttpClient(httpClientHandler);
httpClient                   
    .DefaultRequestHeaders
    .Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

// Enable protocols
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls;
ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;

// fire! (here's where the exception is thrown)
var response = await httpClient.SendAsync(request).ConfigureAwait(false);

1 Ответ

0 голосов
/ 11 февраля 2019

Проблема в этом случае была с сертификатом - в частности, с закрытым ключом.

Я использовал .cer сертификат, который ведет себя не так, как .pfx файл.SoapUI и curl отлично работают с .cer, но код C #, который загружает .cer, теряет закрытый ключ.(Почему серверу, к которому мы подключаемся, требуется закрытый ключ - это другой вопрос, насколько я понимаю, что он не должен этого делать, - благодарен за любые мысли по этому поводу.) Точно так же файлы .cer, загружаемые в хранилище через оснастку MMC, такжепотерять закрытый ключ.Я не выяснил почему.

Хотя мои первоначальные попытки загрузить файл .pfx в хранилище сертификатов были успешными, когда я запустил приложение под другой учетной записью, вернулась ошибка «Не удалось создать безопасный канал SSL / TLS» (объяснения здесь и здесь ).По сути, хранилище сертификатов хранит закрытый ключ в расположении файловой системы, доступном только пользователю, загружающему сертификат в хранилище.

Вместо этого я загрузил сертификат непосредственно из файловой системы, например:

var certBytes = File.ReadAllBytes(certFileName);
var certificate = new X509Certificate2(certBytes, password, X509KeyStorageFlags.Exportable);

var httpClientHandler = new HttpClientHandler();
httpClientHandler.ClientCertificates.Add(certificate);
var request = new HttpRequestMessage(HttpMethod.Post, url)
{
    Content = new StringContent(requestBody, Encoding.UTF8, "application/xml")
};

var httpClient = new HttpClient(httpClientHandler);

httpClient                   
    .DefaultRequestHeaders
    .Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

// fire!
var response = await httpClient.SendAsync(request).ConfigureAwait(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...