CryptoPro / libcore

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Не находит сертификат X509Certificate2Collection.Find с findType=X509FindType.FindByIssuerDistinguishedName (Linux)

AlexeyAKat opened this issue · comments

Добрый день!

Следующий код в Windows находит сертификат, в Linux (Ubuntu 18.04) не находит.

// cert - X509Certificate2 сертификат 2012_256
var certificates = new X509Certificate2Collection(cert);

// Не находит сертификат под Linux:
var result = certificates.Find(X509FindType.FindByIssuerDistinguishedName, cert.IssuerName.Name, false);
Console.WriteLine($"Count={result.Count}");
// Windows: Count=1
// Linux: Count=0

Поиск изначально используется при проверке CMS подписи, не содержащей сертификат подписанта, для поиска сертификата в хранилище. И, если тип подписанта X509IssuerSerial, то ищем в т.ч. по строке ((X509IssuerSerial)signedCms.SignerInfos[0].SignerIdentifier.Value).IssuerName, которая совпадает по значению с signerCert.IssuerName.Name.
Также в Linux возвращает false метод signerIdentifier.MatchesCertificate(signerCert), хотя в Windows результат = true.

Интересно, что если для Find использовать значение cert.Issuer вместо cert.IssuerName.Name, то поиск работает.
Если сравнить значения, то в Linux различаются именования части элементов - INN вместо ИНН, OGRN вместо ОГРН (и т.д.).
Например:

Cert.IssuerName.Name=INN=007702235133, OGRN=1037700013020, CN=Центральный банк Российской Федерации, O=Банк России, STREET="ул. Неглинная, д. 12", L=г. Москва, S=77 г. Москва, C=RU
Cert.Issuer         =ИНН=007702235133, ОГРН=1037700013020, CN=Центральный банк Российской Федерации, O=Банк России, STREET="ул. Неглинная, д. 12", L=г. Москва, S=77 г. Москва, C=RU

В Windows значения совпадают:

Cert.IssuerName.Name=ИНН=007702235133, ОГРН=1037700013020, CN=Центральный банк Российской Федерации, O=Банк России, STREET="ул. Неглинная, д. 12", L=г. Москва, S=77 г. Москва, C=RU
Cert.Issuer         =ИНН=007702235133, ОГРН=1037700013020, CN=Центральный банк Российской Федерации, O=Банк России, STREET="ул. Неглинная, д. 12", L=г. Москва, S=77 г. Москва, C=RU

Аналогичная проблема с поиском findType=FindBySubjectDistinguishedName и полями cert.Subject и cert.SubjectName.Name.

LibCore 2024.1.10.1, КриптоПро CSP 5.0.12997 КС1, Docker Ubuntu 18.04, Windows 10 22H2 19045.4046.

Добрый день.

Да, воспроизвели поведение. Действительно в IssuerName.Name попадают данные из исходного Pal для сертификата. В случае windows срабатывает csp и возвращает корректное значение. В случае linux Pal по умолчанию использует openssl, который с силу своих возможностей декодирует строку с английскими наименованиями.

В версии LibCore 2024.2.29 данное поведение исправлено, оба свойства возвращают одинаковую строку из csp.

Если вам не нужно использование pkcs можете перейти на актуальную бета версию. Иначе - пока пользоваться свойством IssuerName.Name.

Мне нужно использовать pkcs, подожду следующих релизов.

Спасибо!

Мне нужно использовать pkcs, подожду следующих релизов.

Спасибо!

Можно пробовать pkcs в последнем пререлизе.

Добрый день.
Использовали последние версии:
CryptoPro.Security.Cryptography.Pkcs [2024.4.16.2.nupkg]
CryptoPro.Security.Cryptography.Pkcs.[2024.4.17.nupkg]
Симптомы те же самые, не проходит проверку на astra linux, на windows все работает.

Добрый день. Использовали последние версии: CryptoPro.Security.Cryptography.Pkcs [2024.4.16.2.nupkg] CryptoPro.Security.Cryptography.Pkcs.[2024.4.17.nupkg] Симптомы те же самые, не проходит проверку на astra linux, на windows все работает.

Добрый день.

Используете CpX509Certificate2Collection?

Добрый день. Использовали последние версии: CryptoPro.Security.Cryptography.Pkcs [2024.4.16.2.nupkg] CryptoPro.Security.Cryptography.Pkcs.[2024.4.17.nupkg] Симптомы те же самые, не проходит проверку на astra linux, на windows все работает.

Добрый день.

Используете CpX509Certificate2Collection?

Мне просто необходимо проверить данные и что в подписи. Использую
CpSignedCms signedCms = new CpSignedCms(contentInfo, true);
signedCms.CheckSignature(true);
И ради интереса попробовал передать
CpX509Certificate2Collection cpX509Certificate2s = new CpX509Certificate2Collection();
signedCms.CheckSignature(cpX509Certificate2s, true);

Нюанс как я понял заключается в методе
private static CpX509Certificate2? FindSignerCertificate(CpSubjectIdentifier signerIdentifier, CpX509Certificate2Collection? extraStore) класса CpSignerInfo, конкретно в этой строке
if (item.IssuerName.Name == cpX509IssuerSerial.IssuerName)
{
cpX509Certificate = item;
break;
}
у cpX509IssuerSerial берется INN вместо ИНН, OGRN вместо ОГРН.
версия opensll 1.1.1l-1astra3

Да, действительно в этом месте была ошибка, использовался стандартный декодер из asn1. Спасибо.

Проблема должна уйти в сборке по ссылке ниже:
https://file.cryptopro.ru/f/K7DhO2gytlny6DpVQUtB1IQqFowdG6Vu/LibCore_2024.4.23.zip

Установил, проверил. Работает. Спасибо!