Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.02.2015(UTC) Сообщений: 37 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Санкт-Петербург Сказал(а) «Спасибо»: 7 раз
|
Здравствуйте!
Я подписываю документ (отсоединенная подпись: detached=true), используя код из примера (версия jcp - 1.0.54):
public static byte[] createHashCMS(final byte[] buffer, final KeyStoreHolder holder, final boolean detached) throws Exception { X509Certificate cert = holder.getCert(); assert cert != null : "No certificate found";
final ContentInfo all = new ContentInfo(); all.contentType = new Asn1ObjectIdentifier( new OID(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(DIGEST_OID).value); a.parameters = new Asn1Null(); cms.digestAlgorithms.elements[0] = a; if (detached) cms.encapContentInfo = new EncapsulatedContentInfo( new Asn1ObjectIdentifier( new OID(STR_CMS_OID_DATA).value), null); else cms.encapContentInfo = new EncapsulatedContentInfo(new Asn1ObjectIdentifier( new OID(STR_CMS_OID_DATA).value), new Asn1OctetString(buffer)); // 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 = cert.getIssuerX500Principal() .getEncoded(); final Asn1BerDecodeBuffer nameBuf = new Asn1BerDecodeBuffer(encodedName); final Name name = new Name(); name.decode(nameBuf);
final CertificateSerialNumber num = new CertificateSerialNumber( cert.getSerialNumber()); cms.signerInfos.elements[0].sid.set_issuerAndSerialNumber( new IssuerAndSerialNumber(name, num)); cms.signerInfos.elements[0].digestAlgorithm = new DigestAlgorithmIdentifier(new OID(DIGEST_OID).value); cms.signerInfos.elements[0].digestAlgorithm.parameters = new Asn1Null(); cms.signerInfos.elements[0].signatureAlgorithm = new SignatureAlgorithmIdentifier(new OID(SIGN_OID).value); cms.signerInfos.elements[0].signatureAlgorithm.parameters = new Asn1Null();
//signedAttributes final int kmax = 3; cms.signerInfos.elements[0].signedAttrs = new SignedAttributes(kmax);
//-contentType int k = 0; cms.signerInfos.elements[0].signedAttrs.elements[k] = new Attribute(new OID(STR_CMS_OID_CONT_TYP_ATTR).value, new Attribute_values(1));
final Asn1Type conttype = new Asn1ObjectIdentifier( new OID(STR_CMS_OID_DATA).value);
cms.signerInfos.elements[0].signedAttrs.elements[k].values.elements[0] = conttype;
//-Time k += 1; cms.signerInfos.elements[0].signedAttrs.elements[k] = new Attribute(new OID(STR_CMS_OID_SIGN_TYM_ATTR).value, new Attribute_values(1));
final Time time = new Time(); final Asn1UTCTime utcTime = new Asn1UTCTime(); //текущая дата с календаря utcTime.setTime(Calendar.getInstance()); time.set_utcTime(utcTime);
cms.signerInfos.elements[0].signedAttrs.elements[k].values.elements[0] = time.getElement();
//-message digest k += 1; cms.signerInfos.elements[0].signedAttrs.elements[k] = new Attribute(new OID(STR_CMS_OID_DIGEST_ATTR).value, new Attribute_values(1)); final byte[] messagedigestb; if (detached) messagedigestb = makeDigest(buffer, DIGEST_ALG_NAME); else messagedigestb = makeDigest(cms.encapContentInfo.eContent.value, DIGEST_ALG_NAME); final Asn1Type messagedigest = new Asn1OctetString(messagedigestb);
cms.signerInfos.elements[0].signedAttrs.elements[k].values.elements[0] = messagedigest;
//signature final PrivateKey key = holder.getPrivateKey(); final Signature signature = Signature.getInstance(JCP.GOST_EL_SIGN_NAME); byte[] sign;
Asn1BerEncodeBuffer encBufSignedAttr = new Asn1BerEncodeBuffer(); cms.signerInfos.elements[0].signedAttrs.encode(encBufSignedAttr); final byte[] hsign = encBufSignedAttr.getMsgCopy(); signature.initSign(key); signature.update(hsign); sign = signature.sign(); cms.signerInfos.elements[0].signature = new SignatureValue(sign); // encode final Asn1BerEncodeBuffer asnBuf = new Asn1BerEncodeBuffer(); all.encode(asnBuf, true); byte[] msgCopy = asnBuf.getMsgCopy(); return msgCopy; }
Метод срабатывает без ошибок. Но если полученную подпись проверить на гос услугах (https://www.gosuslugi.ru/pgu/eds/), то результат - "подпись не верна". Если подписываю этим же сертификатом через КриптоПро CSP плагин, то проверка проходит успешно. Подскажите, пожалуйста, что я делаю не так?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Здравствуйте. Плагин создает CAdES подпись, может, в этом причина. |
|
![thanks](/forum2/Themes/soclean/heart_small.png) 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
vas239 оставлено 13.08.2015(UTC)
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close