Статус: Участник
Группы: Участники
Зарегистрирован: 05.10.2021(UTC) Сообщений: 12 Откуда: Екатеринбург Сказал(а) «Спасибо»: 1 раз Поблагодарили: 1 раз в 1 постах
|
Как проверить подпись если она была сформирована следующим образом. Код:cryptcp -sign ./message ./message.sgn -detached -nocert -nochain -thumbprint '7a1831578b77f66d9bde6b4ea3a9763fa1aa733d'
Сообщение примера такого Код:
echo -n '12345' > message
Проверку пробовал делать разными способами Код:
import pycades
signed_data = pycades.SignedData()
signed_data.Content = '12345' # пробовал сюда и в base64 передавать данные
signed_data.ContentEncoding = pycades.CADESCOM_ENCODE_BASE64
signed_data.VerifyCades(sign, pycades.CADESCOM_CADES_BES, True)
Получаю ошибку Код:Exception: Invalid Signature. (0x80090006)
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 394 раз в 366 постах
|
Насчет подписи в утилите мне сложно сказать, а проверка в плагине и расширениях производится примерно так: - если подпись присоединенная, то Content и ContentEncoding не заполняются, сразу вызывается функция проверки. - если подпись отсоединенная (detached), в signed_data.Content передаете подписываемый текст (желательно в кодировке Base64, тогда в указываете ContentEncoding = pycades.CADESCOM_ENCODE_BASE64), ContentEncoding влияет только на контент, но не на содержимое подписи Далее в функцию проверки передается содержимое подписи (возможно, в виде HEX или BASE64 смотрите в справке по функциям) , так как при подписании плагином, насколько помню, возвращается HEX
При проверке есть несколько функций, возможно VerifyCades или pycades.CADESCOM_CADES_BES не тот вариант, попробуйте и другие Verify*.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 05.10.2021(UTC) Сообщений: 12 Откуда: Екатеринбург Сказал(а) «Спасибо»: 1 раз Поблагодарили: 1 раз в 1 постах
|
Я пробовал разные варианты. Если говорить именно о примере то там подпись detached соответственно поля Content и ContentEncoding я заполняю. Пробовал как в кадировке BASE64 там и без нее. Пока успешного результата достигнуть не получилось. Понять бы что я делаю не так. Попробовал пойти с другой стороны, пробую подписать сообщение а потом через плагин проверить его, пока тоже безуспешно. Код:
store = pycades.Store()
store.Open(pycades.CAPICOM_CURRENT_USER_STORE, pycades.CAPICOM_MY_STORE, pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
signer = pycades.Signer()
signer.Certificate = store.Certificates.Item(1)
signed_data = pycades.SignedData()
signed_data.Content = '1234567890'
signed_data.SignCades(signer, pycades.CADESCOM_CADES_BES, True, pycades.CADESCOM_ENCODE_BASE64)
Проверку пробую делать следующим образом. Код:
cryptcp -vsignf ./mess -nochain -thumbprint '493FD8980266C6325BCC16F3C5A934B470879E37' -dir ./
cryptcp -vsignf ./mess -nochain -cadesbes -thumbprint '493FD8980266C6325BCC16F3C5A934B470879E37' -dir ./
Сообщение подписывать и проверять пробовал и в base64 и просто текст. Результат всегда един Код:
../../../../CSPbuild/CSP/samples/CPCrypt/DSign.cpp:830: 0x80090006
Error: Signature.
../../../../CSPbuild/CSP/samples/CPCrypt/DSign.cpp:945: 0x200001F9
[ErrorCode: 0x200001f9]
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,691 Сказал «Спасибо»: 500 раз Поблагодарили: 2045 раз в 1586 постах
|
ContentEncoding необходимо задавать до присвоения Content. Укажите, что закодировано в base64, передавайте base64. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 05.10.2021(UTC) Сообщений: 12 Откуда: Екатеринбург Сказал(а) «Спасибо»: 1 раз Поблагодарили: 1 раз в 1 постах
|
К сожалению и там не получилось. Описал подробно свои действия. Может легче будет найти ошибку. Генерирую и устанавливаю ключи Код:
# Генерация контейнера
csptestf -keyset -newkeyset -makecert -cont '\\.\HDIMAGE\test' -keytype exchange -exportable
# Устанавливаю самоподписанного ключа
certmgr -inst -store uMy -cont '\\.\HDIMAGE\'
# Устанавливаю самоподписанного ключа в рута как доверительный чтобы пока не парится с проверкой цепочки
certmgr -inst -store uRoot -cont '\\.\HDIMAGE\'
Подписание сообщения Код:
# Сообщение простое формируем (сообщение клиент подписывет именно такое)
echo -n '1234567890' > message
# Формируем подпись
cryptcp -sign ./message ./message.sgn -detached -nocert -nochain -thumbprint '493fd8980266c6325bcc16f3c5a934b470879e37'
Подпись в итоге такая полуилась Код:
MIAGCSqGSIb3DQEHAqCAMIACAQExDDAKBggqhQMHAQECAjCABgkqhkiG9w0BBwEA
ADGCAYYwggGCAgEBMDYwMTEgMB4GCSqGSIb3DQEJARYRdGVzdEBjcnlwdG9wcm8u
cnUxDTALBgNVBAMMBHRlc3QCAQEwCgYIKoUDBwEBAgKggeowGAYJKoZIhvcNAQkD
MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjExMDEyMDIzMDEzWjAvBgkq
hkiG9w0BCQQxIgQgx8zjMcUhk+eNSC4TkmJ78Yof8/2cJstEK+gflZLedGwwfwYL
KoZIhvcNAQkQAi8xcDBuMGwwajAKBggqhQMHAQECAgQg0EyejC9BkXjfxxQao7eK
oDHvzjcriz4yerzBuPY+YaIwOjA1pDMwMTEgMB4GCSqGSIb3DQEJARYRdGVzdEBj
cnlwdG9wcm8ucnUxDTALBgNVBAMMBHRlc3QCAQEwCgYIKoUDBwEBAQEEQEz+lZhn
ZlB17Mw2MpJf3JczJIDsoCIByzsHmv1eQVanBSZlrTYO6BaCJ0kd4793JLAW4Gh0
n75RxqAIblK54qkAAAAAAAA=
Код:
import pycades
def verify(content, signature, encode, sign_type, is_detached):
# На всякий случай даже откроем стор, хотя у меня он в коде всегда открывается
store = pycades.Store()
store.Open(pycades.CAPICOM_CURRENT_USER_STORE, pycades.CAPICOM_MY_STORE, pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
signed_data = pycades.SignedData()
signed_data.ContentEncoding = encode
signed_data.Content = content
signed_data.VerifyCades(signature, sign_type, is_detached)
return True
import base64
with open('./message', 'rb') as file:
message = file.read()
with open('./message.sgn', 'rb') as file:
message_sgn = file.read()
for encode_ in (pycades.CADESCOM_ENCODE_ANY, pycades.CADESCOM_ENCODE_BASE64, pycades.CADESCOM_ENCODE_BINARY):
for sign_type_ in (pycades.CADESCOM_CADES_BES, pycades.CADESCOM_CADES_DEFAULT, pycades.CADESCOM_CADES_T, pycades.CADESCOM_CADES_X_LONG_TYPE_1, pycades.CADESCOM_PKCS7_TYPE):
for is_detached_ in (True, False):
try:
is_verify = verify(message.decode(), message_sgn.decode(), encode_, sign_type_, is_detached_)
except Exception:
is_verify = False
print(f'{encode_=} {sign_type_=} {is_detached_=} {is_verify=}')
Все проверки верификации показали отрицательный результат Invalid Signature. (0x80090006) (В некоторых случая такой The parameter is incorrect. (0x80070057))
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 394 раз в 366 постах
|
Добрый день. 1) Вопрос: чем вызвано использование -nocert -nochain ? При проверке через КриптоАРМ выдает ошибку "Нет сертификата". У Вас получается в подписи message.sgn нет сертификата, поэтому для успешного прохождения проверки нужно задать сертификат отдельно. Математически подпись проверить можно, указав открытый ключ или сертификат, но для проверки в комплексе нужен именно сертификат. Примеры рассчитаны на случай когда сертификат включен в подпись, предположу, что отдельно сертификат указывается таким же способом как при подписании (создается Signer, в его свойстве указываем сертификат, потом добавляем Signer в signed_data). 2) Не совсем понятно насчет decode() - что там декодируется? Перебор вариантов наверно неполный.
Если в файле Base64, то нет разницы прочитать его двоично или как текст (различия нивелируются при переводе из Base64). Если в файле двоичные данные, то прочитать нужно двоично. Потом можно попробовать закодировать в Base64. Если не хотите проверять что там в файле или пока калибруете программу - можно прочитать двоично и вызвать проверку, потом закодировать в Base64 и снова вызвать проверку. Также можно еще и заголовки-ограничители добавить. В двоичном виде первый байт чаще всего 0x30 или 0x31 (то есть ASN.1 SEQUENCE или SET тег), при кодировании в Base64 0x30-0x33 дают первый символ М - легко проверить на эти значения.
3) В случае is_detached = False не обязательно задавать Content и ContentEncoding (для присоединенной подписи исходный файл включен в подпись). Отредактировано пользователем 12 октября 2021 г. 8:01:58(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 05.10.2021(UTC) Сообщений: 12 Откуда: Екатеринбург Сказал(а) «Спасибо»: 1 раз Поблагодарили: 1 раз в 1 постах
|
Цитата:Вопрос: чем вызвано использование -nocert -nochain ? Уже налажено взаимодействие с клиентами именно по такому принципу, менять его очень не желательно. Так что работаем с тем что имеем. Цитата:Примеры рассчитаны на случай когда сертификат включен в подпись, предположу, что отдельно сертификат указывается таким же способом как при подписании (создается Signer, в его свойстве указываем сертификат, потом добавляем Signer в signed_data). В случае проверки на своей стороне мы имеем сертификат и проверяем именно по нему, и тут проблем как бы нет. Но как это указать через pycades пока понять не получается. У объекта SignedData есть свойства Certificates и Signers но как я понимаю они не изменяемые, то есть просто взять и добавить в них например Signer не получится, как я понимаю именно эти свойства заполняются при проверке подписи. Но обратил внимание, что есть метод AdditionalStore, кажется что это то что нужно, типа добавь store в котором есть сертификат которым можно проверить сообщение, но пока это не сработало, опять же может я что-то делаю не так. Цитата:Не совсем понятно насчет decode() - что там декодируется? Тут при чтении из файла получаем байты в случае когда используем в open указатель 'rb' конечно можно было использовать просто 'r' но это не принципиально. Свойство Content принимает только строковое значение. Цитата:Перебор вариантов наверно неполный. Очень может быть, но я использовал официальную документацию (https://docs.cryptopro.ru/cades/pycades) и те данные которые там есть. Конечно всегда есть шанс что-то упустить. Цитата:Если не хотите проверять что там в файле или пока калибруете программу - можно прочитать двоично и вызвать проверку, потом закодировать в Base64 и снова вызвать проверку. Собственно это я и сделал, я делаю проверку и для простого сообщения и на всякий случай его преобразую в base64 и тоже проверяю. К сожалению код выше только для обычного сообщения, у себя я сделал и для base64, не стал просто изменять сообщение) Цитата:В случае is_detached = False не обязательно задавать Content и ContentEncoding (для присоединенной подписи исходный файл включен в подпись). да это вроде пока понятно, но это не столь актуально тк у нас is_detached = True Но спасибо за информацию.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 05.10.2021(UTC) Сообщений: 12 Откуда: Екатеринбург Сказал(а) «Спасибо»: 1 раз Поблагодарили: 1 раз в 1 постах
|
Решил проблему. Всем спасибо. Все таки правильный подход был именно с использованием AdditionalStore Теперь как все выглядет может кому пригодится сообщение Код:echo -n '1234567890' > message
подписание Код:cryptcp -sign ./message ./message.sgn -detached -nocert -nochain -thumbprint '7a1831578b77f66d9bde6b4ea3a9763fa1aa733d'
проверка Код:
import base64
message = '1234567890'
message_base64 = base64.b64encode(message.encode()).decode()
signature = '''
MIAGCSqGSIb3DQEHAqCAMIACAQExDDAKBggqhQMHAQECAjCABgkqhkiG9w0BBwEA
ADGCAYYwggGCAgEBMDYwMTEgMB4GCSqGSIb3DQEJARYRdGVzdEBjcnlwdG9wcm8u
cnUxDTALBgNVBAMMBHRlc3QCAQEwCgYIKoUDBwEBAgKggeowGAYJKoZIhvcNAQkD
MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjExMDEyMDIzMDEzWjAvBgkq
hkiG9w0BCQQxIgQgx8zjMcUhk+eNSC4TkmJ78Yof8/2cJstEK+gflZLedGwwfwYL
KoZIhvcNAQkQAi8xcDBuMGwwajAKBggqhQMHAQECAgQg0EyejC9BkXjfxxQao7eK
oDHvzjcriz4yerzBuPY+YaIwOjA1pDMwMTEgMB4GCSqGSIb3DQEJARYRdGVzdEBj
cnlwdG9wcm8ucnUxDTALBgNVBAMMBHRlc3QCAQEwCgYIKoUDBwEBAQEEQEz+lZhn
ZlB17Mw2MpJf3JczJIDsoCIByzsHmv1eQVanBSZlrTYO6BaCJ0kd4793JLAW4Gh0
n75RxqAIblK54qkAAAAAAAA='''
store = pycades.Store()
store.Open(pycades.CAPICOM_CURRENT_USER_STORE, pycades.CAPICOM_MY_STORE, pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
signed_data = pycades.SignedData()
signed_data.AdditionalStore(store)
signed_data.ContentEncoding = pycades.CADESCOM_ENCODE_BINARY
signed_data.Content = message_base64
# CADESCOM_PKCS7_TYPE тоже проходит
signed_data.VerifyCades(signature, pycades.CADESCOM_CADES_BES, True)
Отредактировано пользователем 13 октября 2021 г. 8:01:32(UTC)
| Причина: Не указана
|
1 пользователь поблагодарил Savva за этот пост.
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 394 раз в 366 постах
|
Небольшое замечание по смыслу хранилища Личные: для теста Вы берете свой сертификат и он у Вас в MY (Личные) - для подписания на этом же компьютере. Однако сертификаты всех клиентов (для которых у Вас нет контейнера) тащить в Личные смысла не имеет да и существенно замедляет все диалоги подписания (время показа диалога примерно пропорционально квадрату количества сертификатов в Личные, уже на 15 сертификатах терпение начинает лопаться). Поэтому сертификаты клиентов нужно будет сложить в какое-то другое хранилище, соответственно его и будете открывать при проверке.
|
1 пользователь поблагодарил two_oceans за этот пост.
|
Savva оставлено 13.10.2021(UTC)
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 05.10.2021(UTC) Сообщений: 12 Откуда: Екатеринбург Сказал(а) «Спасибо»: 1 раз Поблагодарили: 1 раз в 1 постах
|
Хорошее замечание, я об этом не знал. Нужно будет посмотреть в какое хранилище лучше его положить и как правильно к нему обращаться. Если я правильно понимаю то при store.Open нужно будет указать не существующие в pycades переменные STORE а можно указать свое новое. То есть получится что-то такое. Код:store.Open(pycades.CAPICOM_CURRENT_USER_STORE,'App',pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
Вроде даже работает.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close