Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.10.2018(UTC) Сообщений: 36 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 4 раз
|
Добрый день! Работаю над программой на Java + JCP. Хочу в этой программе реализовать подпись как в плагине. Что у меня есть: - ОС Windows 7 - фиксированный массив байт для тестов; - плагин для браузера (CAdESCOM); - программа на java + JCP (CAdES). Используя технологию COM, пишу такой скрипт на VB: Код:
Dim Store As CPStore
Dim Certificates As ICertificates
Dim Certificate As ICertificate
Dim Signer As CPSigner
Dim Signer1 As CPSigner
Dim oSignedData As CadesSignedData
Dim attr As CPAttribute
Set Store = CreateObject("CAdESCOM.Store")
Set Signer = CreateObject("CAdESCOM.CPSigner")
Set oSignedData = CreateObject("CAdESCOM.CadesSignedData")
Store.Open CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED
Set Certificates = Store.Certificates
Set Certificate = Certificates.Item(1)
Signer.Certificate = Certificate
Signer.Options = CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY
oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY
oSignedData.Content = "MTAvMjAvMjAxOCAxNzozNDoyMw=="
Dim Message As String
Message = oSignedData.SignCades(Signer, CADES_BES, True)
Получаем итоге в переменной Message подпись в кодировке Base64 длинной 4696 байт/символов Далее. Пишу на Java (правильнее сказать слегка меняю код из примера JCP/samples-sources/SignExample.java): Код:
package CAdES;
import CAdES.configuration.Configuration;
import CAdES.configuration.IConfiguration;
import CAdES.configuration.SimpleConfiguration;
import CAdES.configuration.container.Container2001;
import CAdES.configuration.container.ISignatureContainer;
import org.bouncycastle.asn1.cms.AttributeTable;
import org.bouncycastle.util.CollectionStore;
import ru.CryptoPro.CAdES.CAdESSignature;
import ru.CryptoPro.CAdES.CAdESSigner;
import ru.CryptoPro.CAdES.CAdESType;
import ru.CryptoPro.CAdES.exception.CAdESException;
import ru.CryptoPro.JCP.tools.Array;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
/**
* Пример создания CAdES подписи.
*
* 17/04/2012
*
*/
public class SignExample {
static {
// Включаем возможность онлайновой проверки.
System.setProperty("com.sun.security.enableCRLDP", "true");
System.setProperty("com.ibm.security.enableCRLDP", "true");
}
/**
* Создание CAdES-подписи с двумя подписантами: CAdES-BES и
* CAdES-X Long Type 1.
*
* @param config Конфигурация подписи.
* @param outFileName Файл для сохранения подписи.
* @return готовую подпись.
* @throws Exception
*/
public static void createMixedSignatureWith2Signers(IConfiguration config, String outFileName) throws Exception {
CAdESSignature cadesSignature = new CAdESSignature(config.detached());
cadesSignature.setCertificateStore(config.getCertificateStore());
cadesSignature.setCRLStore(config.getCRLStore());
// Создаем подписанта CAdES-BES.
cadesSignature.addSigner(config.getProviderName(),
config.getPrivateKey(), config.getChain(), CAdESType.CAdES_BES, null, true);
// Сохраним подпись либо в файл, либо в массив.
ByteArrayOutputStream outSignatureStream = new ByteArrayOutputStream();
cadesSignature.open(outSignatureStream);
byte[] bytesToSing = Base64.getDecoder().decode("MTAvMjAvMjAxOCAxNzozNDoyMw==".getBytes(StandardCharsets.UTF_8));
cadesSignature.update(bytesToSing);
// Завершаем создание подписи с двумя подписантами.
cadesSignature.close();
outSignatureStream.close();
byte[] cadesCms = Base64.getEncoder().encode(outSignatureStream.toByteArray());
if (outFileName != null) {
Array.writeFile(outFileName, cadesCms);
}
CAdESSigner[] signers = cadesSignature.getCAdESSignerInfos();
System.out.println(signers.length);
}
/**
* Создание CAdES подписи.
*
* @param container Описание используемого ключевого контейнера.
* @param useStream True, если следует использовать поток данных и подписи.
*/
public static void signExample(ISignatureContainer container, boolean useStream) {
try {
IConfiguration configDetached = new SimpleConfiguration(container, true, useStream);
createMixedSignatureWith2Signers(configDetached, SimpleConfiguration.getTempFileName(null));
} catch (Exception e) {
Configuration.printCAdESException(e);
}
}
/**
* @param args
*/
public static void main(String[] args) {
SignExample.signExample(new Container2001(), false);
}
}
В итоге получаю подпись в кодировке Base64 длиной 1448 байт/символов Вопрос в том какие особенности работы CAdESCOM по сравнению с JCP что получаются настолько разные результаты? И как сделать так, чтобы результаты стали "походить" (извините за недотермин) друг на друга? p.s. Еще одно наблюдение (хотя может быть и не важное): Если взглянуть на поле Signers объекта oSignedData после вызова метода oSignedData.SignCades(...), то в нем будет содержаться как минимум один "подписчик", а если получить массив подписчиков у объекта cadesSignature после вызова метода cadesSignature.close() (cadesSignature.getCAdESSignerInfos()), будет пустой массив. Тоже интересно, почему? Заранее благодарю за ответ! Отредактировано пользователем 7 ноября 2018 г. 20:19:47(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.10.2018(UTC) Сообщений: 36 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 4 раз
|
Да, забыл уточнить... Данные которые пытаюсь подписать в обоих случаях одинаковые: строка в формате Base64: MTAvMjAvMjAxOCAxNzozNDoyMw== Едиственное, что в java предварительно (перед подписыванием) декодирую в массив байт в формате UTF-8
Да, подписи не будут тождественно равны - это понятно. Но почему же они настолько разные? Подписывая эту "строку" плагином n-раз, я получал n-раз разную подпись (я имею ввиду сами байты в подписи), но всегда это была последовательность из 4696 байт с одинаковыми начальными n-байтами.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Здравствуйте. По поводу размера подписи - если тип подписи один и тот же, то дело, скорее всего, в сертификате/цепочке сертификатов, которую cadescom может по умолчанию помещать в подпись. Это же можно сделать с помощью cades.jar, у cadessignature есть методы добавления сертификатов в подпись. После создания, чтобы увидеть подписантов, надо декодировать подпись. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.10.2018(UTC) Сообщений: 36 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 4 раз
|
Да, подписи и там и там одинаковые CADES_BES Код:
Message = oSignedData.SignCades(Signer, [b]CADES_BES[/b], True)
Код:
cadesSignature.addSigner(config.getProviderName(),config.getPrivateKey(), config.getChain(), [b]CAdESType.CAdES_BES[/b], null, true);
Цитата: Это же можно сделать с помощью cades.jar, у cadessignature есть методы добавления сертификатов в подпись.
Получилось добавить сертификат подписи. Ситуация немного улучшилась, но еще не до конца. Размер подписи JCP по-прежнему немного меньше (на 72 байта/символа). Может быть CADESCOM по умолчанию еще что-то добавляет? И еще отличие CADESCOM от JCP: В подписи от CADESCOM в формате base64 начало всегда такое (в моем случае) "MIINvgYJKoZIhvcNAQcCoIIN..." А в подписи от JCP в формате base64 начало всегда такое (в моем случае) "MIAGCSqGSIb3DQEHAqCAMIAC..."
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Да, может еще добавлять signingTime. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.10.2018(UTC) Сообщений: 36 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 4 раз
|
Добавил signingTime атрибут в подпись. Теперь размер совпал ровно 4696 байт, как и в случае с CADESCOM. Но вот как быть с с самой подписью, я имею ввиду содержимым. Вот с этой частью [qoute] И еще отличие CADESCOM от JCP: В подписи от CADESCOM в формате base64 начало всегда такое (в моем случае) "MIINvgYJKoZIhvcNAQcCoIIN..." А в подписи от JCP в формате base64 начало всегда такое (в моем случае) "MIAGCSqGSIb3DQEHAqCAMIAC..."
Т.е. подписи настолько сильно отличаются, что base64 дает такие разные значения? Или как?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Могут отличаться правила кодирования информации (asn) - с длиной или без длины. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.10.2018(UTC) Сообщений: 36 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 4 раз
|
Спасибо, за оперативные ответы! А можно как-то мне привести их к единообразию?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
А зачем вам что бы совпадали способы кодирования ASN1? Оба варианта полностью валидны и принимаются для проверки как плагином так и JCP. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.10.2018(UTC) Сообщений: 36 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 4 раз
|
В принципе действительно мне это не особо важно. Главное, что-бы проверка проходила. Спасибо за помощь.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close