#c# #security #cryptography #ecdsa
#c# #Безопасность #криптография #ecdsa
Вопрос:
Мы генерируем сертификаты, которые должны содержать ключ ECDSA, хранящийся в TPM. Насколько я понимаю, метод расширения GetECDsaPrivateKey загрузит дескриптор в алгоритм для закрытого ключа в TPM. Это правда? Сертификаты, которые мы тестируем, продолжают возвращать null, и мне нужно знать, просто ли они создаются неправильно или тестовый код плохой. Описание метода MSDN в этом случае не очень полезно.
Ответ №1:
Да, если было сказано посмотреть там.
В Windows X509Certificate2 от .NET поддерживается API-интерфейсами сертификатов Windows. Сертификаты Windows имеют свойства (в дополнение к их атрибутам в сертификате), и одно из свойств определяет, где находится закрытый ключ (по сути, аргументы CngKey.Open
) — если свойство отсутствует (и свойство «Я уже открыл закрытый ключ [здесь]» также отсутствует), тогда сертификат «не имеет закрытого ключа» (cert.HasPrivateKey == false).
Если ваш сертификат является частью хранилища сертификатов Windows, и при просмотре этого хранилища через MMC отображается значок закрытого ключа, то GetECDsaPrivateKey()
можете открыть его (при условии, что ключ не был удален постфактум, и что это ключ с поддержкой ECDsa).
Если вы загружаете сертификат из .cer
файла или каким-либо другим способом, то сертификат не знает, что доступен закрытый ключ, и он никогда не ищет его. Если вы знаете, как найти закрытый ключ и открыть его в объекте ECDsa (например, ECDsaCng), тогда вы можете (в памяти) связать их с помощью X509Certificate2 certWithKey = cert.CopyWithPrivateKey(key);
. В этот момент, когда было сообщено, где находится закрытый ключ, новый объект GetECDsaPrivateKey()
работает так, как ожидалось.
Комментарии:
1. Аааа … спасибо. Мне придется попробовать это. Я был ленив и просто загружал сертификат из файла crt в объект X509Certificate2. Вместо этого я открою его из хранилища сертификатов и посмотрю, работает ли этот метод для меня.
Ответ №2:
Что GetECDsaPrivateKey получает ключ, только если он является частью сертификата. Чтобы использовать ключ из TPM, вам нужно использовать CngKey.Метод Open() с именем ключа и поставщика хранилища.