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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline AntonPetrov  
#1 Оставлено : 19 мая 2021 г. 15:01:58(UTC)
AntonPetrov

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

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

Offline Михаил Селезнёв  
#2 Оставлено : 21 мая 2021 г. 14:24:58(UTC)
Михаил Селезнёв

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

Группы: Участники
Зарегистрирован: 05.04.2017(UTC)
Сообщений: 363
Мужчина
Российская Федерация

Сказал «Спасибо»: 3 раз
Поблагодарили: 54 раз в 53 постах
Добрый день!
Приложите пожалуйста 2 подписи: из Вашей java и из КриптоАРМ.
Offline AntonPetrov  
#3 Оставлено : 22 мая 2021 г. 16:19:24(UTC)
AntonPetrov

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

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

Offline Санчир Момолдаев  
#4 Оставлено : 22 мая 2021 г. 17:56:13(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);
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.