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

Уведомление

Icon
Error

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

Статус: Новичок

Группы: Участники
Зарегистрирован: 05.10.2021(UTC)
Сообщений: 8
Российская Федерация
Откуда: Екатеринбург

Сказал(а) «Спасибо»: 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,351
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 90 раз
Поблагодарили: 318 раз в 300 постах
Насчет подписи в утилите мне сложно сказать, а проверка в плагине и расширениях производится примерно так:
- если подпись присоединенная, то 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)
Сообщений: 8
Российская Федерация
Откуда: Екатеринбург

Сказал(а) «Спасибо»: 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]
Offline Андрей *  
#4 Оставлено : 11 октября 2021 г. 10:14:43(UTC)
Андрей *

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

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

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

Статус: Новичок

Группы: Участники
Зарегистрирован: 05.10.2021(UTC)
Сообщений: 8
Российская Федерация
Откуда: Екатеринбург

Сказал(а) «Спасибо»: 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,351
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 90 раз
Поблагодарили: 318 раз в 300 постах
Добрый день.
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)
Сообщений: 8
Российская Федерация
Откуда: Екатеринбург

Сказал(а) «Спасибо»: 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)
Сообщений: 8
Российская Федерация
Откуда: Екатеринбург

Сказал(а) «Спасибо»: 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,351
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 90 раз
Поблагодарили: 318 раз в 300 постах
Небольшое замечание по смыслу хранилища Личные: для теста Вы берете свой сертификат и он у Вас в 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)
Сообщений: 8
Российская Федерация
Откуда: Екатеринбург

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 1 раз в 1 постах
Хорошее замечание, я об этом не знал. Нужно будет посмотреть в какое хранилище лучше его положить и как правильно к нему обращаться.

Если я правильно понимаю то при store.Open нужно будет указать не существующие в pycades переменные STORE а можно указать свое новое.

То есть получится что-то такое.

Код:
store.Open(pycades.CAPICOM_CURRENT_USER_STORE,'App',pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)


Вроде даже работает.
Offline Андрей *  
#11 Оставлено : 13 октября 2021 г. 9:13:28(UTC)
Андрей *

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

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

Сказал «Спасибо»: 391 раз
Поблагодарили: 1610 раз в 1237 постах
Сделайте добавление сертификата в cms. Забудьте о добавлениях в хранилище, чтобы проверять подпись... Или количество сертификатов настолько мало?
Техническую поддержку оказываем тут
Наша база знаний
Offline Savva  
#12 Оставлено : 13 октября 2021 г. 9:31:45(UTC)
Savva

Статус: Новичок

Группы: Участники
Зарегистрирован: 05.10.2021(UTC)
Сообщений: 8
Российская Федерация
Откуда: Екатеринбург

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 1 раз в 1 постах
Если речь идет об изменении подписи то тут пока сразу переход сделать будет не возможно, из-за того что клиенты уже создают подписи по этим правилам.

Сертификатов в итоге ожидается у нас не более 50. На текущий момент около 15-20.

Насколько плохо, что в хранилище много сертификатов? Как я понимаю проблема кроется именно в поиске подходящего сертификата под подпись. Тогда тут возникает вопрос а можно ли делать указание то что подпись по определенному сертификату по thumbprint? То есть по идее у нас клиент подписывает данные и мы имеем идентификатор клиента и thumbprint сертификата, то есть мы точно знаем по какому сертификату должна проходить проверка.

И другой вопрос, насколько плохо создавать хранилище под клиента? Звучит не очень, но тем не менее, тогда мы зная по какому клиенту идет сообщение будем использовать именно то хранилище в котором будет 1-2 сертификата (по клиенту у нас может быть несколько сертификатов для перехода на свежий когда старый истекает).
Offline Андрей *  
#13 Оставлено : 13 октября 2021 г. 9:38:59(UTC)
Андрей *

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

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

Сказал «Спасибо»: 391 раз
Поблагодарили: 1610 раз в 1237 постах
Автор: Savva Перейти к цитате
Если речь идет об изменении подписи то тут пока сразу переход сделать будет не возможно, из-за того что клиенты уже создают подписи по этим правилам.

Сертификатов в итоге ожидается у нас не более 50. На текущий момент около 15-20.

Насколько плохо, что в хранилище много сертификатов? Как я понимаю проблема кроется именно в поиске подходящего сертификата под подпись. Тогда тут возникает вопрос а можно ли делать указание то что подпись по определенному сертификату по thumbprint? То есть по идее у нас клиент подписывает данные и мы имеем идентификатор клиента и thumbprint сертификата, то есть мы точно знаем по какому сертификату должна проходить проверка.

И другой вопрос, насколько плохо создавать хранилище под клиента? Звучит не очень, но тем не менее, тогда мы зная по какому клиенту идет сообщение будем использовать именно то хранилище в котором будет 1-2 сертификата (по клиенту у нас может быть несколько сертификатов для перехода на свежий когда старый истекает).


Нет, речь про "ручное добавление, слежение за актуальностью сертификатов"...

Для чего эта экономия, не включать сертификат в cms?
А если потребуется проверка во внешней ИС (для суда?), будете искать нужные сертификаты для нужных документов "вручную"?
Чтобы выгрузить все необходимые... Хотя 50 сертификатов, вероятно, не сложно\не займёт много времени... Или все будете выгружать, что есть в хранилище?
Техническую поддержку оказываем тут
Наша база знаний
Offline Savva  
#14 Оставлено : 13 октября 2021 г. 9:45:47(UTC)
Savva

Статус: Новичок

Группы: Участники
Зарегистрирован: 05.10.2021(UTC)
Сообщений: 8
Российская Федерация
Откуда: Екатеринбург

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 1 раз в 1 постах
В нашем случае это не критично, в том плане, что у нас в системе хранится сохраненный документ с подписью + связь с сертификатом. И соответственно если нужно будет достать информацию она у нас уже хранится в подготовленном виде.

Если проблема только в этом тогда ради этого переделывать не стоит.

А вот если вопрос в производительности например то что в хранилище много сертификатов и проверка проходит дольше тогда тут нужно посмотреть и подумать может и стоит что поменять.
Offline two_oceans  
#15 Оставлено : 13 октября 2021 г. 11:43:01(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 90 раз
Поблагодарили: 318 раз в 300 постах
Точно ответить по производительности проверки я не смогу. Для подписания и выбора сертификата обычно используется Личные. Многие программы проверяют еще и подключен ли токен допустим для каждого сертификата, поэтому время становится квадратичной зависимостью от числа сертификатов.

Для выбора адресата в чей адрес отправить используется хранилище Aдресная книга (тут уже не фигурируют токены, так что время линейное). В них число сертификатов влияет на время отображения интерфейсов подписания. Если же указана некая информация о сертификате, то поиск от количества сертификатов замедляется не так сильно чем выбор для подписания.

Однако, несомненно, количество играет роль - если в том же КриптоАрм включить квалифицированный режим и подтянутся все сертификаты аккредитованных УЦ, то открытие хранилища УЦ становится весьма заторможенно.

Вообще, идея такая - в подпись, как правило, включается либо сам сертификат либо информация о подписавшем. Включена ли в Вашем примере, я вручную не смотрел, уже по размеру примерно ясно, что сертификата там нет. На случай, что сертификат очень маленький, я еще перепроверил КриптоАрм и получил ожидаемую ошибку "Нет сертификата".

В случае если сертификат есть в подписи он просто берется из подписи.
В случае если сертификата нет, но есть данные о подписавшем (как минимум Subject сертификата), то производится поиск по хранилищам, есть ли такие сертификаты. Поиск это дополнительный шаг и проверка естественно будет дольше.

Проблема на мой взгляд может быть если сертификат меняется заранее, пока еще действителен другой сертификат этого же клиента, в этом случае при поиске по идее могут найтись оба. Так как законом и приказами регламентирован состав чего мы можем указать в Subject сертификата и так что велик шанс что Subject совпадет у старого и нового сертификата. Допустим, если подписано новым, но нового нет в хранилище при проверке, то попытка проверить скорее всего будет по старому сертификату и выйдет ошибка. Наоборот, если подписано старым, но старого нет - проверится с ошибкой по новому сертификату. Получается если Вы не списываете все документы подписанные старым сертификатом при его окончании, то в перспективе Вам придется хранить в хранилище сертификаты за несколько лет.

Цитата:
У объекта SignedData есть свойства Certificates и Signers но как я понимаю они не изменяемые, то есть просто взять и добавить в них например Signer не получится, как я понимаю именно эти свойства заполняются при проверке подписи.
pycades основан на плагине, плагин на Win работает на COM модели. Свойства с названиями во множественном числе на английском в COM объектах обычно представляют собой коллекции. Сами коллекции почти всегда показывает как для чтения, суть в том что у коллекции есть свойство по умолчанию Item (то есть когда пишем Signers(1) по факту это равносильно вызову функции чтения Signers.Item(1)) и вот свойство Item как раз часто для чтения, так как функция установки свойства Item не определена. Однако есть методы добавления в коллекцию (наследуются от базового класса-коллекции, пустая коллекция никому не интересна, и хотя бы вышестоящему объекту добавление будет разрешено) и элементы возвращенные Item также не обязательно для чтения. Другой вопрос, что в расширении pycades или при сборке плагина в *nix вероятно такие обходы перекрыты.

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

Offline Андрей *  
#16 Оставлено : 13 октября 2021 г. 12:10:25(UTC)
Андрей *

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

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

Сказал «Спасибо»: 391 раз
Поблагодарили: 1610 раз в 1237 постах
Автор: two_oceans Перейти к цитате


Для выбора адресата в чей адрес отправить используется хранилище Aдресная книга (тут уже не фигурируют токены, так что время линейное). В них число сертификатов влияет на время отображения интерфейсов подписания. Если же указана некая информация о сертификате, то поиск от количества сертификатов замедляется не так сильно чем выбор для подписания.

Это ... про какое-то приложение? Outlook?

Каким образом подписание (личным сертификатом) связано с другим хранилищем?
или речь про.. шифрование на свой и сертификаты получателей?

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#17 Оставлено : 13 октября 2021 г. 13:05:06(UTC)
Андрей *

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

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

Сказал «Спасибо»: 391 раз
Поблагодарили: 1610 раз в 1237 постах
Автор: two_oceans Перейти к цитате

Проблема на мой взгляд может быть если сертификат меняется заранее, пока еще действителен другой сертификат этого же клиента, в этом случае при поиске по идее могут найтись оба. Так как законом и приказами регламентирован состав чего мы можем указать в Subject сертификата и так что велик шанс что Subject совпадет у старого и нового сертификата. Допустим, если подписано новым, но нового нет в хранилище при проверке, то попытка проверить скорее всего будет по старому сертификату и выйдет ошибка. Наоборот, если подписано старым, но старого нет - проверится с ошибкой по новому сертификату. Получается если Вы не списываете все документы подписанные старым сертификатом при его окончании, то в перспективе Вам придется хранить в хранилище сертификаты за несколько лет.


Запрашивается у каждой вложенной подписи структура:
CryptMsgGetParam ( .. CMSG_SIGNER_INFO_PARAM ... )

далее поиск сертификата
CertFindCertificateInStore

в pvFindPara передаётся:
pSignerInfo.Issuer;
pSignerInfo.SerialNumber

т.е. "уникальная" комбинация по УЦ\серийному номеру...



Техническую поддержку оказываем тут
Наша база знаний
Offline two_oceans  
#18 Оставлено : 15 октября 2021 г. 6:56:20(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 90 раз
Поблагодарили: 318 раз в 300 постах
Автор: Андрей * Перейти к цитате
Автор: two_oceans Перейти к цитате


Для выбора адресата в чей адрес отправить используется хранилище Aдресная книга (тут уже не фигурируют токены, так что время линейное). В них число сертификатов влияет на время отображения интерфейсов подписания. Если же указана некая информация о сертификате, то поиск от количества сертификатов замедляется не так сильно чем выбор для подписания.
Это ... про какое-то приложение? Outlook?

Каким образом подписание (личным сертификатом) связано с другим хранилищем?
или речь про.. шифрование на свой и сертификаты получателей?
Более корректно наверно так: В этих хранилищах (Личные и Адресная книга) число сертификатов влияет на время отображения интерфейсов выбора сертификатов для подписания (или шифрования, соответственно).
Цитата:
CertFindCertificateInStore
В теории, да. На практике, я пытался в свой программе для СМЭВ, но в итоге сдался. Про эту функцию у меня очень мало добрых слов. Потому что она то ищет, то не ищет и непонятно в чем причина ненахождения.

Даже просто по отпечатку, при этом в перечислении по тому же хэндлу хранилища есть сертификат с таким отпечатком. Я бы понял, если не работало вообще - думал может не так параметры передаю, не в том формате. Но ведь нет, то ищет, то не ищет, в зависимости от запуска одного и того же скомпилированного exe из службы или как обычное приложение из проводника. Проверялось и в хранилище пользователя (которое под службой пустое - тут загадки нет) и в хранилище компьютера (с флагом только чтение - которое видно и пользователю и службе, при перечислении абсолютно одинаковое содержимое, при поиске отличие в результате).

По расширенному использованию ключа тупо на все отвечает "не найдено". Разбор идентичен и у моей структуры в разных кусках памяти и у возвращаемого из сертификатов списка оидов в одном куске памяти. Однако на FreePascal / Delphi немного сложно объединять разнородные куски памяти разного размера в один: просто динамически выделить буфер большего размера и приконкатить содержимое другого кусочка памяти проблемы нет, но там во всех структурах указатели друг на друга, и они поменяются при объедининении. Придется делать арифметические операции с указателями, со смещениями было бы проще. С другой стороны, при выделении основного куска памяти для создания структуры я не в курсе сколько памяти прибавлять на оиды, ведь у них разная длина.

Передавал основную структуру в одном куске с указателями на буферы оидов (допущение что известно максимальное число оидов), буферы оидов каждый в отдельном куске, все кусочки протестированы: IsBadReadPtr выдает false. Однако результат "не найдено".

Видимо надо обязательно уместить в одном куске. Как по мне, странно возвращать "не найдено", хотя речь про организацию памяти. "Как есть" вернувшийся список тоже не подходит, мне надо из 6 оидов сертификата искать только по двум (аутентификация клиента и СМЭВ ЭП-ОВ).

В итоге, гораздо надежнее перечислить все сертификаты в хранилище CertEnumCertificatesInStore, получить для каждого нужную характеристику и самому сравнить с искомым, чем разбираться с описаниями форматов параметров на Си++ и потом полагаться на непонятно какую работу CertFindCertificateInStore.
Цитата:
- Запрашивается у каждой вложенной подписи структура: CryptMsgGetParam ( .. CMSG_SIGNER_INFO_PARAM ... )
- далее поиск сертификата CertFindCertificateInStore, в pvFindPara передаётся "уникальная" комбинация по УЦ\серийному номеру...
Ну нашли сертификат. Дальше то собственно что? ТС как раз не разобрался как подтолкнуть конкретный сертификат в функцию проверки VerifyCades либо в SignedData, потому и указывает Store целиком.

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

Offline Андрей *  
#19 Оставлено : 15 октября 2021 г. 9:46:44(UTC)
Андрей *

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

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

Сказал «Спасибо»: 391 раз
Поблагодарили: 1610 раз в 1237 постах
Автор: two_oceans Перейти к цитате
Ну нашли сертификат. Дальше то собственно что? ТС как раз не разобрался как подтолкнуть конкретный сертификат в функцию проверки VerifyCades либо в SignedData, потому и указывает Store целиком.


Нашли по серийному номеру, а не Subject...

Вот основная мысль и разница, это к предложению:

Цитата:

Так как законом и приказами регламентирован состав чего мы можем указать в Subject сертификата и так что велик шанс что Subject совпадет у старого и нового сертификата.

Техническую поддержку оказываем тут
Наша база знаний
Offline two_oceans  
#20 Оставлено : 15 октября 2021 г. 10:29:35(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 90 раз
Поблагодарили: 318 раз в 300 постах
Цитата:
Нашли по серийному номеру, а не Subject
Мысль замечательная, для актуального сертификата. Однако посмотрите вот расшифровка подписи приведенной в сообщении выше и там я вижу только E= CN= от некой RDN записи дважды, и рядом есть INTEGER 1. Это точно Issuer и SerialNumber конечного сертификата? Если нет, то и идея найти по серийному номеру не подойдет. Потому как номер 1 обычно у сертификата самого УЦ (если УЦ не выдает длинные номера со случайной частью по новым требованиям закона), меня терзают смутные сомнения.

Отредактировано пользователем 15 октября 2021 г. 10:34:39(UTC)  | Причина: Не указана

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