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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline demon101  
#1 Оставлено : 16 декабря 2011 г. 21:20:58(UTC)
demon101

Статус: Участник

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

Улучшаю подпись c помощью cades.dll
При проверке крипто арм выдает сообщение "Подпись не содержит штампа времени на доказательства подлинности либо он недействителен"
Используется функции библиотеки cades.dll, указанную в мануале: http://www.cryptopro.ru/...dapienhancecadesbes.html

Исходная подпись нормально проходит проверку в крипто арм


в аттаче – артефакты процесса создания улучшенной подписи:
· приватный ключ
· csr
· сертификат
· данные
· подпись
· улучшенная подпись

По-идее штам времени -- это обязательная часть усовершенствованной подписи. Библиотека его всегда должна добавлять. Или это не так?

Вложение(я):
enchanced-signature.zip (17kb) загружен 28 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Новожилова Елена  
#2 Оставлено : 19 декабря 2011 г. 17:09:44(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Штамп времени на доказательства подлинности в вашей улучшенной подписи присутствует. Нужно разбираться, почему КриптоАРМ не считает его действительным. Может быть не установлен сертификат корневого УЦ? Смотрите требования для проверки УЭЦП здесь.
Offline Laroux  
#3 Оставлено : 19 декабря 2011 г. 17:53:58(UTC)
Laroux

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

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

Сказал «Спасибо»: 81 раз
Поблагодарили: 72 раз в 60 постах
1. По моему опыту: 0x80004005 свидетельствует об отсутствии какого-то из сертификатов цепочки доверия в соответствующих хранилищах (в простейшем случае - корневого сертификата в хранилище "Доверенные корневые центры сертификации") и\или об отсутствии действительного на момент проверки списка отозванных сертификатов в хранилище "Промежуточные центры сертификации".
2. Не знаю, как работает "КриптоАРМ", но если он использует настройки IE (что вполне вероятно), то в панели управления в "Свойства обозревателя" на вкладке "Дополнительно" отключите галочку "Проверять, не отозван ли сертификат сервера"
Offline Андрей Писарев  
#4 Оставлено : 19 декабря 2011 г. 18:11:29(UTC)
Андрей *

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

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

Сказал «Спасибо»: 537 раз
Поблагодарили: 2176 раз в 1701 постах
если кому интересно в asn1... http://rghost.ru/35488167

сертификат не ГОСТ-овский и т.д.
RSASignatureWithSHA1 и т.п.



Отредактировано пользователем 19 декабря 2011 г. 18:15:28(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#5 Оставлено : 19 декабря 2011 г. 18:19:25(UTC)
Андрей *

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

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

Сказал «Спасибо»: 537 раз
Поблагодарили: 2176 раз в 1701 постах

КриптоАРМ

Произошла ошибка при получении подписей из сообщения

Ошибка сохранения сообщения (0x80004005)

Произошла ошибка при загрузке сообщения.
Вероятно, сообщение имеет некорректный формат. (0x80004005)

Произошла ошибка при загрузке подписанных данных

Произошла ошибка при добавлении данных в сообщение

Указан неправильный алгоритм. (0x80090008) (0x80004005)

ОК

Техническую поддержку оказываем тут
Наша база знаний
Offline haremyak  
#6 Оставлено : 21 декабря 2011 г. 16:06:14(UTC)
haremyak

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

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

нашли проблему и решение: подписывали данные алгоритмом, отличным от указанного в сертификате.

Код:

public byte[] sign(byte[] data) throws Exception {
    /* initialize data to sign with CMS structure */
    CMSTypedData msg = new CMSProcessableByteArray(data);

    /* create CMS signature data builder */
    CMSSignedDataGenerator gen = new CMSSignedDataGenerator();

    /* provide required certificates */
    gen.addCertificates(new JcaCertStore(Arrays.asList(certificate)));

    /* initialize content signer (message digest) */
//    ContentSigner contentSigner = new JcaContentSignerBuilder("SHA256withRSA") // это была бага
//            .setProvider("BC").build(privateKey);
    AlgorithmIdentifier sigAlgId = certificate.getSignatureAlgorithm();
    AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);
    ContentSigner contentSigner = new BcRSAContentSignerBuilder(sigAlgId, digAlgId)
            .build(PrivateKeyFactory.createKey(privateKey.getEncoded()));

    /* initialize digest provider (where to get digest from) */
    DigestCalculatorProvider calculatorProvider = new JcaDigestCalculatorProviderBuilder()
            .setProvider("BC").build();

    /* Cades-bes signed attributes generator */
    CMSAttributeTableGenerator signedGen
            = new CadesBesSignedAttributeTableGenerator(certificate);

    /* force to add cades-bes attributes into CMS structure */
    SignerInfoGenerator signerInfoGenerator = new JcaSignerInfoGeneratorBuilder(calculatorProvider)
            .setSignedAttributeGenerator(signedGen)
            .build(contentSigner, certificate);
    gen.addSignerInfoGenerator(signerInfoGenerator);

    /* sign data */
    CMSSignedData signedData = gen.generate(msg, true);

    /* return signed CMS structure */
    return signedData.getEncoded();
}




При этом используем самописный генератор аттрибутов для Cades-Bes подписи:
Код:

/**
 * Cades-Bes attributes generator
 */
public class CadesBesSignedAttributeTableGenerator extends DefaultSignedAttributeTableGenerator {
    private static final Logger LOG = LoggerFactory.getLogger(CadesBesSignedAttributeTableGenerator.class);

    /**
     * Signer certificate to add into the attributes table
     */
    private final X509CertificateHolder signer;

    /**
     * Signing certificate version
     */
    private final int version;

    /**
     * Creates cades-bes attributes table generator
     *
     * @param signer signer certificate to add into the attributes table
     */
    public CadesBesSignedAttributeTableGenerator(X509CertificateHolder signer) {
        this(signer, 2);
    }

    /**
     * Creates cades-bes attributes table generator
     *
     * @param signer  signer certificate to add into the attributes table
     * @param version (1) to use default signing certificate or (2) to use signing certificate v2
     */
    public CadesBesSignedAttributeTableGenerator(X509CertificateHolder signer, int version) {
        this.signer = signer;
        this.version = version;
    }

    @Override
    protected Hashtable createStandardAttributeTable(Map parameters) {
        @SuppressWarnings({"unchecked"})
        Hashtable<ASN1ObjectIdentifier, Attribute> table = super.createStandardAttributeTable(parameters);

        switch (version) {
            case 1:
                // generate and add signing certificate (v1) into the attributes table
                addSigningCertificate(table);
                break;
            case 2:
                // generate and add signing certificate (v2) into the attributes table
                addSigningCertificateV2(table);
                break;
            default:
                throw new IllegalStateException("unsupported signing certificate version: " + version);
        }

        return table;
    }


    /**
     * Add signing certificate (v1) into the attributes table
     *
     * @param table attributes table to add signing certificate (v1) to
     */
    // IT WORKS!!!
    private void addSigningCertificate(Hashtable<ASN1ObjectIdentifier, Attribute> table) {
        LOG.trace("generate signing certificate v1");

        final IssuerSerial signerSerial = new IssuerSerial(
                new GeneralNames(new GeneralName(signer.getIssuer())),
                new DERInteger(signer.getSerialNumber()));

        ESSCertID essCertid = new ESSCertID(
                getSignerHash("SHA-1"), // sha-1 - required by specification
                signerSerial);

        table.put(PKCSObjectIdentifiers.id_aa_signingCertificate, new Attribute(
                PKCSObjectIdentifiers.id_aa_signingCertificate,
                new DERSet(new SigningCertificate(essCertid))
        ));
    }

    /**
     * Add signing certificate (v2) into the attributes table
     *
     * @param table attributes table to add signing certificate (v2) to
     */
    // IT WORKS TOO!!!
    private void addSigningCertificateV2(Hashtable<ASN1ObjectIdentifier, Attribute> table) {
        LOG.trace("generate signing certificate v2");

        final IssuerSerial signerSerial = new IssuerSerial(
                new GeneralNames(new GeneralName(signer.getIssuer())),
                new DERInteger(signer.getSerialNumber()));

        ESSCertIDv2 essCertid = new ESSCertIDv2(
                // sha-1 - is the only algorithm understanded by cspwrap.exe utility
                new AlgorithmIdentifier(X509ObjectIdentifiers.id_SHA1),
//                new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha512),
                getSignerHash("SHA-1"),
                signerSerial);

        table.put(PKCSObjectIdentifiers.id_aa_signingCertificateV2, new Attribute(
                PKCSObjectIdentifiers.id_aa_signingCertificateV2,
                new DERSet(new SigningCertificateV2(new ESSCertIDv2[]{essCertid}))
        ));
    }

    /**
     * Get hash of signer certificate
     *
     * @param algorithm algorithm to generate hash from the signer certificate
     * @return hash of signer certificate
     */
    private byte[] getSignerHash(String algorithm) {
        try {
            return MessageDigest.getInstance(algorithm).digest(signer.getEncoded());
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}



тему можно закрывать.

Отредактировано пользователем 21 декабря 2011 г. 16:07:50(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.