07.02.2006 16:14:25Capicom Asn1 ошибка Ответов: 6
Александр
На клиенте установлен криптоклиент, который использует cryptopro. С его помощью нужно подписать файл, например doc или rtf. Затем файл пересылается на сервер через ms outlook. На сервере тоже cryptopro, через capicom проверяется подпись(capicom вызывается из кода на c#). В одних случаях проходит нормально, в других подпись признается не валидной. Проверяю через SignedData.verify. Ошибка ~ asn1 bad tag. Подскажите как быть?
 
Ответы:
07.02.2006 17:23:30Kirill Sobolev
Возможно, ошибка в способе чтения и/или передачи бинарных данных. capicom непричем, само сообщение PKCS7 битое
07.02.2006 17:43:54Александр
Не поможете идентифицировать ошибку. Скачал dumpasn, нормально открываю файл(.p7z) - говорит нет ошибок, может нужно еще как-то проверить? Вот небольшой кусок файла:
0ѓ#S. *†H†ч
 ѓ#S0ѓ#S1 0
*…  0ѓ#N *†H†ч
 ѓ#Nѓ#N РПаЎ±б

Проверка так:

CAPICOM.Utilities utility = new CAPICOM.UtilitiesClass();
StreamReader sReader = new StreamReader(strPath, Encoding.Unicode);
string Content = utility.Base64Encode(sReader.ReadToEnd());
sReader.Close();
CAPICOM.SignedDataClass signedData = new CAPICOM.SignedDataClass();
signedData.Verify(Content, false, CAPICOM.CAPICOM_SIGNED_DATA_VERIFY_FLAG.CAPICOM_VERIFY_SIGNATURE_ONLY);

Соответственно, валится на последней строчке, но не всегда, иногда проходит нормально.
07.02.2006 17:59:25Kirill Sobolev
Я С# не знаю.
Но вот строка
StreamReader sReader = new StreamReader(strPath, Encoding.Unicode) вызывает подозрения. Какую строку возвращает sReader.ReadToEnd(), юникодную? Как она устроена?
base64 преобразование кстати делать необязательно, SignedData понимает и бинарные данные. Но можно провести след. тест - прочитать файл, преобразовать в base64, сохранить, сохраненный файл обратно в бинарный и сравнить с исходным.
07.02.2006 19:51:23Александр
Да, вы оказались правы. Если в строке:
StreamReader sReader = new StreamReader(strPath, Encoding.Unicode);
убираю второй параметр в конструкторе, то ошибка asn1 неожиданный конец вылетает в том подписанном файле, который раньше был валиден.! В чем же здесь дело?
08.02.2006 9:49:00Kirill Sobolev
Дело в чтение бинарных файлов и их преобразовании из/в юникод. Попробуйте вообще обойтись без этого а работать с файлами в кодировке base64.
08.02.2006 12:27:23Александр
Большое спасибо за советы. К сожалению, мы используем сторонний криптоклиент на клиентской машине и не можем перекодировать файлы в base64. Попробовал сделать это у себя на локальной машине - действительно работает, но не каждый раз(1 из 3 свалился - asn1 неожиданный конец данных). При этом подпись валидная при проверке этим клиентом. Похоже, если файл битый, т.е. не совсем соответствует кодировке, но читается word'ом, то проверка подписи такого файла может валится.