Статус: Новичок
Группы: Участники
Зарегистрирован: 02.11.2015(UTC) Сообщений: 9  Откуда: Санкт-Петербург Сказал(а) «Спасибо»: 4 раз
|
Здравствуйте! Помогите, пожалуйста. На клиенте выполняется подпись строки (test): Код:
if (dataToSign) {
oSignedData.ContentEncoding = 1;
oSignedData.Content = Base64.encode(dataToSign);
oSigner.Options = 1;
try {
Signature = oSignedData.SignCades(oSigner, CADES_BES);
}
catch (err) {
errormes = "Не удалось создать подпись из-за ошибки: " + GetErrorMessage(err);
alert(errormes);
throw errormes;
}
}
return Signature;
Через POST передаю данные на сервер: Signature, сертификат, строку для подписи (в виде текста - test ). Проверяю на сервере так: Код:
byte sign[] = Base64.decodeBase64(request.getParameter("SignatureTxtBox")); // подпись
byte[] bytesDataToSign = dataToSign.getBytes(Charsets.UTF_8); // строка - test
byte[] bytes = Base64.decodeBase64(request.getParameter("cert")); // сертификат клиента (отдельно передаю)
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
InputStream in = new ByteArrayInputStream(bytes);
X509Certificate cert = (X509Certificate)certFactory.generateCertificate(in); // создаю сертификат на основе пришедшей строки
...
Boolean test = verify(cert.getSigAlgName(),cert.getPublicKey(),bytesDataToSign,sign);
...
/**
* Проверка подписи на открытом ключе
*
* @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);
}
В test - всегда false. Может быть не правильно проверяю? Какие-то другие ошибки допустил? Спасибо заранее!
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,077  Откуда: Крипто-Про Сказал(а) «Спасибо»: 22 раз Поблагодарили: 743 раз в 700 постах
|
Здравствуйте. Вы создаете подпись CAdES-BES, а проверяете как простую в 64 байта (Signature). Используйте CAdES.jar (документация в Doc/javadoc/CAdES-javadoc.jar, примеры в samples-sources.jar/CAdES) или CMSVerify (пример в samples-sources.jar/CMS). |
|
 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 02.11.2015(UTC) Сообщений: 9  Откуда: Санкт-Петербург Сказал(а) «Спасибо»: 4 раз
|
Спасибо за наводку на правильный путь! Переделал проверку, выполняю теперь так: Код:
byte sign[] = Base64.decodeBase64(request.getParameter("SignatureTxtBox"));
String dataToSign = request.getParameter("DataToSignTxtBox");
byte[] bytesDataToSign = dataToSign.getBytes(Charsets.UTF_8);
CAdESSignature cadesSignature = new CAdESSignature(sign, dataToSign, CAdESType.CAdES_BES);
try {
cadesSignature.verify(null);
} catch (Throwable e) {
System.out.println("Ошибка проверки");
}
В конструкторе new CAdESSignature(sign, dataToSign, CAdESType.CAdES_BES); вылетает с ошибкой: Код:
Caused by: java.lang.SecurityException: class "org.bouncycastle.cms.CMSSignatureEncryptionAlgorithmFinder"'s signer information does not match signer information of other classes in the same package
Какие-то библиотеки друг с другом не работают? Не совсем понимаю что обозначает эта ошибка. Буду благодарен за любые предположения. Спасибо!
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 02.11.2015(UTC) Сообщений: 9  Откуда: Санкт-Петербург Сказал(а) «Спасибо»: 4 раз
|
Предыдущую ошибку поправил - связана с разными версиями библиотеки, которые загружал maven.
Теперь строка new CAdESSignature(sign, dataToSign, CAdESType.CAdES_BES); выполняется без ошибок.
Проверка не проходит, возвращает ошибку: Root certificate: sn 2b6e3351fd6eb2ad48200203cb5ba141, subject CN=CRYPTO-PRO Test Center 2, O=CRYPTO-PRO LLC, L=Moscow, C=RU, EMAILADDRESS=support@cryptopro.ru is untrusted, errors: 'Root certificate is in the certificate chain but not in cacerts' (32)
CRYPTO-PRO Test Center 2 прописан в системе в доверенных корневых сертификатах.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,077  Откуда: Крипто-Про Сказал(а) «Спасибо»: 22 раз Поблагодарили: 743 раз в 700 постах
|
Корневой сертификат есть в jre\lib\security\cacerts той jre, в которой выполняете пример? |
|
 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 25.12.2014(UTC) Сообщений: 76
Сказал(а) «Спасибо»: 3 раз
|
Кажется немного странным не использовать HDImageStore в этом случае, при его наличии. Даже если вручную извлечь и передать все сертификаты из него в метод verify. Должно быть, это особенность JVM, с которой приходится мириться.
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close