Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.01.2013(UTC) Сообщений: 33 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 15 раз
|
Проверка в JCP подписи, созданной в Browser Plugin Нужно состыковать создание подписи в браузерном плагине и её проверку в JCP. Для начала попытался подписать и проверитьстроку... Не получилось ( Создание подписи: Код:
dataToSign = window.btoa('1234567890'); // MTIzNDU2Nzg5MA==
HASH = '4B565582CCC3BF1AEA4F2A535E2E4A96092F58E3';
var oStore = DSP.CreateObject('CAPICOM.Store');
oStore.Open(DSP.CAPICOM_CURRENT_USER_STORE, DSP.CAPICOM_MY_STORE,DSP.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
// Находим сертификат в хранилище по хэшу
var oCertificates = oStore.Certificates.Find(DSP.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, HASH);
if (oCertificates.Count == 0) {
alert('Certificate not found');
}
var oCertificate = oCertificates.Item(1);
var oSigner = DSP.CreateObject('CAdESCOM.CPSigner');
oSigner.Certificate = oCertificate;
var oSignedData = DSP.CreateObject('CAdESCOM.CadesSignedData');
oSignedData.ContentEncoding = 1;
oSignedData.Content = dataToSign;
try {
var sSignedMessage = oSignedData.SignCades(oSigner, DSP.CADESCOM_CADES_BES, true); //ЭЦП
} catch (err) {
alert('Failed to create signature. Error: ' + DSP.GetErrorMessage(err));
}
oStore.Close();
$('input[name="SIGNATURE"]').val(sSignedMessage);
Подпись через POST форму попадают в PHP обработчик, который декодирует её и сохраняет в файл. Сертификат, на котором создана подпись кладу рядом userсert.cer (так и не понял как в Яве извлечь сертификат прямо из подписи) Код:
file_put_contents('c:\\usersig.txt',base64_decode($_POST['SIGNATURE']))
Далее в JCP нужно проверить подпись. Код:
private static final String ALG = JCP.CRYPTOPRO_SIGN_NAME; //"CryptoProSignature"
private static final String filecert = System.getProperty("user.dir")+ DS + "userсert.cer";
private static final String filesig = System.getProperty("user.dir")+ DS + "usersig.txt";
Certificate cert = null;
// Получаем сертификат из файла
FileInputStream fis = new FileInputStream(filecert);
BufferedInputStream bis = new BufferedInputStream(fis);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
while (bis.available() > 0) {
cert = cf.generateCertificate(bis);
}
// Подписанные данные
orig = "1234567890".getBytes();
// Получаем подпись из файла
inFile = new FileInputStream(filesig);
byte[] sig = new byte[inFile.available()];
inFile.read(sig);
inFile.close();
boolean result = verify(ALG, cert.getPublicKey(), orig, sig);
System.out.println(result);
При этом результат стабильно falseПерекодировку учел отсюда - Особенности представления данных для подписи при работе с объектом CadesSignedDataОтредактировано пользователем 8 мая 2014 г. 14:37:21(UTC)
| Причина: Не указана Вложение(я): ![](/forum2/Themes/soclean/icon_file.gif) userсert.zip (2kb) загружен 8 раз(а).![](/forum2/Themes/soclean/icon_file.gif) usersig.txt (2kb) загружен 10 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Здравствуйте. Попробуйте подпись проверить в csptest, например, или cryptcp. Также проверьте входные/выходные данные, может, не все читается. Отредактировано пользователем 12 мая 2014 г. 16:20:17(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.01.2013(UTC) Сообщений: 33 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 15 раз
|
Автор: afev ![Перейти к цитате Перейти к цитате](/forum2/Themes/soclean/icon_latest_reply.gif) Здравствуйте. Попробуйте подпись проверить в csptest, например, или cryptcp. Также проверьте входные/выходные данные, может, не все читается. В cryptcp проверял уже. Подпись, которую генерирует плагин корректная. Причем как бинарный вариант корректно проверяется Код:file_put_contents('c:\\usersig.txt',base64_decode($_POST['SIGNATURE']))
, так и base64 вариант (на всяки случай пробовал) Код:file_put_contents('c:\\usersig64.txt',$_POST['SIGNATURE'])
Получается что плагин выходные данные (файл usersig.txt) генерирует правильно. Для проверки вх./вых. данных в JCP добавил вывод в файл: Код:
// Получаем подпись из файла
inFile = new FileInputStream("usersig.txt");
byte[] sig = new byte[inFile.available()];
inFile.read(sig);
inFile.close();
//Сохраняем её в файл еще раз
FileOutputStream outFile = new FileOutputStream("out.txt");
outFile.write(sig);
outFile.close();
usersig.txt и out.txt получаются идентичными и по длине и по содержимому В JCP передавал как бинарный вариант подписи, так и base64. Причем во время выполнения ошибок не выдает никаких. Просто false и всё. Поэтому бинарный вариант тут нужен, думаю. Иначе бы "ругался" на невозможность из base64 декодировать.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Сама подпись в base64? Если да, то надо декодировать (невидно, что в verify()), если нет - может, проблема в том, что как txt сохраняется бинарная подпись? Отредактировано пользователем 12 мая 2014 г. 17:25:06(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.01.2013(UTC) Сообщений: 33 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 15 раз
|
Автор: afev ![Перейти к цитате Перейти к цитате](/forum2/Themes/soclean/icon_latest_reply.gif) Сама подпись в base64? Если да, то надо декодировать (невидно, что в verify()), если нет - может, проблема в том, что как txt сохраняется бинарная подпись? Верно. не заметил. вот код verify()Код:
/**
* Проверка подписи на открытом ключе
*
* @param alghorithmName алгоритм подписи
* @param publicKey открытый ключ
* @param data подписываемые данные
* @param signature подпись
* @return true - верна, false - не верна
* @throws Exception /
*/
public static boolean verify(String alghorithmName, PublicKey publicKey,
byte[] data, byte[] signature) throws Exception {
final Signature sig = Signature.getInstance(alghorithmName);
sig.initVerify(publicKey);
sig.update(data);
return sig.verify(signature);
}
Функция verify, кстати, полностью из примера из документации по JCP (отсюда samples/samples_src.jar/userSamples/SignAndVerify.java) Подпись используется в бинарном виде: Плагин выдаёт её в base64, затем php скрипт декодирует в бинарник. (первый пост) Код:file_put_contents('c:\\usersig.txt',base64_decode($_POST['SIGNATURE']))
Только вот не понял причем тут расширение .txt... Насколько я знаю, ни file_put_content() в php, ни FileInputStream() в java никак не изменяют своего поведения в зависимости от расширения файла. В любом случае, cryptcp нормально валидировал подпись из плагина. Исправил расширение файла с подписью и в JCP исправил: Код:private static final String filesig = System.getProperty("user.dir")+ DS + "usersig.sig";
Опять тоже самое - falseВот интересно, вообще с проверкой в JCP подписи, созданной не в JCP, сталкивася кто-нибудь...
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
У вас формируется CAdES-BES подпись, как я понял, а проверяется почему-то как plain - то есть "голая" подпись (из 64 байтов). Вам следует смотреть примеры из пакета CMS_samples либо CAdES. |
|
![thanks](/forum2/Themes/soclean/heart_small.png) 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
sniker оставлено 13.05.2014(UTC)
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.01.2013(UTC) Сообщений: 33 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 15 раз
|
Спасибо. Видимо в этом проблема. Не разобрался с первого раза в документации к JCP. Только не могу скомпилировать CMSVerifyeclipse не может импортировать com.objsys.asn1j.runtime.Asn1BerDecodeBufferГде её можно взять? У меня только JCP + JRE установлено. UPDATE: РЕШЕНО! )Нашёл её в JCP. Почему-то eclipse не включил её в составе jre Отредактировано пользователем 14 мая 2014 г. 13:08:05(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
В дистрибутиве jcp есть библиотека asn1rt.jar (она должна копироваться в jre при установке jcp). |
|
![thanks](/forum2/Themes/soclean/heart_small.png) 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
sniker оставлено 14.05.2014(UTC)
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.08.2018(UTC) Сообщений: 32 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 6 раз
|
Возникла схожая проблема. Есть файл с данными и конверт с подписью этого файла. Подпись сформирована с помощью browser plugin. На сайте https://www.gosuslugi.ru/pgu/eds/order подпись проходит проверку успешно, в КриптоАрме тоже. В JCP следующая ситуация: проверка по примеру из пакета CAdES проходит, если включить онлайновую проверку CRL; проверка по примеру из CMS_Samples всегда возвращает false. Пытался по инструкции https://support.cryptopr...nlirovnija-kriptopro-jcp включить журналирование, но ничего нового в выводе программы не появилось ни при проверке по CAdES ни по CMS. Сертификат открытого ключа установлен в хранилище типа CertStore, корневые установлены в cacerts Куда ещё можно копнуть и как заставить работать журналирование? Данные с подписью ![](/forum2/Themes/soclean/icon_file.gif) 25_sign_detached.zip (686kb) загружен 3 раз(а). и настройки логирования ![](/forum2/Themes/soclean/icon_file.gif) cacerts.zip (76kb) загружен 2 раз(а). во вложениях Отредактировано пользователем 25 октября 2018 г. 17:48:32(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Здравствуйте. Автор: Малыгин Н. ![Перейти к цитате Перейти к цитате](/forum2/Themes/soclean/icon_latest_reply.gif) Возникла схожая проблема. Есть файл с данными и конверт с подписью этого файла. Подпись сформирована с помощью browser plugin. На сайте https://www.gosuslugi.ru/pgu/eds/order подпись проходит проверку успешно, в КриптоАрме тоже. В JCP следующая ситуация: проверка по примеру из пакета CAdES проходит, если включить онлайновую проверку CRL; проверка по примеру из CMS_Samples всегда возвращает false. Пытался по инструкции https://support.cryptopr...nlirovnija-kriptopro-jcp включить журналирование, но ничего нового в выводе программы не появилось ни при проверке по CAdES ни по CMS. Сертификат открытого ключа установлен в хранилище типа CertStore, корневые установлены в cacerts Куда ещё можно копнуть и как заставить работать журналирование? Данные с подписью ![](/forum2/Themes/soclean/icon_file.gif) 25_sign_detached.zip (686kb) загружен 3 раз(а). и настройки логирования ![](/forum2/Themes/soclean/icon_file.gif) cacerts.zip (76kb) загружен 2 раз(а). во вложениях Скорее всего, при проверке с помощью CMS_Samples вы хешировали данные, а не атрибуты. Более развернутая проверка - в CMSVerify. Для журналирования - да, по инструкции ставите уровень, например, ALL, у нужного хендлера - Console и т.п., добавляете строку про JCPLogger тоже с уровнем. Все это в logging.properties той java, в которой происходит выполнение примера. У веб-серверов могут быть свои logging.properties. Также посмотрите http://cpdn.cryptopro.ru...nt/cades/plugin-faq.html |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close