| ||||
| ||||
Как получить? -sign выдаёт на выходе данные с прикреплённой подписью и уже в base64. Мне надо получить на выходе только подпись для входных данных и желательно сразу в hex-формате. Впрочем, последнее непринципиально. | ||||
Ответы: | ||||
| ||||
cryptcp -signf | ||||
| ||||
Так на выходе мы имеем pkcs#7 структуру. А мне надо только те 64 байта, что мы имеем после отработки ГОСТ Р 34.10-94/2001. Вроде как получается, что это последние 64 байта этой структуры. Я прав? | ||||
| ||||
может проще вызвать несколько функций CryptoApi? | ||||
| ||||
maxdm, внимательно читаем название темы, ключевые слова - unix (откуда там окошечный cryptoapi?) и cryptcp. К тому же, использование любой библиотеки приведёт к необходимости писать приложение на с-ях. А у меня скриптовый язык и хочется обойтись уже имеющимся приложением by Crypto-Pro. | ||||
| ||||
КриптоПро CAPIlite никто не отменял. По-моему, проще написать экран кода на С, чем извращаться с разбором ASN1. | ||||
| ||||
Кстати, если хочется чистую подпись (64 байта), то это умеет csptest (который входит в CSP 3.0 на любой платформе): csptest -keyset -sign | ||||
| ||||
Василий, а как я ему укажу, с помощью какого ключа подписывать? И что подписывать? И куда выдавать полученные 64 байта? | ||||
| ||||
maxdm, а, вы про capilite. Забыл я давно этот C :) Да и судя по тем сложностям, что испытывают люди, задающие в этом форуме вопросы для платформы windows как-то не верится в один экран кода (24 строки). Разве что в capilite есть функция, работать с которой можно так: $sign = capilite->sign($cert_name,$data); | ||||
| ||||
Запустите csptest -keyset -help и он сам всё расскажет. Пример. Надо подписать файл doc.txt с помощью секретного ключа из контейнера cont1 и сохранить подпись в файл doc.txt.sig: csptest -keyset -sign GOST -in doc.txt -out doc.txt.sig -container cont1 | ||||
| ||||
То, что надо, спасибо! Ещё бы понять, как у меня контейнер называется. При использовании cryptcp у меня для выбора ключевой пары используется -dn <e-mail в в выданном сертфикате>. | ||||
| ||||
csptest -keyset -verifycontext -enum_containers Он перечислит все доступные контейнеры. | ||||
| ||||
Походу, оно. Спасибо! | ||||
| ||||
Василий, а можно привети пример проверки ЭЦП для файла данных и файла с подписью. Как указывать сертификат для проверки? | ||||
| ||||
Я не совсем понял. Подпись в чистом виде (64 байта) делается и проверяется без всяких сертификатов, низкоуровневыми функциями, которые работают непосредственно с ключами. Csptest - это просто пример того, как это программируется. Раз уж Вы хотите работать на таком низком уровне - то Ваша задача, как определять, кто автор подписи и как её проверить (в т.ч. откуда взять открытый ключ для проверки). Открытый ключ можно взять из сертификата (например, если есть сертификат в файле). Но при этом не будет выполнена проверка самого сертификата - то, что он действителен по дате, то, что он выдан доверенным Центром сертификации, то, что сертификат не отозван. В приведённом мной ранее примере (файл данных - doc.txt, файл с подписью - doc.txt.sig) проверить подпись можно так (если есть сертификат подписавшего в файле cert.cer): csptest -keyset -verify GOST -in doc.txt -signature doc.txt.sig -certificate cert.cer В принципе, гораздо проще использовать более высокоуровневые функции (которые работают с сертификатами). В файл с подписью, кроме собственно подписи, включаются сведения о сертификате подписавшего (а также, опционально, и сам сертификат подписавшего). И при проверке подписи проверяется не только сама подпись, но и сертификат подписавшего. Готовое приложение для этого - cryptcp. | ||||
| ||||
Ну, с вопросом доверия к сертификату - это уже моя проблема :) Сам сертификат (с помощью которого проверить надо) лежит в addressbook.sto (туда был загружен через /usr/CPROcsp/bin/storeman), когда я использую crytpcp, то я его указываю опять-таки через -dn. Можно его подобным образом (как в вашем примере выше) указать для csptest? | ||||
| ||||
нет Так уж написан пример, что он читает из файла | ||||
| ||||
Э-эх, а так хочется функциональности вида openssl (пусть даже бы она и включалась ключиком -expertmode у cryptcp). P.S. Куда уж высокоуровневей, чем cryptcp? | ||||
| ||||
Собственно, cryptcp я и предлагал с самого начала. Есть опции: сделать detached подпись (-signf) и проверить её (-vsignf). Просто Вы просили рассказать, есть ли средства по работе с чистой подписью (64 байта). Вот я и рассказал. Но к cryptcp это не имеет отношения. | ||||
| ||||
Василий, так они (-signf/vsignf) на выходе формируют/требуют подпись в формате PKCS#7. Мне же снаружи приходят "чистые" 64 байта и отправлять я должен тоже 64 байта. Вот и выросла проблема :( | ||||
| ||||
Я просто хотел подчеркнуть в предыдущем ответе, что cryptcp не предназначается для работы с чистой подписью. Что касается csptest - то это пример, реализующий не всю возможную функциональность. Если будет Ваш код (вызовы функций CryptoAPI) по формированию и/или проверке чистой подписи - то Вы можете сделать как удобнее (в т.ч. поиск сертификата в хранилище). Отличие от чтения сертификата из файла небольшое. Если Вы будете вызывать непосредственно csptest - то проще всего раскидать сертификаты из хранилища "Другие пользователи" по файлам (с удобными для поиска названиями файлов). | ||||
| ||||
С проверкой через csptest возника проблема. Программе неизвестен ключ (параметр) -certificate. Т.е. csptest -keyset -verify GOST -in /tmp/doc.txt -signature /tmp/doc.txt.sig -import partner.cer не проходит. Не помогает замена на -import или на -pubkey. | ||||
| ||||
csptest -keyset -verify GOST -in /tmp/doc.txt -signature /tmp/doc.txt.sig -certificate partner.cer ошибся в предыдущем посте в параметре | ||||
| ||||
На Win работает. Можно узнать сообщение об ошибке, что пишет csptest, а также кодировку файла сертификата - DER, Base64 с заголовками, Base64 без заголовков? | ||||
| ||||
$ csptest -keyset -verify GOST -in /tmp/doc.txt -signature /tmp/doc.txt.sig -certificate partner.cer CSP (Type:71) v3.0.3290 KC1 Release OS:Linux CPU:IA32 FastCode:READY,ENABLED. CSP (Type:75) v3.0.3290 KC1 Release OS:Linux CPU:IA32 FastCode:READY,ENABLED. /usr/CPROcsp/bin/csptest: unrecognized option `-certificate' Total: [ErrorCode: 0x00000001] | ||||
| ||||
$ csptest -keyset -verify GOST -in /tmp/doc.txt -signature /tmp/doc.txt.sig -import partner.cer CSP (Type:71) v3.0.3290 KC1 Release OS:Linux CPU:IA32 FastCode:READY,ENABLED. CSP (Type:75) v3.0.3290 KC1 Release OS:Linux CPU:IA32 FastCode:READY,ENABLED. CryptAcquireContext succeeded.HCRYPTPROV: 134661096 CryptGetProvParam succeeded. Provider name: Crypto-Pro GOST R 34.10-2001 KC1 CSP An error occurred in running the program. ../../../../mybuild/CSP/samples/csptest/ctkey.c:959:Error occurred when exporting key. Error number 80090005 (-2146893819). Плохие данные. Total: [ErrorCode: 0x80090005] | ||||
| ||||
$ csptest -keyset -verify GOST -in /tmp/doc.txt -signature /tmp/doc.txt.sig -pubkey partner.cer CSP (Type:71) v3.0.3290 KC1 Release OS:Linux CPU:IA32 FastCode:READY,ENABLED. CSP (Type:75) v3.0.3290 KC1 Release OS:Linux CPU:IA32 FastCode:READY,ENABLED. CryptAcquireContext succeeded.HCRYPTPROV: 134661096 CryptGetProvParam succeeded. Provider name: Crypto-Pro GOST R 34.10-2001 KC1 CSP Hash object created with alg: GOST 801E The data buffer has been hashed. An error occurred in running the program. ../../../../mybuild/CSP/samples/csptest/ctkey.c:1196:No Imported Key Error number 0 (0). Total: [ErrorCode: 0x00000001] | ||||
| ||||
Формат файла partner.cer - DER. | ||||
| ||||
Ясно, спасибо. Значит, в нашем CSPtest под UNIX это просто не доделано. Тогда вариант такой: csptest -keyset -verify GOST -in /tmp/doc.txt -signature /tmp/doc.txt.sig -import имя_файла где имя_файла - файл с блобом открытого ключа (который был получен на машине, где делается подпись командой csptest -keyset -container имя_контейнера -keytype *** -provtype *** -export имя_файла ) | ||||
| ||||
Так у меня от противоположной стороны имеется только partner.cer. Ещё он же был импортирован в addressbook.sto на машине. Как-нибудь вывернуться можно? Не думаю, что мне blob смогут предоставить. P.S. Может проще на e-mail перейти? Мой адрес у Анатолия есть, сейчас отпишу ему :) | ||||
| ||||
Анатолий в отпуске :) А по поводу опции -certificate - она должна быть в другой утилите, csptestf (входит в состав пакета capilite). | ||||
| ||||
Василий, спасибо! Работает. | ||||