Выполните HTTPS-вызов через HttpClient с клиентским сертификатом, который не имеет доступа к закрытому ключу. - PullRequest
0 голосов
/ 20 февраля 2019

Можно ли отправить клиентский сертификат без (доступа к) закрытого ключа в запросе HTTP (например, с помощью HttpClient)?

Целевой API может быть достигнут, и сертификат клиента доступен со следующей реализациейHTTPS-запрос, использующий сертификат клиента с закрытым ключом.

var handler = new HttpClientHandler();
handler.ClientCertificates.Add(new X509Certificate2(@"clientcertificate.pfx", "password"));
var client = new HttpClient(handler);
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "https://url");
var result = await client.SendAsync(httpRequestMessage);

Сертификат клиента читается как var clientCertificate = await Request.HttpContext.Connection.GetClientCertificateAsync(); на стороне целевого API.

Однако, когда сертификат без (доступа к) закрытого ключаиспользуется во время запроса HTTPS, целевой API не получает сертификат клиента (это значение null в свойстве Request.HttpContext.Connection.ClientCertificate).

handler.ClientCertificates.Add(new X509Certificate2(@"clientcertificate.crt"));

1 Ответ

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

Можно ли отправить клиентский сертификат без (доступа) закрытого ключа в запросе HTTP (например, с помощью HttpClient)?

Вы можете отправить его как контент, конечно;но вы не можете использовать его как сертификат клиента без закрытого ключа.Это все равно, что войти в систему, просто указав имя пользователя.

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

...