2013-12-03 3 views
3

В настоящее время наше приложение проверяет сертификаты сервера в неуправляемом коде с помощью openssl (http://www.openssl.org/docs/crypto/X509_verify_cert.html). Мы переходим к управляемому коду. У меня есть сертификат X509, который переводится в управляемую сторону, но как проверить этот сертификат на C#?Проверка сертификата x509 на Mono (доверенные корни OS X)

a) Есть ли простой способ проверить этот сертификат на наличие установленных доверенных корней?

b) Если нет, то каков процесс проверки вручную? Это где-то задокументировано?

Я изучил классы в Mono.Security.X509, который дает мне инструменты для работы с сертификатами и магазинами, но у меня возникают проблемы с подключением точек.


EDIT Я добавил свое окончательное решение ниже. Я хотел бы получить дальнейшую информацию об этом подходе.

+1

Здесь есть достойное объяснение: http://stackoverflow.com/questions/7331666/c-sharp-how-can-i-validate-a-root-ca-cert-certificate-x509-chain. В принципе, используйте X509Chain, поместите все свои сертификаты внутри и создайте цепочку. У вас даже есть некоторые опции для отключения некоторых шагов проверки, если это необходимо. – mbarthelemy

+0

Спасибо. Я добавляю свое окончательное решение в качестве ответа. – TheNextman

ответ

5

Основываясь на информации here и here, я определить следующее:

  • В идеале мы должны проверить аннулированных сертификатов, однако это не является тривиальной и, как представляется, не стоит усилий
  • как минимум мы можем проверить, что сертификат является текущим, и цепи доверяют.
  • Если мы хотим, мы можем также проверить конкретные приложения, например, независимо от того, подписан ли сертификат и т. д.

Для простого примера, мы можем использовать Mono X509Chain построить цепочку сертификатов и проверить его против пользователя доверенных корней:

var x509 = new Mono.Security.X509.X509Certificate(certificateBytes); 
var chain = new Mono.Security.X509.X509Chain(); 
bool certificateStatus = chain.Build(x509); 

От изучения источника Mono, я могу видеть, что это проверяет доверие на цепочку сертификатов, а также даты сертификата. Однако аннулирование сертификата не выполняется.

Мы также проверяем соответствие имени в сертификате имени хоста, к которому подключается пользователь. Каркас .NET дает нам простой способ получить эту информацию:

var x5092 = new System.Security.Cryptography.X509Certificates.X509Certificate2(certificateBytes); 
string hostName = x5092.GetNameInfo(System.Security.Cryptography.X509Certificates.X509NameType.DnsName, false); 
bool hostNameMatch = string.Compare(hostName, this.Server, true) == 0; 

Сертификатов также может иметь альтернативные имена, которые должны быть проверены, но с использованием X509NameType.DnsAlternativeName, кажется, не будет реализовано на Mono (это жестко закодировано в возврат string.Empty).

Насколько я вижу, это хорошее базовое решение.

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