В C# как мне создать неверную цепь X509? - PullRequest
0 голосов
/ 17 февраля 2020

Перечисление X509ChainStatusFlags содержит много возможных значений: https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.x509certificates.x509chainstatusflags?view=netframework-4.8

Существуют ли простые способы создания сертификата и цепочки, которые производят некоторые из этих флагов ? Я хочу построить их, чтобы провести интеграционное тестирование моего сертификата проверки лога c.

1 Ответ

1 голос
/ 20 апреля 2020

Каждый вид сбоя требует разного объема работ для проверки. Некоторые из них просты, а некоторые требуют герои c усилий.

Самое простое: код ошибки 1: X509ChainStatusFlags.NotTimeValid.

X509Certificate2 cert = ...;
X509Chain chain = new X509Chain();
chain.ChainPolicy.VerificationTime = cert.NotBefore.AddSeconds(-1);
bool valid = chain.Build();
// valid is false, and the 0 element will have NotTimeValid as one of the reasons.

Далее: X509ChainStatusFlags.NotValidSignature.

X509Certificate2 cert = ...;
byte[] certBytes = cert.RawData;
// flip all the bits in the last byte
certBytes[certBytes.Length - 1] ^= 0xFF;
X509Certificate2 badCert = new X509Certificate2(certBytes);
chain.ChainPolicy.ApplicationPolicy.Add(new Oid("0.0", null));
bool valid = chain.Build();
// valid is false. On macOS this results in PartialChain,
// on Windows and Linux it reports NotValidSignature in element 0

Далее: X509ChainStatusFlags.NotValidForUsage.

X509Certificate2 cert = ...;
X509Chain chain = new X509Chain();
chain.ChainPolicy.ApplicationPolicy.Add(new Oid("0.0", null));
bool valid = chain.Build();
// valid is false if the certificate has an EKU extension,
// since it shouldn't contain the 0.0 OID.
// and the 0 element will report NotValidForUsage.

Некоторые из более сложных требуют неправильного построения цепочек сертификатов, например, если у дочернего сертификата есть NotBefore / NotAfter, который не расположен внутри CA's NotBefore / NotAfter. Некоторые из этих героев c проверены в https://github.com/dotnet/runtime/blob/4f9ae42d861fcb4be2fcd5d3d55d5f227d30e723/src/libraries/System.Security.Cryptography.X509Certificates/tests/DynamicChainTests.cs и / или https://github.com/dotnet/runtime/blob/4f9ae42d861fcb4be2fcd5d3d55d5f227d30e723/src/libraries/System.Security.Cryptography.X509Certificates/tests/RevocationTests/DynamicRevocationTests.cs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...