Убедитесь, что сертификат действителен для шифрования / дешифрования
Как упоминалось в таких вопросах, как этот, этот и этот, если вы попытаетесь зашифровать / расшифровать, используя сертификат, действительный только для цифровых подписей, вы получите CryptographicException: "Плохой ключ" от RSACryptoServiceProvider.
У меня вопрос, как проверить заранее (например, когда вы настраиваете сертификаты в своем приложении), является ли сертификат действительным для этой цели. Я обнаружил, что подобного подхода с использованием только расширений v3 недостаточно, поскольку RSACryptoServiceProvider прекрасно работает для дешифрования с использованием сертификата с расширением v3 только для цифровых сигнатур.
Поэтому я предполагаю, что мне нужно будет проверить конкретный список OID, используя код, подобный тому, что я нашел здесь:
private static bool IsCertificateOkForDecryption(X509Certificate2 certificate)
{
string[] validOids =
{
//TODO: what goes here??
};
return (
certificate.Extensions.Where(e=> validOids.Contains(e.Oid.Value)
.Any()
);
}
(код не является точным - только для иллюстрации)
Есть ли более простой способ?
Если нет, где я могу найти список допустимых OID?
Для получения дополнительной информации см. Также проблему SAML Kentor.AuthServices, которая вызвала этот вопрос.