Статус: Новичок
Группы: Участники
Зарегистрирован: 03.02.2020(UTC) Сообщений: 4  Откуда: Samara Сказал(а) «Спасибо»: 2 раз
|
Здравствуйте!
Подскажите, пожалуйтса, есть ли возможность объединить две существующие подписи в одну?
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,234  Сказал(а) «Спасибо»: 106 раз Поблагодарили: 296 раз в 276 постах
|
Добрый день можно. но есть ограничение. подписанты должны быть по одному алгоритму. смотрите в сторону replaceSigners |
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 03.02.2020(UTC) Сообщений: 4  Откуда: Samara Сказал(а) «Спасибо»: 2 раз
|
Автор: Санчир Момолдаев  Добрый день можно. но есть ограничение. подписанты должны быть по одному алгоритму. смотрите в сторону replaceSigners А в каком классе этот метод искать? Отредактировано пользователем 6 июля 2022 г. 15:24:26(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,234  Сказал(а) «Спасибо»: 106 раз Поблагодарили: 296 раз в 276 постах
|
давайте пример покажу Код: // включаем параметры для кадес
System.setProperty("com.sun.security.enableCRLDP", "true"); //crl online
System.setProperty("com.sun.security.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети
System.setProperty("ru.CryptoPro.reprov.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети
// временный алиас для создания шаблона подписи.
String alias = "test2012";
String dir = System.getProperty("user.home");
String datafile = "data.txt";
String sign1file = "sign1.sig";
String sign2file = "sign2.sig";
String mergedFile = "merged.sig";
// читаем файл с данными и файлы подписи. файлы подписи в DER кодировке
byte[] data = Files.readAllBytes(Paths.get(dir + File.separator + datafile));
byte[] sign1 = Files.readAllBytes(Paths.get(dir + File.separator + sign1file));
byte[] sign2 = Files.readAllBytes(Paths.get(dir + File.separator + sign2file));
// вытаскиваем подписанта из первой подписи
CAdESSignature cAdESSignature1 = new CAdESSignature(sign1, data, null);
CAdESSigner signer1 = cAdESSignature1.getCAdESSignerInfo(0);
// вытаскиваем подписанта из второй подписи
CAdESSignature cAdESSignature2 = new CAdESSignature(sign2, data, null);
CAdESSigner signer2 = cAdESSignature2.getCAdESSignerInfo(0);
// смотрим имена субъектов
System.out.println(signer1.getSignerCertificate().getSubjectDN());
System.out.println(signer2.getSignerCertificate().getSubjectDN());
// готовим коллекцию из сертификатов собранных из имеющихся подписей
Collection<X509CertificateHolder> certHolders = new ArrayList<>();
certHolders.add(new X509CertificateHolder(signer1.getSignerCertificate().getEncoded())); // первый
certHolders.add(new X509CertificateHolder(signer2.getSignerCertificate().getEncoded())); // второй
// тут и далее создаем файл подписи-болванку для последующей замены
// следует отметить что все подписанты должны быть по одному алгоритму гост. Например, гост2012-256.
KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME, JCP.PROVIDER_NAME);
keyStore.load(null, null);
PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, "".toCharArray());
// на всякий случай устанавливаем провайдер JCP как провайдер по умолчанию
AdESConfig.setDefaultProvider(JCP.PROVIDER_NAME);
// временная подпись куда мы вставим подписантов
ByteArrayOutputStream signature = new ByteArrayOutputStream();
// создаем открепленную подпись
CAdESSignature mergedSignature = new CAdESSignature(true);
// отключаем проверку сертификата для cades-bes для ускорения.
mergedSignature.setOptions(new Options().disableCertificateValidation());
// добавляем временного подписанта
mergedSignature.addSigner(
JCP.PROVIDER_NAME,
privateKey,
Arrays.asList((X509Certificate) keyStore.getCertificate(alias)),
CAdESType.CAdES_BES,
"",
false
);
// Устанавливаем сертификаты для проверки подписи. Причем устанавливаем их из sign1 и sign2
mergedSignature.setCertificateStore(new CollectionStore(certHolders));
// записывает результат в signature
mergedSignature.open(signature);
mergedSignature.update(data);
mergedSignature.close();
// подготовка коллекции signer info для последующей замены
Collection<SignerInformation> signerInfos = new ArrayList<SignerInformation>();
signerInfos.add(signer1.getSignerInfo()); // первый
signerInfos.add(signer2.getSignerInfo()); // второй
SignerInformationStore signerInfoStore = new SignerInformationStore(signerInfos);
InputStream srcSignerStream = new ByteArrayInputStream(signature.toByteArray());
ByteArrayOutputStream dstSigneBuffer = new ByteArrayOutputStream();
// тут происходит подмена подписантов. т.е. убираем подписанта из временной подписи и вставляем нужных двух
CAdESSignature.replaceSigners(srcSignerStream, signerInfoStore, dstSigneBuffer);
// проверяем полученную подпись.
CAdESSignature verify = new CAdESSignature(dstSigneBuffer.toByteArray(), data, null);
verify.verify(null, null);
// выводим имя субъекта у подписанта с индексом 0 и 1
System.out.println(verify.getCAdESSignerInfo(0).getSignerCertificate().getSubjectDN());
System.out.println(verify.getCAdESSignerInfo(1).getSignerCertificate().getSubjectDN());
// записываем результат в файл
File outputFile = new File(dir + File.separator + mergedFile);
FileOutputStream fos = new FileOutputStream(outputFile);
fos.write(dstSigneBuffer.toByteArray());
|
|
 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 03.02.2020(UTC) Сообщений: 4  Откуда: Samara Сказал(а) «Спасибо»: 2 раз
|
Автор: Санчир Момолдаев  давайте пример покажу Код: // включаем параметры для кадес
System.setProperty("com.sun.security.enableCRLDP", "true"); //crl online
System.setProperty("com.sun.security.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети
System.setProperty("ru.CryptoPro.reprov.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети
// временный алиас для создания шаблона подписи.
String alias = "test2012";
String dir = System.getProperty("user.home");
String datafile = "data.txt";
String sign1file = "sign1.sig";
String sign2file = "sign2.sig";
String mergedFile = "merged.sig";
// читаем файл с данными и файлы подписи. файлы подписи в DER кодировке
byte[] data = Files.readAllBytes(Paths.get(dir + File.separator + datafile));
byte[] sign1 = Files.readAllBytes(Paths.get(dir + File.separator + sign1file));
byte[] sign2 = Files.readAllBytes(Paths.get(dir + File.separator + sign2file));
// вытаскиваем подписанта из первой подписи
CAdESSignature cAdESSignature1 = new CAdESSignature(sign1, data, null);
CAdESSigner signer1 = cAdESSignature1.getCAdESSignerInfo(0);
// вытаскиваем подписанта из второй подписи
CAdESSignature cAdESSignature2 = new CAdESSignature(sign2, data, null);
CAdESSigner signer2 = cAdESSignature2.getCAdESSignerInfo(0);
// смотрим имена субъектов
System.out.println(signer1.getSignerCertificate().getSubjectDN());
System.out.println(signer2.getSignerCertificate().getSubjectDN());
// готовим коллекцию из сертификатов собранных из имеющихся подписей
Collection<X509CertificateHolder> certHolders = new ArrayList<>();
certHolders.add(new X509CertificateHolder(signer1.getSignerCertificate().getEncoded())); // первый
certHolders.add(new X509CertificateHolder(signer2.getSignerCertificate().getEncoded())); // второй
// тут и далее создаем файл подписи-болванку для последующей замены
// следует отметить что все подписанты должны быть по одному алгоритму гост. Например, гост2012-256.
KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME, JCP.PROVIDER_NAME);
keyStore.load(null, null);
PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, "".toCharArray());
// на всякий случай устанавливаем провайдер JCP как провайдер по умолчанию
AdESConfig.setDefaultProvider(JCP.PROVIDER_NAME);
// временная подпись куда мы вставим подписантов
ByteArrayOutputStream signature = new ByteArrayOutputStream();
// создаем открепленную подпись
CAdESSignature mergedSignature = new CAdESSignature(true);
// отключаем проверку сертификата для cades-bes для ускорения.
mergedSignature.setOptions(new Options().disableCertificateValidation());
// добавляем временного подписанта
mergedSignature.addSigner(
JCP.PROVIDER_NAME,
privateKey,
Arrays.asList((X509Certificate) keyStore.getCertificate(alias)),
CAdESType.CAdES_BES,
"",
false
);
// Устанавливаем сертификаты для проверки подписи. Причем устанавливаем их из sign1 и sign2
mergedSignature.setCertificateStore(new CollectionStore(certHolders));
// записывает результат в signature
mergedSignature.open(signature);
mergedSignature.update(data);
mergedSignature.close();
// подготовка коллекции signer info для последующей замены
Collection<SignerInformation> signerInfos = new ArrayList<SignerInformation>();
signerInfos.add(signer1.getSignerInfo()); // первый
signerInfos.add(signer2.getSignerInfo()); // второй
SignerInformationStore signerInfoStore = new SignerInformationStore(signerInfos);
InputStream srcSignerStream = new ByteArrayInputStream(signature.toByteArray());
ByteArrayOutputStream dstSigneBuffer = new ByteArrayOutputStream();
// тут происходит подмена подписантов. т.е. убираем подписанта из временной подписи и вставляем нужных двух
CAdESSignature.replaceSigners(srcSignerStream, signerInfoStore, dstSigneBuffer);
// проверяем полученную подпись.
CAdESSignature verify = new CAdESSignature(dstSigneBuffer.toByteArray(), data, null);
verify.verify(null, null);
// выводим имя субъекта у подписанта с индексом 0 и 1
System.out.println(verify.getCAdESSignerInfo(0).getSignerCertificate().getSubjectDN());
System.out.println(verify.getCAdESSignerInfo(1).getSignerCertificate().getSubjectDN());
// записываем результат в файл
File outputFile = new File(dir + File.separator + mergedFile);
FileOutputStream fos = new FileOutputStream(outputFile);
fos.write(dstSigneBuffer.toByteArray());
у меня keyStore.getCertificate(alias)почему то null, соответственно возникает NPE Это может быть связано с неверной установкой JCP? у меня mac os (java 17), JCP я добавила как библиотеки. Нужно ли сделать чтото еще?
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,064  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 740 раз в 698 постах
|
Здравствуйте. Ключевой контейнер alias существует? |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.09.2023(UTC) Сообщений: 11  Откуда: Екатеринбург Сказал(а) «Спасибо»: 4 раз
|
А есть возможность выполнить объединение подписей через CoSign?
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,234  Сказал(а) «Спасибо»: 106 раз Поблагодарили: 296 раз в 276 постах
|
В jcp не cosign Это есть только в плагине |
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,234  Сказал(а) «Спасибо»: 106 раз Поблагодарили: 296 раз в 276 постах
|
Возможно вам нужно инстанцировать уже имеющуюся подпись и выполнить addSigner |
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close