Проблема в этом случае была с сертификатом - в частности, с закрытым ключом.
Я использовал .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);