24.10.2005 14:56:22Не удается проверить подпись сообщения под Linux Ответов: 10
Maxim A. Simonov
Имеется сообщение, подписанное под Windows средствами CAPICOM. Сертификат подписчика содержится в сообщении. При проверке этого сообщения под Linux выдается ошибка:

/usr/CPROcsp/bin/cryptcp -verify out.p7b
CryptCP 3.00 (c) "Crypto-Pro", 2002-2003.
Command prompt Utility for data protection.
-verify - Verifies signatures of a message.
Can’t open certificate store: ’My’.
Can’t open certificate store: ’Addressbook’.
Error: No certificates found. (0x2000012D)

Signer’s certificate not found.
[ErrorCode: 0x200001f9]

Сертификат подписчика на Linux машину не установлен. При проверке сообщения под Windows, и после установки сертификата на Linux, все работает. В чем может быть проблема?
 
Ответы:
24.10.2005 17:52:26Анатолий
Не могли бы вы описать проблему по подробней.
Из под какого пользователя запускпется проверка? Что за линукс(+ uname -a заодно)Что означает фраза " При проверке сообщения под Windows, и после установки сертификата на Linux, все работает" Тоесть вы проверили под виндой а потом под линуксом и все сработало?
24.10.2005 17:53:46Анатолий
В догонку а CAPICOM использовались юникодные функции?
25.10.2005 10:10:31Maxim A. Simonov
Linux *** 2.4.20-13.9smp #1 SMP Mon May 12 10:48:05 EDT 2003 i686 i686 i386 GNU/Linux (Redhat 9.0 "из коробки"), проверка делается под обычным пользователем, не root. Сообщение подписывается примером из CAPICOM-а (CAPICOM\samples\html\SignedData.htm) на Windows-машине. Проверка подписи на Windows-машине (там же, где и подписывалось) проходит успешно (csptest2_0.exe -sfsign -verify -in out.p7b), на Linux - только после инсталляции сертификата подписчика в хранилище пользователя, под которым запускается проверка (/usr/CPROcsp/bin/cryptcp -verify out.p7b), причем утилитой csptestf из пакета cpcsp-capilite-3.0.4-9 подпись все равно не проверяется, даже после инсталляции сертификата:
$ /usr/CPROcsp/bin/csptestf -cmssfsign -in out.p7b -verify
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.
An error occurred in running the program.
../../../../mybuild/CSP/samples/csptest/cmssf.c:410:No user cert specified. Cryptocontext will be opened automaticaly.
Error number 0 (0).
An error occurred in running the program.
../../../../mybuild/CSP/samples/csptest/cmssf.c:490:Signature was NOT verified.
Error number 7777777 (125269879).
Total:
[ErrorCode: 0x07777777]

$ /usr/CPROcsp/bin/csptestf -cmslowsign -in out.p7b -verify
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.
An error occurred in running the program.
../../../../mybuild/CSP/samples/csptest/cmslow.c:447:No user cert specified. Cryptocontext will be opened automaticaly.
Error number 0 (0).
The message to decode is open.
The encoded blob has been added to the message.
The message parameter (CMSG_CONTENT_PARAM) has been acquired. Message size: 12
The message param (CMSG_CONTENT_PARAM) updated. Length is 12.
Try to get user cert. OK. Length 338.
The signer info has been returned.
Segmentation fault
25.10.2005 12:15:43Василий
По первому (про cryptcp) - при проверке подписи надо указать, где искать сертификат (по умолчанию - это хранилища My и AddressBook). Если сертификата там нет, подпись не проверится. Если не хотите ставить туда сертификат (когда он есть в сообщении) - нужно указать опцию -f имя_файла, т.е., в Вашем случае, когда сертификат в том же файле

cryptcp -verify out.p7b -f out.p7b
25.10.2005 12:48:00Maxim A. Simonov
$ /usr/CPROcsp/bin/cryptcp -verify out.p7b -f out.p7b
CryptCP 3.00 (c) "Crypto-Pro", 2002-2003.
Command prompt Utility for data protection.
-verify - Verifies signatures of a message.
Can’t open certificate store: ’out.p7b’.
Error: No certificates found. (0x2000012D)

Signer’s certificate not found.
[ErrorCode: 0x200001f9]
25.10.2005 13:06:13Maxim A. Simonov
Дополнение к предыдущему посту: как выяснилось, ключ -f почему-то использует лишь первый символ имени файла, это видно из strace:
21260 open("o", O_RDONLY) = -1 ENOENT (No such file or directory)
21260 time([1130229964]) = 1130229964
21260 getpid() = 21260
21260 rt_sigaction(SIGPIPE, {0x420db0d0, [], SA_RESTORER, 0x420276f8}, {SIG_DFL}, 8) = 0
21260 send(4, "<38>Oct 25 12:46:04 cpcsp[21260]"..., 92, 0) = 92
21260 rt_sigaction(SIGPIPE, {SIG_DFL}, NULL, 8) = 0
21260 write(1, "Can\&rsquo;t open certificate store: \&rsquo;o"..., 41) = 41
21260 write(1, "Error: No certificates found. (0"..., 43) = 43

(выполнялась команда /usr/CPROcsp/bin/cryptcp -verify out.p7b -f out.p7b)

Т.е. если сделать линк out.p7b -> o и выполнить команду /usr/CPROcsp/bin/cryptcp -verify out.p7b -f o - результат будет следующим:
CryptCP 3.00 (c) "Crypto-Pro", 2002-2003.
Command prompt Utility for data protection.
-verify - Verifies signatures of a message.
Error: No certificates found. (0x2000012D)

Signer&rsquo;s certificate not found.
[ErrorCode: 0x200001f9]

Т.е. на невозможность открытия хранилища уже не ругается, но сертификат из сообщения все равно не читает. Если же в качестве "о" подсунуть сертификат подписчика в .der кодировке, то все проверяется.
25.10.2005 15:57:05Анатолий
Говорят от в bash от этого спасают одинарные кавычки.
25.10.2005 16:08:27Maxim A. Simonov
"от этого" - это от чего?
22.06.2006 10:14:04Сергеев Андрей
Аналогичная проблема:
Был подписан документ с отсоединенной подписью при помощи CryptoPro CSP 2.0 для Windows.
При проверке подписи на Linux выдает ошибку, что не может открыть файл сертификата.
Как и было указано выше, открывает сертификат, если указать файл сертификата в der кодировке, однако, не может связать его с подписанным документом.
22.06.2006 10:20:27Сергеев Андрей
использование кавычек (как одинарных, так и двойных) - не помогает