25.07.2007 12:49:58Получение detached подписи на unix-платформе с помощью cryptcp Ответов: 31
Александр
Как получить? -sign выдаёт на выходе данные с прикреплённой подписью и уже в base64. Мне надо получить на выходе только подпись для входных данных и желательно сразу в hex-формате. Впрочем, последнее непринципиально.
 
Ответы:
25.07.2007 16:50:25Василий
cryptcp -signf
25.07.2007 19:57:05Александр
Так на выходе мы имеем pkcs#7 структуру. А мне надо только те 64 байта, что мы имеем после отработки ГОСТ Р 34.10-94/2001. Вроде как получается, что это последние 64 байта этой структуры. Я прав?
25.07.2007 22:36:30maxdm
может проще вызвать несколько функций CryptoApi?
25.07.2007 22:43:52Александр
maxdm, внимательно читаем название темы, ключевые слова - unix (откуда там окошечный cryptoapi?) и cryptcp. К тому же, использование любой библиотеки приведёт к необходимости писать приложение на с-ях. А у меня скриптовый язык и хочется обойтись уже имеющимся приложением by Crypto-Pro.
26.07.2007 1:50:38maxdm
КриптоПро CAPIlite никто не отменял.
По-моему, проще написать экран кода на С, чем извращаться с разбором ASN1.
26.07.2007 10:18:35Василий
Кстати, если хочется чистую подпись (64 байта), то это умеет csptest (который входит в CSP 3.0 на любой платформе):
csptest -keyset -sign
26.07.2007 11:00:55Александр
Василий, а как я ему укажу, с помощью какого ключа подписывать? И что подписывать? И куда выдавать полученные 64 байта?
26.07.2007 11:07:13Александр
maxdm, а, вы про capilite. Забыл я давно этот C :) Да и судя по тем сложностям, что испытывают люди, задающие в этом форуме вопросы для платформы windows как-то не верится в один экран кода (24 строки). Разве что в capilite есть функция, работать с которой можно так: $sign = capilite->sign($cert_name,$data);
26.07.2007 15:17:47Василий
Запустите csptest -keyset -help и он сам всё расскажет.

Пример. Надо подписать файл doc.txt с помощью секретного ключа из контейнера cont1 и сохранить подпись в файл doc.txt.sig:

csptest -keyset -sign GOST -in doc.txt -out doc.txt.sig -container cont1
26.07.2007 17:39:12Александр
То, что надо, спасибо! Ещё бы понять, как у меня контейнер называется. При использовании cryptcp у меня для выбора ключевой пары используется -dn <e-mail в в выданном сертфикате>.
26.07.2007 18:08:18Василий
csptest -keyset -verifycontext -enum_containers

Он перечислит все доступные контейнеры.
26.07.2007 18:46:20Александр
Походу, оно. Спасибо!
01.08.2007 17:16:41Александр
Василий, а можно привети пример проверки ЭЦП для файла данных и файла с подписью. Как указывать сертификат для проверки?
01.08.2007 17:48:33Василий
Я не совсем понял.
Подпись в чистом виде (64 байта) делается и проверяется без всяких сертификатов, низкоуровневыми функциями, которые работают непосредственно с ключами.
Csptest - это просто пример того, как это программируется.
Раз уж Вы хотите работать на таком низком уровне - то Ваша задача, как определять, кто автор подписи и как её проверить (в т.ч. откуда взять открытый ключ для проверки).

Открытый ключ можно взять из сертификата (например, если есть сертификат в файле). Но при этом не будет выполнена проверка самого сертификата - то, что он действителен по дате, то, что он выдан доверенным Центром сертификации, то, что сертификат не отозван.

В приведённом мной ранее примере (файл данных - doc.txt, файл с подписью - doc.txt.sig) проверить подпись можно так (если есть сертификат подписавшего в файле cert.cer):

csptest -keyset -verify GOST -in doc.txt -signature doc.txt.sig -certificate cert.cer


В принципе, гораздо проще использовать более высокоуровневые функции (которые работают с сертификатами). В файл с подписью, кроме собственно подписи, включаются сведения о сертификате подписавшего (а также, опционально, и сам сертификат подписавшего). И при проверке подписи проверяется не только сама подпись, но и сертификат подписавшего.
Готовое приложение для этого - cryptcp.
01.08.2007 18:10:58Александр
Ну, с вопросом доверия к сертификату - это уже моя проблема :) Сам сертификат (с помощью которого проверить надо) лежит в addressbook.sto (туда был загружен через /usr/CPROcsp/bin/storeman), когда я использую crytpcp, то я его указываю опять-таки через -dn. Можно его подобным образом (как в вашем примере выше) указать для csptest?
01.08.2007 18:37:34Василий
нет
Так уж написан пример, что он читает из файла
01.08.2007 18:47:28Александр
Э-эх, а так хочется функциональности вида openssl (пусть даже бы она и включалась ключиком -expertmode у cryptcp).

P.S. Куда уж высокоуровневей, чем cryptcp?
02.08.2007 10:50:59Василий
Собственно, cryptcp я и предлагал с самого начала.
Есть опции: сделать detached подпись (-signf) и проверить её (-vsignf).
Просто Вы просили рассказать, есть ли средства по работе с чистой подписью (64 байта). Вот я и рассказал. Но к cryptcp это не имеет отношения.
02.08.2007 14:53:23Александр
Василий, так они (-signf/vsignf) на выходе формируют/требуют подпись в формате PKCS#7. Мне же снаружи приходят "чистые" 64 байта и отправлять я должен тоже 64 байта. Вот и выросла проблема :(
02.08.2007 16:27:21Василий
Я просто хотел подчеркнуть в предыдущем ответе, что cryptcp не предназначается для работы с чистой подписью.

Что касается csptest - то это пример, реализующий не всю возможную функциональность.

Если будет Ваш код (вызовы функций CryptoAPI) по формированию и/или проверке чистой подписи - то Вы можете сделать как удобнее (в т.ч. поиск сертификата в хранилище). Отличие от чтения сертификата из файла небольшое.

Если Вы будете вызывать непосредственно csptest - то проще всего раскидать сертификаты из хранилища "Другие пользователи" по файлам (с удобными для поиска названиями файлов).
14.08.2007 14:15:18Александр
С проверкой через csptest возника проблема. Программе неизвестен ключ (параметр) -certificate. Т.е.

csptest -keyset -verify GOST -in /tmp/doc.txt -signature /tmp/doc.txt.sig -import partner.cer

не проходит. Не помогает замена на -import или на -pubkey.
14.08.2007 14:25:34Александр
csptest -keyset -verify GOST -in /tmp/doc.txt -signature /tmp/doc.txt.sig -certificate partner.cer

ошибся в предыдущем посте в параметре
15.08.2007 10:19:46Василий
На Win работает.
Можно узнать сообщение об ошибке, что пишет csptest, а также кодировку файла сертификата - DER, Base64 с заголовками, Base64 без заголовков?
15.08.2007 19:13:04Александр
$ 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]
15.08.2007 19:15:30Александр
$ 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]
15.08.2007 19:16:58Александр
$ 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]
15.08.2007 19:17:48Александр
Формат файла partner.cer - DER.
16.08.2007 12:40:39Василий
Ясно, спасибо.
Значит, в нашем CSPtest под UNIX это просто не доделано.

Тогда вариант такой:
csptest -keyset -verify GOST -in /tmp/doc.txt -signature /tmp/doc.txt.sig -import имя_файла

где имя_файла - файл с блобом открытого ключа (который был получен на машине, где делается подпись командой csptest -keyset -container имя_контейнера -keytype *** -provtype *** -export имя_файла )
16.08.2007 15:36:49Александр
Так у меня от противоположной стороны имеется только partner.cer. Ещё он же был импортирован в addressbook.sto на машине. Как-нибудь вывернуться можно? Не думаю, что мне blob смогут предоставить.

P.S. Может проще на e-mail перейти? Мой адрес у Анатолия есть, сейчас отпишу ему :)
16.08.2007 17:45:03Василий
Анатолий в отпуске :)
А по поводу опции -certificate - она должна быть в другой утилите, csptestf (входит в состав пакета capilite).
17.08.2007 10:15:03Александр
Василий, спасибо! Работает.