Repository navigation
SignService 1.3.0: соподписание по содержимому документа и полная проверка ГОСТ-подписей КриптоПро - #5
Merged
Conversation
… КриптоПро Перенесено из ветки cursor/cosign-discovery-gost-cb6f форка sozertsatel/SignService и доработано. Соподписание: - подписи документа ищутся в его папке по содержимому, а не по имени («договор-.pdf .sig» для «договор.pdf»); у файла — выбор «Добавить к найденной подписи» или «Создать новую», строка плана («будет добавлена подпись №9 к …»), подтверждение перед заменой файла и исключением подписантов, итог «Подписан: 9 (8 + ваша)»; - в отличие от форка: подписанты сопоставляются той же криптопроверкой, что и при объединении; «документ.sig» предлагается всегда (голый PKCS#7 и подписи с неизвестным хешем не теряются); поиск идёт в фоне, документ читается и хешируется один раз (добавление 10 документов по 10 МБ с подписями: было 7,6 с в потоке интерфейса, стало 17 мс); перетащенные подписи — приложенные, результат пишется рядом с документом, чужие файлы не перезаписываются; выбор блокируется на время подписания; после подписания варианты обновляются для следующего соподписания; резервная копия — только при замене без объединения или исключении подписантов; - режим «подписывать копию со штампом» не трогает найденные подписи оригинала (в форке групповая подпись оригинала перезаписывалась, а её подписанты исключались); - «Объединить .sig» называет результат «документ.sig» и не затирает существующий файл. Проверка ГОСТ: - КриптоПро и CryptoAPI (в том числе SignService на Windows) пишут в signatureAlgorithm OID ключа с параметрами, BouncyCastle такие подписи отклонял — в 1.2.0 они получали «не определено». Теперь проверяется копия без этих параметров с полными проверками BouncyCastle; обходной путь форка, принимавший подпись без messageDigest для любого документа, не перенесён; - подпись с подписанными атрибутами без messageDigest не соответствует документу (раньше проверка документа показывала «соответствует»). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BtHSRXSuM8qTBTUBe29624
В коде PR #2 объединение сверяло только messageDigest, МЧД проверялась без доверия и отзыва, а сертификат оставшегося подписанта терялся вместе с исключённым входом. Тесты закрепляют, что в текущей версии: - изменённое значение подписи при верном messageDigest исключается в «Объединить .sig», «Собрать контейнер» и при соподписании; - сертификат, который был только в контейнере исключённого подписанта, сохраняется, и оставшаяся подпись проходит проверку; - МЧД без номера или даты выдачи, с просроченным или недоверенным самоподписанным сертификатом руководителя не проходит как «Ok». Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BtHSRXSuM8qTBTUBe29624
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BtHSRXSuM8qTBTUBe29624
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Зачем
signatureAlgorithmOID ГОСТ-ключа с параметрами, а BouncyCastle такие подписи отклоняет. Поэтому реальные ГОСТ-подписи получали «не определено» и при объединении помечались как непроверенные.cursor/cosign-discovery-gost-cb6f) добавляет поиск подписей по содержимому документа. Идея нужная, но в исходном виде в ветке были проблемы, найденные при ревью:messageDigestпринималась для любого документа;Что сделано
Проверка ГОСТ
signatureAlgorithm, OID ключа заменён на OID алгоритма подписи. Это поле не входит в подписанные данные. Все проверки BouncyCastle (messageDigest, content-type, значение подписи) сохраняются, исходные байты подписантов при объединении не меняются.messageDigestдокумент считается несоответствующим.Соподписание по содержимому (по ветке форка, с доработками)
test-latestи путь/opt/cursorв тестах не перенесены.Тесты по ревью форка debug23win
messageDigestисключается: в «Объединить .sig», в «Собрать контейнер» и при соподписании.Проверка
dotnet build: 0 предупреждений.dotnet run --project tests/SignService.Tests -c Release— ALL TESTS PASSED, включая хранилище сертификатов и смоук интерфейса (строка соподписания).🤖 Generated with Claude Code
https://claude.ai/code/session_01BtHSRXSuM8qTBTUBe29624
Generated by Claude Code