Как использовать сертификат из Azure KeyVault с HttpClient, не извлекая его из HSM? - PullRequest
0 голосов
/ 27 августа 2018

Я звоню в удаленный 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 не являются виртуальными, я не могу переопределить их в производном классе (одно решение, о котором я думал). Если я что-то упускаю, у меня очень мало шансов сделать это так, как я бы этого хотел.

...