logo
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline Denis1499  
#1 Оставлено : 3 июля 2018 г. 10:59:39(UTC)
Denis1499

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

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

У нас есть приложение, написанное на оутсорсе. Которое шифрует отчеты и отправляет в НБКИ.
До 2018 готом шифровали предоставленным сертификатом от НБКИ, который был сделан
по ГОСТ 2001.

Нам предоставили новый сертификат для шифрования, который выпущен по ГОСТ 2012
и НБКИ теперь не может расшифровать наши отправляемые отчеты.

На руках есть исходный код шифрования файлов. Но непонятно что в нем необходимо исправить.

Использовали для подписи "1.2.643.2.2.19" (GOST_EL_KEY_OID), для генерации ключей "GOST3410DHELEPH",
сейчас пробовал "1.2.643.7.1.1.1.2" (GOST_PARAMS_SIG_2012_512_KEY_OID) и "GOST3410DHEPH_2012_512", а так же 256 битные алгоритмы.

И все равно шифруется неверно. Куда еще можно посмотреть?
Offline Евгений Афанасьев  
#2 Оставлено : 3 июля 2018 г. 11:39:23(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 2,360
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 322 раз в 319 постах
Здравствуйте.
Вы можете сделать пример, воспроизводящий ошибку? Что используется для расшифрования на стороне НБКИ?

Отредактировано пользователем 3 июля 2018 г. 12:20:33(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Denis1499  
#3 Оставлено : 3 июля 2018 г. 12:21:28(UTC)
Denis1499

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

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

Добрый день,
я могу привести только код, как мы шифруем.

Имеет смысл?
Offline Евгений Афанасьев  
#4 Оставлено : 3 июля 2018 г. 12:58:01(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 2,360
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 322 раз в 319 постах
Приведите, посмотрим. Если не сложно, создайте тестовый контейнер, зашифруйте в его адрес и приложите всё (пример, контейнер, сообщение), я попроверяю с помощью jcp и csp.
Техническую поддержку оказываем тут
Наша база знаний
Offline Denis1499  
#5 Оставлено : 3 июля 2018 г. 13:32:22(UTC)
Denis1499

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

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

Шифруем мы следующим образом

Код:

public class EncryptService {

  public byte[] encrypt(X509Certificate recipientCert, Path fileToEncrypt) throws Exception {

    byte[] data = Files.readAllBytes(fileToEncrypt);
    final PublicKey recipientPublic = recipientCert.getPublicKey();

    // Генерирование симметричного ключа с параметрами
    // шифрования из контрольной панели.

    final KeyGenerator kg = KeyGenerator.getInstance(CryptoUtil.GOST28147, CryptoProvider.PROVIDER_NAME);
    final ParamsInterface paramss = AlgIdSpec.getDefaultCryptParams();
    kg.init(paramss);
    final SecretKey simm = kg.generateKey();

    // Зашифрование текста на симметричном ключе.

    Cipher cipher = Cipher.getInstance(CryptoUtil.CIPHER_MODE, CryptoProvider.PROVIDER_NAME);
    cipher.init(Cipher.ENCRYPT_MODE, simm, (SecureRandom) null);

    final byte[] iv = cipher.getIV();
    final byte[] text = cipher.doFinal(data, 0, data.length);

    // Зашифрование симметричного ключа.

    final byte[] keyTransport = wrap(simm, recipientPublic);

    // Формирование CMS-сообщения.

    final ContentInfo all = new ContentInfo();
    all.contentType = new Asn1ObjectIdentifier(new OID(CryptoUtil.STR_CMS_OID_ENVELOPED).value);

    final EnvelopedData cms = new EnvelopedData();

    all.content = cms;
    cms.version = new CMSVersion(0);

    cms.recipientInfos = new RecipientInfos(1);
    cms.recipientInfos.elements = new RecipientInfo[1];
    cms.recipientInfos.elements[0] = new RecipientInfo();

    final KeyTransRecipientInfo keytrans = new KeyTransRecipientInfo();
    keytrans.version = new CMSVersion(0);

    final Asn1BerEncodeBuffer ebuf = new Asn1BerEncodeBuffer();
    
    final SubjectPublicKeyInfo spki = new SubjectPublicKeyInfo();
    final Asn1BerDecodeBuffer dbuff = new Asn1BerDecodeBuffer(
    		recipientPublic.getEncoded());
    spki.decode(dbuff);
    dbuff.reset();

//    final AlgIdInterface algid = new AlgIdSpec(JCP.GOST_EL_KEY_OID);
    final AlgIdInterface algid = new AlgIdSpec(spki.algorithm);
    final AlgorithmIdentifier id = (AlgorithmIdentifier) algid.getDecoded();
    id.encode(ebuf);

    Asn1BerDecodeBuffer dbuf = new Asn1BerDecodeBuffer(ebuf.getMsgCopy());
    keytrans.keyEncryptionAlgorithm = new KeyEncryptionAlgorithmIdentifier();
    keytrans.keyEncryptionAlgorithm.decode(dbuf);

    ebuf.reset();
    dbuf.reset();

    keytrans.rid = new RecipientIdentifier();
    final IssuerAndSerialNumber issuer = new IssuerAndSerialNumber();

    final X500Principal issuerName = recipientCert.getIssuerX500Principal();
    dbuf = new Asn1BerDecodeBuffer(issuerName.getEncoded());

    issuer.issuer = new Name();
    final RDNSequence rnd = new RDNSequence();
    rnd.decode(dbuf);

    issuer.issuer.set_rdnSequence(rnd);
    issuer.serialNumber = new CertificateSerialNumber(recipientCert.getSerialNumber());

    keytrans.rid.set_issuerAndSerialNumber(issuer);
    dbuf.reset();

    keytrans.encryptedKey = new EncryptedKey(keyTransport);
    ebuf.reset();

    cms.recipientInfos.elements[0].set_ktri(keytrans);
    cms.encryptedContentInfo = new EncryptedContentInfo();

    final OID contentType = new OID(CryptoUtil.STR_CMS_OID_DATA);
    cms.encryptedContentInfo.contentType = new ContentType(contentType.value);

    final Gost28147_89_Parameters params = new Gost28147_89_Parameters();
    params.iv = new Gost28147_89_IV(iv);

    params.encryptionParamSet = new Gost28147_89_ParamSet(paramss.getOID().value);
    cms.encryptedContentInfo.contentEncryptionAlgorithm = new ContentEncryptionAlgorithmIdentifier(
            _Gost28147_89_EncryptionSyntaxValues.id_Gost28147_89, params);

    cms.encryptedContentInfo.encryptedContent = new EncryptedContent(text);
    all.encode(ebuf);

    return ebuf.getMsgCopy();
  }


  /**
   * Зашифрование сессионного ключа.
   *
   * @param secretKey    Сессионный ключ.
   * @param recipientKey Открытый ключ получателя.
   * @return транспортная структура GostR3410_KeyTransport.
   * @throws Exception
   */
  private byte[] wrap(SecretKey secretKey, Key recipientKey) throws Exception {

    // Генерация эфемерной пары.

    KeyPairGenerator kgp = KeyPairGenerator.getInstance(
    		JCP.GOST_EPH_DH_2012_512_NAME,
            CryptoProvider.PROVIDER_NAME
    );

    // Устанавливаем нужные параметры, как у получателя.

    GostPublicKey repPublicKey = (GostPublicKey) recipientKey;
    ParamsInterface repPublicKeySpec = repPublicKey.getSpec().getParams();
    kgp.initialize(repPublicKeySpec);

    // Генерируем эфемерную пару.

    KeyPair ephPair = kgp.generateKeyPair();

    PrivateKey privateKey = ephPair.getPrivate();
    PublicKey publicKey = ephPair.getPublic();

    byte[] syncro = new byte[8];
    SecureRandom random = SecureRandom.getInstance(JCP.CP_RANDOM, JCP.PROVIDER_NAME);
    random.nextBytes(syncro);

    IvParameterSpec iv = new IvParameterSpec(syncro);
    OID oid = CryptParamsSpec.OID_Crypt_VerbaO;

    // Выработка ключа согласования.

    KeyAgreement ka = KeyAgreement.getInstance(privateKey.getAlgorithm(), CryptoProvider.PROVIDER_NAME);
    ka.init(privateKey, iv);

    ka.doPhase(recipientKey, true);
    Key dh = ka.generateSecret(CryptoUtil.GOST28147);

    //Зашифрование симметричного ключа на ключе согласования
    // отправителя.

    final Cipher cipher = Cipher.getInstance(CryptoUtil.GOST28147, CryptoProvider.PROVIDER_NAME);
    cipher.init(Cipher.WRAP_MODE, dh, (SecureRandom) null);

    final byte[] wrappedKey = cipher.wrap(secretKey);

    // Упаковка параметров и ключа.

    Gost28147_89_EncryptedKey encryptedKey = new Gost28147_89_EncryptedKey();
    Asn1BerDecodeBuffer decoder = new Asn1BerDecodeBuffer(wrappedKey);
    encryptedKey.decode(decoder);

    byte[] imita = encryptedKey.macKey.value;
    byte[] wrapperKeyBytes = encryptedKey.encryptedKey.value;

    // Кодирование открытого ключа в SubjectPublicKeyInfo.

    byte[] publicKeyBytes = publicKey.getEncoded();
    SubjectPublicKeyInfo publicKeyInfo = new SubjectPublicKeyInfo();

    decoder = new Asn1BerDecodeBuffer(publicKeyBytes);
    publicKeyInfo.decode(decoder);

    // Кодирование GostR3410_KeyTransport.

    GostR3410_KeyTransport keyTransport = new GostR3410_KeyTransport();
    Asn1BerEncodeBuffer encoder = new Asn1BerEncodeBuffer();

    keyTransport.sessionEncryptedKey = new Gost28147_89_EncryptedKey(wrapperKeyBytes, imita);
    keyTransport.transportParameters = new GostR3410_TransportParameters(
            new Gost28147_89_ParamSet(oid.value),
            publicKeyInfo,
            new Asn1OctetString(iv.getIV()));

    keyTransport.encode(encoder);
    return encoder.getMsgCopy();
  }
}


Сигнатуру получаем следующим образом:

Код:

public class SignatureService {

    public byte[] signDetached(Path originalFilePath, PrivateKey privateKey, X509Certificate certificate) throws Exception {
        byte[] data = Files.readAllBytes(originalFilePath);
        Signature signature = Signature.getInstance(JCP.GOST_SIGN_2012_512_NAME);
        signature.initSign(privateKey);
        signature.update(data);
        return createCMSEx(data, signature.sign(), certificate, true);
    }

    public byte[] sign(Path originalFilePath, PrivateKey privateKey, X509Certificate certificate) throws Exception {
        byte[] data = Files.readAllBytes(originalFilePath);
        Signature signature = Signature.getInstance(JCP.GOST_SIGN_2012_512_NAME);
        signature.initSign(privateKey);
        signature.update(data);
        return createCMSEx(data, signature.sign(), certificate, false);
    }

    public byte[] readAndVerify(byte[] bytes, X509Certificate cert) {
        return propagateCatchableException(() -> {
            CMSSignedData data = new CMSSignedData(bytes);
            SignerInformation signer = data.getSignerInfos().getSigners().iterator().next();
            JcaSimpleSignerInfoVerifierBuilder builder = new JcaSimpleSignerInfoVerifierBuilder();
            SignerInformationVerifier verifier = builder.build(cert);
            if (!signer.verify(verifier)) {
                throw new Exception("Data is compromised, wrong signDetached");
            }
            return (byte[]) data.getSignedContent().getContent();
        });
    }

    public byte[] readNotVerify(byte[] bytes) {
        return propagateCatchableException(() -> {
            CMSSignedData data = new CMSSignedData(bytes);
            return (byte[]) data.getSignedContent().getContent();
        });
    }

    private byte[] createCMSEx(byte[] data, byte[] sign, Certificate cert, boolean detached) throws Exception {

        final ContentInfo all = new ContentInfo();
        all.contentType = new Asn1ObjectIdentifier(new OID(CryptoUtil.STR_CMS_OID_SIGNED).value);

        final SignedData cms = new SignedData();
        all.content = cms;
        cms.version = new CMSVersion(1);

        // digest
        cms.digestAlgorithms = new DigestAlgorithmIdentifiers(1);
        final DigestAlgorithmIdentifier a = new DigestAlgorithmIdentifier(new OID(JCP.GOST_DIGEST_2012_512_OID).value);

        a.parameters = new Asn1Null();
        cms.digestAlgorithms.elements[0] = a;

        if (detached) {
            cms.encapContentInfo = new EncapsulatedContentInfo(
                    new Asn1ObjectIdentifier(
                            new OID(CryptoUtil.STR_CMS_OID_DATA).value), null);
        } else {
            cms.encapContentInfo =
                    new EncapsulatedContentInfo(new Asn1ObjectIdentifier(
                            new OID(CryptoUtil.STR_CMS_OID_DATA).value),
                            new Asn1OctetString(data));
        }

        // certificate
        cms.certificates = new CertificateSet(1);
        final ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Certificate certificate = new ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Certificate();
        final Asn1BerDecodeBuffer decodeBuffer = new Asn1BerDecodeBuffer(cert.getEncoded());
        certificate.decode(decodeBuffer);

        cms.certificates.elements = new CertificateChoices[1];
        cms.certificates.elements[0] = new CertificateChoices();
        cms.certificates.elements[0].set_certificate(certificate);

        // signer info
        cms.signerInfos = new SignerInfos(1);
        cms.signerInfos.elements[0] = new SignerInfo();
        cms.signerInfos.elements[0].version = new CMSVersion(1);
        cms.signerInfos.elements[0].sid = new SignerIdentifier();

        final byte[] encodedName = ((X509Certificate) cert).getIssuerX500Principal().getEncoded();
        final Asn1BerDecodeBuffer nameBuf = new Asn1BerDecodeBuffer(encodedName);
        final Name name = new Name();
        name.decode(nameBuf);

        final CertificateSerialNumber num = new CertificateSerialNumber(((X509Certificate) cert).getSerialNumber());
        cms.signerInfos.elements[0].sid.set_issuerAndSerialNumber(new IssuerAndSerialNumber(name, num));
        cms.signerInfos.elements[0].digestAlgorithm = new DigestAlgorithmIdentifier(new OID(JCP.GOST_DIGEST_2012_512_OID).value);
        cms.signerInfos.elements[0].digestAlgorithm.parameters = new Asn1Null();
        cms.signerInfos.elements[0].signatureAlgorithm = new SignatureAlgorithmIdentifier(new OID(JCP.GOST_PARAMS_SIG_2012_512_KEY_OID).value);
        cms.signerInfos.elements[0].signatureAlgorithm.parameters = new Asn1Null();
        cms.signerInfos.elements[0].signature = new SignatureValue(sign);

        // encode
        final Asn1BerEncodeBuffer asnBuf = new Asn1BerEncodeBuffer();
        all.encode(asnBuf, true);
        return asnBuf.getMsgCopy();
    }
}


Это уже адаптированный код мною по ГОСТ 2012, 512 бит.

В атаче исходный файл (данные фейковые) и зашифрованный, что отправляю.

B701FF000000_20100901_164556.zip.enc (3kb) загружен 1 раз(а).

Сертификат НБКИ, наверное, я не имею права выкладывать.
Offline Denis1499  
#6 Оставлено : 3 июля 2018 г. 13:43:27(UTC)
Denis1499

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

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

А сам файл сообщения не прикладывается, zip возможно приложить к сообщению?
Offline Евгений Афанасьев  
#7 Оставлено : 3 июля 2018 г. 14:27:33(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 2,360
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 322 раз в 319 постах
Архив можно прикрепить к сообщению (включить в него зашифр. сообщение, тестовый контейнер, в адрес которого шифровали).
Техническую поддержку оказываем тут
Наша база знаний
Offline Denis1499  
#8 Оставлено : 3 июля 2018 г. 15:17:13(UTC)
Denis1499

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

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

А что такое тестовый контейнер?
Offline Евгений Афанасьев  
#9 Оставлено : 4 июля 2018 г. 8:16:02(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 2,360
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 322 раз в 319 постах
Я имел в виду зашифровать в адрес тестового сертификата, вместо НБКИ, и передать в архиве контейнер, чтобы можно было проверить расшифрование.
Техническую поддержку оказываем тут
Наша база знаний
Offline Denis1499  
#10 Оставлено : 4 июля 2018 г. 11:25:06(UTC)
Denis1499

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

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

Добрый день!

С получением тестового сертификата пока заминка.

А какой командой вы проверяете расшифрование, может я попробую?
Offline Евгений Афанасьев  
#11 Оставлено : 4 июля 2018 г. 12:49:38(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 2,360
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 322 раз в 319 постах
Тестовый контейнер можно выпустить тут - https://cryptopro.ru/certsrv/
Попробую проверить с помощью csptest (команда csptest -sfse), cryptcp нечто подобное поддерживает, примеры из samples.jar (CMS_samples - типа PKCS7EnvEphTransport как с JCP, так и JCSP).
Техническую поддержку оказываем тут
Наша база знаний
Offline Denis1499  
#12 Оставлено : 4 июля 2018 г. 14:56:30(UTC)
Denis1499

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

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

Спасибо!
Буду пробовать.
Offline Kirill1499  
#13 Оставлено : 18 июля 2018 г. 10:32:47(UTC)
Kirill1499

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

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

Afev, добрый день!
Подcкажите, с чем может быть связана данная проблема (мы работаем вместе с топикстартером).
У нас был сертификат от НБКИ от 2017 года, у этого сертификата был Signature algorithm ГОСТ Р 34.11/34.10-2001
В основном методе шифрования мы использовали:
Код:
final AlgIdInterface algid = new AlgIdSpec(JCP.GOST_EL_KEY_OID);

А в методе wrap при генерации эфемерной пары следовательно:
Код:
KeyPairGenerator kgp = KeyPairGenerator.getInstance(JCP.GOST_EL_DH_EPH_NAME, CryptoProvider.PROVIDER_NAME);


После этого нам прислали новый сертификат, у которого Signature algorithm ГОСТ Р 34.11-2012/34.10-2012 512 бит.
После этого наш метод перестал работать. Я хотел бы добавить, что этот метод шифрует и для других КБ сейчас (старый ГОСТ), и для НБКИ раньше шифровал успешно.
Правильно ли мы понимаем, что для нового сертификата по ГОСТу Р 34.11-2012/34.10-2012 512 бит, нам нужно указать какой-то другие параметры в фабричном методе, и всё должно заработать?
В каком направлении мы можем продвинуться?

Отредактировано пользователем 18 июля 2018 г. 10:35:14(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#14 Оставлено : 18 июля 2018 г. 12:22:51(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 2,360
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 322 раз в 319 постах
Здравствуйте.
Для ГОСТ 2012 должен использоваться соответствующий алгоритм в KeyPairGenerator, например, JCP.GOST_EPH_DH_2012_256_NAME. Для algid аналогично может быть использован, например, JCP.GOST_PARAMS_EXC_2012_256_KEY_OID. Дело, скорее всего, не в алгоритме подписи сертификата, а открытом ключе (ГОСТ 2012). У вас стала появляться ошибка на вашей стороне, в коде? Сначала я бы предложил обновить JCP до последней версии, т.к. были исправления.
Техническую поддержку оказываем тут
Наша база знаний
Offline Kirill1499  
#15 Оставлено : 18 июля 2018 г. 13:22:20(UTC)
Kirill1499

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

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

afev, спасибо за оперативный ответ!
Прошу прощёния, конечно public key по новому госту - ГОСТ Р 34.10-2012 256.
Попробовал с новыми параметрами JCP.GOST_EPH_DH_2012_256_NAME/JCP.GOST_PARAMS_EXC_2012_256_KEY_OID из Вашего ответа.
К сожалению ответ от НБКИ такой же Decryption result:FAIL.

В том то и дело, что у нас в коде (они приведён выше), не появляется ошибка. Мы просто говорим, вот файл, зашифруй его этим алогоритмом и отправь.
Со старым сертификатом работало, с новым - нет.
Может быть ещё какие-нибудь параметры можно попробовать для ГОСТ Р 34.10-2012 256?
Offline Евгений Афанасьев  
#16 Оставлено : 18 июля 2018 г. 13:31:15(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 2,360
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 322 раз в 319 постах
Попробуйте заменить CryptParamsSpec.OID_Crypt_VerbaO на CryptParamsSpec.OID_Gost28147_89_Rosstandart_TC26_Z_ParamSet и обновить JCP.
Техническую поддержку оказываем тут
Наша база знаний
Offline Kirill1499  
#17 Оставлено : 23 июля 2018 г. 9:45:09(UTC)
Kirill1499

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

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

Добрый день!
По вашей рекомендации обновились с jcp-2.0.39738, на версию jcp-2.0.38481.
Получаем такую ошибку, старая версия без проблем доставала сертификат по имени из контейнера.
Код:
public abstract Certificate engineGetCertificate(String alias);

Все сертификаты контейнера я вывожу в лог.
Там есть мой сертификат, jcp-2.0.39738 его достаёт без проблем, jcp-2.0.38481 нет.
Контейнер один и тот же, подскажите, в чём может быть проблема?

Отредактировано пользователем 23 июля 2018 г. 9:46:31(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#18 Оставлено : 23 июля 2018 г. 10:03:14(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 2,360
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 322 раз в 319 постах
Добрый день.
Не могли бы вы привести стек ошибки?
Последняя версия jcp - 2.0.39738
Техническую поддержку оказываем тут
Наша база знаний
Offline Kirill1499  
#19 Оставлено : 23 июля 2018 г. 10:36:28(UTC)
Kirill1499

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

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

Спасибо за оперативность.
Стек ошибки - банальное NPE, которого не было на прошлой версии.
Код:
13:05:47.089 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ---gost cert store path (in directory): D:/nbki_new
13:05:47.089 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ---gost cert store certificates----
Jul 23, 2018 1:05:47 PM ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 2.0.39738
Jul 23, 2018 1:05:47 PM ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
13:05:47.964 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ---alias: le-dasdasd-8428-4e2f-88eb-dasfa4basfb8a
13:05:47.964 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ---alias: cpcacer3
13:05:47.964 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ---alias: root.cer
13:05:47.964 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ---alias: cpcacer2
13:05:47.964 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ---alias: cpcacer1
13:05:47.964 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ---alias: cpcacer0
13:05:47.965 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ---alias: cacer.cer
13:05:47.965 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ---alias: оператор нбки - 2018.cer
13:05:47.965 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ---alias: ivanov.cer
13:05:47.965 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ---alias: cpcacer5
13:05:47.965 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ---alias: cpcacer4
13:05:47.965 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ------------------------------------
Jul 23, 2018 1:05:48 PM ru.CryptoPro.ssl.cl_38 <init>
INFO: %% adding as private keys %%
13:05:48.110 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ----not gost cert store path: /D:/Source/my-app/out/test/resources/cer/store/non_gost.jks
13:05:48.111 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ----not gost cert store certificates---
13:05:48.111 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ---alias: _qiwi_com
13:05:48.111 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ---alias: 1
13:05:48.111 [main] INFO  o.occ.my-app.jcp.KeyStoreService - ----------------------------------------
Jul 23, 2018 1:05:48 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: SSLContextImpl init.
Jul 23, 2018 1:05:48 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: trigger seeding of SecureRandom
Jul 23, 2018 1:05:48 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: done seeding SecureRandom
Jul 23, 2018 1:05:48 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: SSLContextImpl initialized.

java.lang.NullPointerException
	at org.occ.my-app.jcp.SignatureService.createCMSEx(SignatureService.java:110)
	at org.occ.my-app.jcp.SignatureService.signDetached(SignatureService.java:45)
	at org.occ.my-app.service.NbkiReportingService.sign(NbkiReportingService.java:146)
	at org.occ.my-app.service.NbkiReportingService.encrypt(NbkiReportingService.java:128)
	at org.occ.my-app.service.NbkiReportingService.sendReport(NbkiReportingService.java:80)
	at org.occ.my-app.service.NbkiReportingServiceTest.testSendReport(NbkiReportingServiceTest.java:50)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:254)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:193)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)


Как видно из логов, у меня один из сертификатов под именем ivanov.cer

Список сертификатов выводит следующий код:
Код:
		logDebug("---gost cert store certificates----");
		gostCertStore.load(getResourceorFileAsStream(gostCertPath), GOST_STORE_PASSWORD.toCharArray());
		if (isDebugEnabled()) {
			Enumeration<String> en = gostCertStore.aliases();
			while (en.hasMoreElements()) {
				logDebug("---alias: " + en.nextElement());
			}
			logDebug("------------------------------------");
		}


Дальше я хочу получить в службе этот сертификат по имени
Код:
X509Certificate senderCertificate = keyStoreService.getCertificate(ezaemCertAlias);

Проваливамся дальше.
Код:
public X509Certificate getCertificate(String alias) throws Exception {
 return (X509Certificate) gostCertStore.getCertificate(alias);
}

Ещё дальше:
Код:
public final Certificate getCertificate(String alias) throws KeyStoreException {
 if (!initialized) {
    throw new KeyStoreException("Uninitialized keystore");
 }
 return keyStoreSpi.engineGetCertificate(alias);
}


Ну дальше абстрактый метод:
Код:
public abstract Certificate engineGetCertificate(String alias);


Если я правильно понимаю, дальше идёт реализация от JCP.
NPE У меня падает, когда я вызываю метод cert.getEncoded() на нулевом объекте, который не удалось достать из хранилища.
С предыдущей версией JCP этот код не вызывал NPE.

Возможно я видел ошибку при дебаге, когда он перечисляет сертификаты, он их берёт из указанного store D:/nbki_new, а уже метод engineGetCertificate(String alias) лезет в какое-то D:/default_Store (или как-то так). Это лишь личное предположение, да и в предыдущей версии такой ошибки не возникает (установил себе 2 JDK c 2 версиями JCP).
Offline Евгений Афанасьев  
#20 Оставлено : 23 июля 2018 г. 11:08:48(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 2,360
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 322 раз в 319 постах
gostCertStore - это, как я понимаю (судя по load с параметрами), хранилище сертификатов формата CertStore? Не могли бы вы в отладке посмотреть список сертификатов в gostCertStore.spi, есть ли в нем ivanov? Если возможно, приложите хранилище сертификатов здесь или пришлите на afevma at cryptopro.ru, спасибо (с подобной проблемой не сталкивались).
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.