Не находит сертификат 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
Установил, проверил. Работает. Спасибо!