Проверка пути сертификата x509 C#

Я получаю x509certificate2 из подписанного документа XML. И тогда мне нужно проверить путь к сертификату, но для этого мне нужно 3 сертификата: root, CA, end. Как это сделать? Сертификат с карты электронного удостоверения личности (это от правительства Армении, так что это надежный якорь). Статус отзыва хороший, но не может построить путь к сертификату. Я написал так, но не знаю, правильно это или нет, потому что он выдает исключение на

var pkixResult = certPathValidator.Validate(certPath, paramsPkix);

$exception {Якорь доверия для пути сертификации не найден.} Org.BouncyCastle.Pkix.PkixCertPathValidatorException

public static PkixCertPathValidatorResult Validate_Pkix(SignatureDocument signatureDocument)
        {
            var signingCertificate = signatureDocument.XadesSignature.GetSigningCertificate();
            X509Chain chain = new X509Chain();
            chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
            chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
            chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;

            chain.Build(signingCertificate);


            var sigCert = signingCertificate.ToBouncyX509Certificate();
            var issuer = chain.ChainElements[0].Certificate;
            var client = chain.ChainElements[1].Certificate;
            var final = chain.ChainElements[2].Certificate;


            //-----------------

            Org.BouncyCastle.X509.X509Certificate clientCert = client.ToBouncyX509Certificate();
            Org.BouncyCastle.X509.X509Certificate issuerCert = issuer.ToBouncyX509Certificate();
            Org.BouncyCastle.X509.X509Certificate finalCert = chain.ChainElements[2].Certificate.ToBouncyX509Certificate();

            var x509Certs = new List<Org.BouncyCastle.X509.X509Certificate>();

            x509Certs.Add(sigCert);
            x509Certs.Add(clientCert);
            x509Certs.Add(finalCert);

            IX509Store x509CertStore = X509StoreFactory.Create("Certificate/Collection", new X509CollectionStoreParameters(x509Certs));


            var certPath = new PkixCertPath(x509Certs);

            ISet trust = new HashSet { new TrustAnchor(x509Certs[0], null) };

            var certPathValidator = new PkixCertPathValidator();

            var paramsPkix = new PkixParameters(trust);
            paramsPkix.AddStore(x509CertStore);
            paramsPkix.IsRevocationEnabled = false;

            var pkixResult = certPathValidator.Validate(certPath, paramsPkix);

            return pkixResult;
        }

person Grisha Pipoyan    schedule 18.11.2020    source источник


Ответы (1)


Вам необходимо добавить сертификат Root CA в файл x509Certs. Если это не является частью документа с подписью, вы можете использовать расширения AIA, чтобы попытаться загрузить его, или использовать магазин Windows - поскольку вы говорите, что корню доверяют.

Поэтому загрузите корень из Х509Магазин.

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

person Daniel Fisher lennybacon    schedule 19.11.2020
comment
Если X509Chain делает это, мне не нужно писать этот код, да? - person Grisha Pipoyan; 19.11.2020