2013-08-12 4 views
-1

У меня следующая ситуация:Проверка сертификата ЦС с помощью открытого ключа в C#

я получаю сертификат от ЦС, и я также есть открытый ключ ЦС, который я хочу использовать для проверки подлинности сертификатов.

Сейчас мы используем стороннюю библиотеку SecureBlackBox, но мы хотим избавиться от коммерческих зависимостей в нашем проекте. С SBB работает следующим образом:

cert.ValidateWithCA(CACertificate); 

Есть ли способ сделать это с помощью предусмотренных классов X509Certificate2 .NET? я нашел способ проверить(), который не принимает никаких аргументов, но я не совсем уверен, что он делает ...

Спасибо

+1

Если вы не знаете, что он делает, прочитайте [документацию] (http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.aspx). – Stijn

+0

«Выполняет проверку цепочки X.509 с использованием базовой политики проверки». и "Выдает System.Security.Cryptography.CryptographicException" –

+0

@Stijn, что документация является шуткой, чтобы узнать об этом. Он ничего не объясняет. – WDUK

ответ

2

, не зная больше о том, что ValidateWithCAделает, это действительно трудно сообщите вам, если Verify - идеальная замена. Verify в конечном итоге вызывает функцию native CertVerifyCertificateChainPolicy с значением pszPolicyOID 1. Убедитесь, что он не просто проверяет, что один сертификат подписан другим, он проверяет другие действия, такие как аннулирование любых сертификатов в цепочке.

Я предлагаю вам создать серию тестов, подтверждающих, что Verify работает, по сравнению с ValidateWithCA.

Update:

После прочтения документации по ValidateWithCA, это документально, как

Подтверждает сертификат, подписанный центром сертификации

, который не так тщательно, как Verify. Это зависит от вас, чтобы решить, является ли этот уровень проверки тем, что вы хотите. Если это не обязательно то, что вы хотите, вы можете установить обратный вызов ServicePointManager.ServerCertificateValidationCallback и предоставить пользовательскую проверку, если вам не нужен одинаковый уровень проверки.

+0

Ну, как я уже сказал в вопросе, я хочу использовать открытый ключ сертификата CA для проверки сертификата. Но Verify() не принимает никаких аргументов, поэтому я не уверен, как это сделать. Я нашел способ в OpenSSL X509_verify (X509 * x509, EVP_PKEY * pkey), но возможно ли это с классами .net? – PogoMips

+0

В этом заключается «цепочка». Каждый сертификат подписывается, проверяя «цепочку», он проверяет подпись каждого сертификата в «цепочке» (включая сертификат ЦС). Это означает, что если сертификат CA «недействителен» (истек и т. Д.), Ваш сертификат больше недействителен. Предоставляя обратный вызов ServerCertificateValidationCallback, вы можете обнаружить эти другие проверки и проигнорировать их (например, игнорировать тот факт, что сертификат CA может быть истек) - если все, что вы хотите знать, это если оно правильно подписано. –

Смежные вопросы