Используйте X509Certificate2 с Windows хранилищем сертификатов, HSM и Azure Key Vault - PullRequest
2 голосов
/ 19 марта 2020

У меня есть много методов, подобных приведенному ниже, в которых используется X509Certificate2.PrivateKey

    public SomeValue DoSomething(X509Certificate2 cert)
    {
        // do something that needs the cert.PrivateKey
    }

Пока что они хорошо работают с сертификатами, которые хранятся в хранилище сертификатов Windows, чьи закрытые ключи доступны. Теперь проблема в том, что мне нужно поддерживать сертификаты, хранящиеся на устройствах HSM и Azure Key Vault HSM, где закрытые ключи не могут быть загружены в память (и, таким образом, свойство PrivateKey имеет значение null).

I'm ищу способ избежать изменения сигнатур моих методов publi c. Если свойство PrivateKey является виртуальным, я легко создаю подклассы и возвращаю соответствующую реализацию AsymmetricAlgorithm для каждого типа хранилища (чтобы это было понятно, например, в Azure Key Vault HSM, AsymmetricAlgorithm будет реализацией, которая вызывает Azure Key Хранилище для подписи). Кстати, установщик свойства PrivateKey не позволяет мне устанавливать свой пользовательский AsymmetricAlgorithm.

Другая проблема заключается в том, что свойство PrivateKey сейчас не используется, и рекомендуется использовать метод расширения GetRSAPrivateKey.

Есть ли какой-нибудь прием, который я могу использовать, чтобы метод расширения X509Certificate2.PrivateKey или GetRSAPrivateKey возвращал нужный мне AsymmetricAlgorithm типа?

...