Я знаю, что есть много вопросов по этому аргументу, но я застрял в этом в течение нескольких дней, так что я здесь.У меня есть корневой сертификат и сертификат клиента.Мне нужно реплицировать в проекте веб-API C # то, что делает команда openssl verify -CAfile ca.pem client.pem
.
Это то, что я знаю сейчас (надеюсь, что это действительно так):
Verify()
Метод на самом деле проверить, что сертификат подписан органом.Это как контроль формата.Не имеет значения, какой орган подписал сертификат. X509 Chain
- это путь.Добавьте свой сертификат CA в дополнительный магазин, потому что я не собираюсь устанавливать сертификат в Windows.Затем построить, передав сертификат клиента.Давайте волшебство случится!К сожалению, у меня есть некоторые проблемы с конфигурацией.
Позвольте мне быть более ясным с примером
private bool VerifyCertificate(X509Certificate2 client)
{
X509Chain chain = new X509Chain();
var stringCert = WebConfigurationManager.AppSettings["CACertificate"];
var byteCert = Encoding.ASCII.GetBytes(stringCert);
var authority = new X509Certificate2(byteCert);
chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
chain.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreWrongUsage;
chain.ChainPolicy.ExtraStore.Add(authority);
// Do the preliminary validation.
if (!chain.Build(client))
return false;
return true;
}
С этим примером программа возвращает false
.Сборка не пройдена.Я уверен, что проблема с ChainPolicy properties
, поэтому я попробовал другую конфигурацию
chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot;
chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;
chain.ChainPolicy.VerificationTime = DateTime.Now;
chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 0, 0);
Но этот не будет проверять что-нибудь , фактически используя мой сертификатметод возвращает true
и, используя другой сертификат CA (который я не использовал для подписи своего клиентского сертификата), метод также возвращает true
.
Я искал оболочку OpenSSL для C # и нашел ее, ноК сожалению, он основан на старых библиотеках, и репозиторий больше не обслуживается.Кроме того, я бы достиг своей цели, используя только .net framework, если это возможно.
Так что, ребята, быстрое резюме.Я хочу проверить, что только сертификат, подтвержденный моим сертификатом ca, может пройти проверку, все остальные должны быть остановлены.
Заранее благодарен за любую помощь