Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline Savva  
#1 Оставлено : 5 октября 2021 г. 6:51:16(UTC)
Savva

Статус: Участник

Группы: Участники
Зарегистрирован: 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)


Offline two_oceans  
#2 Оставлено : 7 октября 2021 г. 8:33:32(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Насчет подписи в утилите мне сложно сказать, а проверка в плагине и расширениях производится примерно так:
- если подпись присоединенная, то Content и ContentEncoding не заполняются, сразу вызывается функция проверки.
- если подпись отсоединенная (detached), в signed_data.Content передаете подписываемый текст (желательно в кодировке Base64, тогда в указываете ContentEncoding = pycades.CADESCOM_ENCODE_BASE64), ContentEncoding влияет только на контент, но не на содержимое подписи
Далее в функцию проверки передается содержимое подписи (возможно, в виде HEX или BASE64 смотрите в справке по функциям) , так как при подписании плагином, насколько помню, возвращается HEX

При проверке есть несколько функций, возможно VerifyCades или pycades.CADESCOM_CADES_BES не тот вариант, попробуйте и другие Verify*.
Offline Savva  
#3 Оставлено : 11 октября 2021 г. 6:40:30(UTC)
Savva

Статус: Участник

Группы: Участники
Зарегистрирован: 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]
Online Андрей *  
#4 Оставлено : 11 октября 2021 г. 10:14:43(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
ContentEncoding необходимо задавать до присвоения Content.
Укажите, что закодировано в base64, передавайте base64.
Техническую поддержку оказываем тут
Наша база знаний
Offline Savva  
#5 Оставлено : 12 октября 2021 г. 5:40:01(UTC)
Savva

Статус: Участник

Группы: Участники
Зарегистрирован: 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))
Offline two_oceans  
#6 Оставлено : 12 октября 2021 г. 7:55:08(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Добрый день.
1) Вопрос: чем вызвано использование -nocert -nochain ?
При проверке через КриптоАРМ выдает ошибку "Нет сертификата".
У Вас получается в подписи message.sgn нет сертификата, поэтому для успешного прохождения проверки нужно задать сертификат отдельно.
Математически подпись проверить можно, указав открытый ключ или сертификат, но для проверки в комплексе нужен именно сертификат.
Примеры рассчитаны на случай когда сертификат включен в подпись, предположу, что отдельно сертификат указывается таким же способом как при подписании (создается Signer, в его свойстве указываем сертификат, потом добавляем Signer в signed_data).

2) Не совсем понятно насчет decode() - что там декодируется?
Перебор вариантов наверно неполный.


3) В случае is_detached = False не обязательно задавать Content и ContentEncoding (для присоединенной подписи исходный файл включен в подпись).

Отредактировано пользователем 12 октября 2021 г. 8:01:58(UTC)  | Причина: Не указана

Offline Savva  
#7 Оставлено : 13 октября 2021 г. 7:52:56(UTC)
Savva

Статус: Участник

Группы: Участники
Зарегистрирован: 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
Но спасибо за информацию.
Offline Savva  
#8 Оставлено : 13 октября 2021 г. 8:00:45(UTC)
Savva

Статус: Участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

thanks 1 пользователь поблагодарил Savva за этот пост.
two_oceans оставлено 13.10.2021(UTC)
Offline two_oceans  
#9 Оставлено : 13 октября 2021 г. 8:27:11(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Небольшое замечание по смыслу хранилища Личные: для теста Вы берете свой сертификат и он у Вас в MY (Личные) - для подписания на этом же компьютере. Однако сертификаты всех клиентов (для которых у Вас нет контейнера) тащить в Личные смысла не имеет да и существенно замедляет все диалоги подписания (время показа диалога примерно пропорционально квадрату количества сертификатов в Личные, уже на 15 сертификатах терпение начинает лопаться). Поэтому сертификаты клиентов нужно будет сложить в какое-то другое хранилище, соответственно его и будете открывать при проверке.
thanks 1 пользователь поблагодарил two_oceans за этот пост.
Savva оставлено 13.10.2021(UTC)
Offline Savva  
#10 Оставлено : 13 октября 2021 г. 8:45:42(UTC)
Savva

Статус: Участник

Группы: Участники
Зарегистрирован: 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)


Вроде даже работает.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.