Статус: Новичок
Группы: Участники
Зарегистрирован: 19.05.2021(UTC) Сообщений: 5
|
Здравствуйте, занимаюсь встраиванием метки времени в существующую подпись. Использую библиотеку bouncycastle. Валидация подписи с помощью КриптоАРМ говорит об "Штап времени не дествителен или нет лицензии", если подписать файл с помощью КриптоАрм, то все нормально. Не очень понятно в чем проблема. Код:
private byte[] signPKCS7(File file, String senderAlias, char[] senderPassword, boolean detached) throws Exception {
CAdESUtility.initJCPAlgorithms();
//Загрузка хранилища
final KeyStore hdImageStore = KeyStore.getInstance(CMStools.STORE_TYPE);
hdImageStore.load(null, null);
//ключ отправителя
final PrivateKey senderKey =
(PrivateKey) hdImageStore.getKey(senderAlias, senderPassword);
final X509Certificate publicSenderCert =
(X509Certificate) hdImageStore.getCertificate(senderAlias);
final List<Certificate> certificateChain = Arrays.asList(hdImageStore.getCertificateChain(senderAlias));
// Конвертируем цепочку в X509Certificate.
final Collection<X509Certificate> chain
= Arrays.asList(certificateChain.toArray(new X509Certificate[certificateChain.size()]));
Store certStore = new JcaCertStore(chain);
// Подготавливаем подпись.
final CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
ContentSigner contentSigner = new GostContentSignerProvider(
senderKey, JCP.PROVIDER_NAME);
SignerInfoGenerator signerInfoGenerator = new JcaSignerInfoGeneratorBuilder(
(DigestCalculatorProvider) new GostDigestCalculatorProvider(senderKey, JCP.PROVIDER_NAME))
.build(contentSigner, publicSenderCert);
generator.addSignerInfoGenerator(signerInfoGenerator);
generator.addCertificates(certStore);
// Сформированная подпись.
//return generator.generate(new CMSProcessableByteArray(data), !detached).getEncoded();
byte[] sign = generator.generate(new CMSProcessableFile(file), !detached).getEncoded();
// получение хеша из подписи
byte[] generatedDigest = (byte[]) generator.getGeneratedDigests().values().stream().findFirst().get();
// Получение TSP Токена
TimeStampToken timeStampToken = getTimeStampToken(generatedDigest);
CMSSignedData signedData = new CMSSignedData(sign);
// создание ASN1 аттрибута из полученного токена
Attribute attribute = new Attribute(
PKCSObjectIdentifiers.id_aa_signatureTimeStampToken,
new DERSet(timeStampToken.toCMSSignedData().toASN1Structure())
);
// добавление аттрибута подписанту в уже сформированную подпись
SignerInformation signer = (SignerInformation) signedData.getSignerInfos().getSigners().iterator().next();
ASN1EncodableVector timestampVector = new ASN1EncodableVector();
timestampVector.add(attribute);
signer = SignerInformation.replaceUnsignedAttributes(signer, new AttributeTable(timestampVector));
return CMSSignedData.replaceSigners(
signedData, new SignerInformationStore(Collections.singleton(signer))
).getEncoded();
}
private TimeStampToken getTimeStampToken(byte[] generatedDigest) throws IOException, TSPException {
TimeStampRequestGenerator requestGenerator = new TimeStampRequestGenerator();
//requestGenerator.setReqPolicy(new ASN1ObjectIdentifier("1.2.643.4.15.1.2.2.3"));
requestGenerator.setCertReq(true);
TimeStampRequest tspRequest = requestGenerator.generate(TSPAlgorithms.GOST3411, generatedDigest);
byte[] encodedRequest = tspRequest.getEncoded();
HttpRequest postRequest = httpRequestFactory.buildPostRequest(
new GenericUrl(tspUri),
new ByteArrayContent(TSP_CONTENT_TYPE, encodedRequest)
);
postRequest.getHeaders().setContentType(TSP_CONTENT_TYPE);
postRequest.getHeaders().setContentLength((long) encodedRequest.length);
postRequest.setConnectTimeout(tspTimeout);
HttpResponse postResponse;
try {
postResponse = postRequest.execute();
} catch (Exception e) {
String errMsg;
if (e instanceof HttpResponseException ) {
errMsg = ((HttpResponseException) e).getStatusMessage();
} else {
errMsg = e.getMessage();
}
throw new TSPException("Exception occurred when processing request to TSP server " + errMsg);
}
TimeStampResponse tspResponse = new TimeStampResponse(
TimeStampResp.getInstance(new ASN1InputStream(postResponse.getContent()).readObject())
);
tspResponse.validate(tspRequest);
if (tspResponse.getFailInfo() != null) {
throw new TSPException("Unable to complete the timestamping due to an invalid response " + tspResponse.getFailInfo());
}
log.info("Valid TSP service response received {}", tspResponse.getTimeStampToken().getTimeStampInfo().getTsa());
return tspResponse.getTimeStampToken();
}
Отредактировано пользователем 19 мая 2021 г. 15:21:47(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 05.04.2017(UTC) Сообщений: 363   Сказал «Спасибо»: 3 раз Поблагодарили: 54 раз в 53 постах
|
Добрый день! Приложите пожалуйста 2 подписи: из Вашей java и из КриптоАРМ.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 19.05.2021(UTC) Сообщений: 5
|
Автор: Михаил Селезнёв  Добрый день! Приложите пожалуйста 2 подписи: из Вашей java и из КриптоАРМ. Здравствуйте !!! Файлы подписей бинарные, переименованы в txt в связи с ограничением форума  bag.sig.txt (6kb) загружен 2 раз(а). good.sig.txt (7kb) загружен 2 раз(а). test.txt (1kb) загружен 2 раз(а).Отредактировано пользователем 22 мая 2021 г. 16:20:53(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,223  Сказал(а) «Спасибо»: 101 раз Поблагодарили: 290 раз в 270 постах
|
Автор: AntonPetrov  Автор: Михаил Селезнёв  Добрый день! Приложите пожалуйста 2 подписи: из Вашей java и из КриптоАРМ. Здравствуйте !!! Файлы подписей бинарные, переименованы в txt в связи с ограничением форума  bag.sig.txt (6kb) загружен 2 раз(а). good.sig.txt (7kb) загружен 2 раз(а). test.txt (1kb) загружен 2 раз(а). Добрый день! попробуйте высокоуровневый вариант Код:CAdESSignature signature = new CAdESSignature(sign, data, null);
CAdESSigner srcSigner = signature.getCAdESSignerInfo(0);
srcSigner.enhance(JCP.PROVIDER_NAME, srcSigner.getSignerInfo().toASN1Structure().getDigestAlgorithm().getAlgorithm().getId(), chain, crlSet, tspUrl, CAdESType.CAdES_X_Long_Type_1, null);
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close