CryptoPro / libcore

44 stars 0 forks source link

SignedCms signingCertificateV2 ("1.2.840.113549.1.9.16.2.47") #29

Closed sk1nned closed 1 year ago

sk1nned commented 1 year ago

Сейчас делаю SignedCms-подпись как в описании https://github.com/CryptoPro/libcore#signed-cms-detached Но результат фактически разный получается если сравнивать - и по размеру и по содержимому.

Суть проблемы в том, что подпись, полученную через утилиту cptools сервис принимает, а через библиотеку - нет.

Тестирую на версии 2023.7.31.2 под виндой.

Fasjeit commented 1 year ago

Добрый день.

Скорее всего сервису-получателю не хватает атрибута Pkcs9SigningTime.

Проставить его можно так:

CmsSigner cmsSigner = new CmsSigner(gostCert);

// Добавляем время подписания в атрибуты
cmsSigner.SignedAttributes.Add(new Pkcs9SigningTime(DateTime.Now));

signedCms.ComputeSignature(cmsSigner);

Иначе можно сравнить декодированные asn1 сообщения, и посмотреть каких атрибутов не хватает.

sk1nned commented 1 year ago

Спасибо за наводку, сравнил декодированные сообщения - не хватает атрибута "1.2.840.113549.1.9.16.2.47", кажется это signingCertificateV2. Как-то можно его добавить?

maxdm commented 1 year ago

Он добавится сам, если хоть один атрибут в подписи будет. Время — правильный выбор.

2 авг. 2023 г., в 20:18, sk1nned @.***> написал(а):



Спасибо за наводку, сравнил декодированные сообщения - не хватает атрибута "1.2.840.113549.1.9.16.2.47", кажется это signingCertificateV2. Как-то можно его добавить?

— Reply to this email directly, view it on GitHubhttps://github.com/CryptoPro/libcore/issues/29#issuecomment-1662639502, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ABVJHE5PNVSFL7O44QPKOG3XTKDURANCNFSM6AAAAAA3BNES4M. You are receiving this because you are subscribed to this thread.Message ID: @.***>

sk1nned commented 1 year ago

Pkcs9SigningTime пробовал добавлять - не помогает. И да, проверял, "1.2.840.113549.1.9.16.2.47" сам не добавляется.

Fasjeit commented 1 year ago

Видимо связано с https://github.com/CryptoPro/corefx/issues/41 (там же есть решение через Bouncy Castle).

Заметка для себя. Если делать нам - то подсмотреть сборку атрибута можно в

sk1nned commented 1 year ago

Видимо связано с https://github.com/CryptoPro/corefx/issues/41 (там же есть решение через Bouncy Castle).

Сделал так - заработало. Большое спасибо за помощь!

maxdm commented 1 year ago

Видимо связано с CryptoPro/corefx#41 (там же есть решение через Bouncy Castle).

Заметка для себя. Если делать нам - то подсмотреть сборку атрибута можно в

Точно, спасибо! Крутилось воспоминание об этом запросе в голове, но не смог вспомнить. Магию в capilite мы с тех пор доделали. @Fasjeit, давай у нас в примере сделаем.

Fasjeit commented 1 year ago

Сделал в черновом варианте по аналогии с Pkcs9SigningTime:

Использование:

// HashAlgorithmName неявно берётся на основе отрытого ключа сертификата
var attr = new PkcsSigningCertificateV2(gostCert);
cmsSigner.SignedAttributes.Add(attr);

или

// HashAlgorithmName задаётся явно
var attr = new PkcsSigningCertificateV2(gostCert, CpHashAlgorithmName.Gost3411_2012_256);
cmsSigner.SignedAttributes.Add(attr);

С виду должно быть похоже на правду. Поддержка Gost3411 + SHA256/384/512.

Декодирование пока опустим за ненадобностью, если кому нужно будет - можно будет сделать.

@sk1nned можете попробовать проверить сборки из вложения на вашем сервисе?

https://file.cryptopro.ru/f/7N1NUy1PTKbvpW8XD7nsZ7pLq2j18ip6/LibCore.Linux.2023.8.3.1.nupkg https://file.cryptopro.ru/f/mDnUTVT0slmsZD00I9ajDqr9vgydiLop/LibCore.Windows.2023.8.3.1.nupkg

sk1nned commented 1 year ago

Проверил - атрибут добавляется, но сервис не принимает подпись. Ошибка: Certificate: sn xx issued by GeneralNames:\n 4: 1.2.643.100.4=7707329152,E=uc@tax.gov.ru,1.2.643.100.1=1047707030513,C=RU,ST=77 Москва,L=г. Москва,STREET=ул. Неглинная\\, д. 23,O=Федеральная налоговая служба,CN=Федеральная налоговая служба\n not found; error codes: [13] 'Certificate not found in the certificate list',

Fasjeit commented 1 year ago

Была ошибка в порядке байт в серийном номере сертификата при кодировании - родной метод ms передаёт в Little-Endian, поэтому делаем Reverse перед записью. Теперь серийник сходится.

https://file.cryptopro.ru/f/igpJo7HGd8qjv21VDKiovVYsM0Yn5S3E/LibCore.Linux.2023.8.3.2.nupkg https://file.cryptopro.ru/f/WU2SfxyHU31DRpXT8qwagxv3nlSLKbEH/LibCore.Windows.2023.8.3.2.nupkg

sk1nned commented 1 year ago

Да, сейчас всё ок.

Fasjeit commented 1 year ago

Отлично, спасибо.

Отставлю открытой, к сл. релизу допишу пример в Readme.