Я звоню в удаленный API, требующий аутентификации с использованием SSL-сертификата с кодом, подобным следующему:
let httpClient (x509Cert: X509Certificate2) =
let handler = new HttpClientHandler()
handler.SslProtocols <- SslProtocols.Tls12
handler.ClientCertificateOptions <- ClientCertificateOption.Manual
handler.ClientCertificates.Add(x509Cert) |> ignore
let client = new HttpClient(handler)
client
Код работает нормально при использовании локального сертификата (загруженного из файла или хранилища сертификатов), но по соображениям безопасности я бы предпочел использовать HSM (Azure KeyVault) напрямую, а не работать с сертификатом (или, точнее, с частным ключом). Можно ли добиться?
Для других целей, когда требуется закрытый ключ (обычно это экземпляр AsymmetricAlgorithm), я использую реализацию, вдохновленную библиотекой RSAKeyVaultProvider , которая делегирует подпись в HSM вместо извлечения закрытого ключа из HSM. Я предполагаю, что этот подход может быть использован и здесь, но я не могу найти API, который бы включил эту опцию. Я перерыл исходный код HttpClient
, HttpClientHandler
и других связанных классов, но на самом деле не нашел ничего, что могло бы дать мне надежду.
Кто-нибудь сталкивался с таким вызовом? Есть ли жизнеспособные решения, кроме переписывания всего стека HttpClient
?
Обновление
Из просмотра исходного кода .NET я заметил, что в какой-то момент происходит приведение сертификатов (первоначально как X509Certificate
) к X509Certificate2
, и есть проверки, чтобы проверить, есть ли у него закрытый ключ и поддерживает необходимые функции (цифровая подпись и аутентификация клиента). Учитывая, что большинство свойств X509Certificate2
не являются виртуальными, я не могу переопределить их в производном классе (одно решение, о котором я думал). Если я что-то упускаю, у меня очень мало шансов сделать это так, как я бы этого хотел.