Ключевое слово в защите информации
ключевое слово
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline liardok  
#1 Оставлено : 28 января 2016 г. 12:44:54(UTC)
liardok

Статус: Новичок

Группы: Участники
Зарегистрирован: 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.
Может быть не правильно проверяю?
Какие-то другие ошибки допустил?

Спасибо заранее!
Offline Евгений Афанасьев  
#2 Оставлено : 28 января 2016 г. 12:59:27(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 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).
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
liardok оставлено 28.01.2016(UTC)
Offline liardok  
#3 Оставлено : 28 января 2016 г. 16:01:14(UTC)
liardok

Статус: Новичок

Группы: Участники
Зарегистрирован: 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


Какие-то библиотеки друг с другом не работают?
Не совсем понимаю что обозначает эта ошибка.
Буду благодарен за любые предположения.
Спасибо!
Offline liardok  
#4 Оставлено : 28 января 2016 г. 16:35:50(UTC)
liardok

Статус: Новичок

Группы: Участники
Зарегистрирован: 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 прописан в системе в доверенных корневых сертификатах.
Offline Евгений Афанасьев  
#5 Оставлено : 28 января 2016 г. 18:40:03(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,077
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 22 раз
Поблагодарили: 743 раз в 700 постах
Корневой сертификат есть в jre\lib\security\cacerts той jre, в которой выполняете пример?
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
liardok оставлено 30.01.2016(UTC)
Offline auglov  
#6 Оставлено : 4 мая 2017 г. 15:03:56(UTC)
auglov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 25.12.2014(UTC)
Сообщений: 76

Сказал(а) «Спасибо»: 3 раз
Кажется немного странным не использовать HDImageStore в этом случае, при его наличии. Даже если вручную извлечь и передать все сертификаты из него в метод verify.
Должно быть, это особенность JVM, с которой приходится мириться.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.