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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline vas239  
#1 Оставлено : 13 августа 2015 г. 11:01:51(UTC)
vas239

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

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

Сказал(а) «Спасибо»: 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 плагин, то проверка проходит успешно. Подскажите, пожалуйста, что я делаю не так?
Offline Евгений Афанасьев  
#2 Оставлено : 13 августа 2015 г. 11:09:10(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Здравствуйте.
Плагин создает CAdES подпись, может, в этом причина.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
vas239 оставлено 13.08.2015(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.