| ||||
| ||||
На клиенте установлен криптоклиент, который использует cryptopro. С его помощью нужно подписать файл, например doc или rtf. Затем файл пересылается на сервер через ms outlook. На сервере тоже cryptopro, через capicom проверяется подпись(capicom вызывается из кода на c#). В одних случаях проходит нормально, в других подпись признается не валидной. Проверяю через SignedData.verify. Ошибка ~ asn1 bad tag. Подскажите как быть? | ||||
Ответы: | ||||
| ||||
Возможно, ошибка в способе чтения и/или передачи бинарных данных. capicom непричем, само сообщение PKCS7 битое | ||||
| ||||
Не поможете идентифицировать ошибку. Скачал dumpasn, нормально открываю файл(.p7z) - говорит нет ошибок, может нужно еще как-то проверить? Вот небольшой кусок файла: 0ѓ#S. *†H†ч ѓ#S0ѓ#S10 *… 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); Соответственно, валится на последней строчке, но не всегда, иногда проходит нормально. | ||||
| ||||
Я С# не знаю. Но вот строка StreamReader sReader = new StreamReader(strPath, Encoding.Unicode) вызывает подозрения. Какую строку возвращает sReader.ReadToEnd(), юникодную? Как она устроена? base64 преобразование кстати делать необязательно, SignedData понимает и бинарные данные. Но можно провести след. тест - прочитать файл, преобразовать в base64, сохранить, сохраненный файл обратно в бинарный и сравнить с исходным. | ||||
| ||||
Да, вы оказались правы. Если в строке: StreamReader sReader = new StreamReader(strPath, Encoding.Unicode); убираю второй параметр в конструкторе, то ошибка asn1 неожиданный конец вылетает в том подписанном файле, который раньше был валиден.! В чем же здесь дело? | ||||
| ||||
Дело в чтение бинарных файлов и их преобразовании из/в юникод. Попробуйте вообще обойтись без этого а работать с файлами в кодировке base64. | ||||
| ||||
Большое спасибо за советы. К сожалению, мы используем сторонний криптоклиент на клиентской машине и не можем перекодировать файлы в base64. Попробовал сделать это у себя на локальной машине - действительно работает, но не каждый раз(1 из 3 свалился - asn1 неожиданный конец данных). При этом подпись валидная при проверке этим клиентом. Похоже, если файл битый, т.е. не совсем соответствует кодировке, но читается word'ом, то проверка подписи такого файла может валится. | ||||