Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,956 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 701 раз в 662 постах
|
Здравствуйте.
java.lang.IllegalArgumentException: Hash or Sign ERROR:-2146434965 Нет доступа к карте. Введен неправильный PIN-код.
Приведите код, как подписываете.
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 06.07.2015(UTC) Сообщений: 45 Откуда: Москва Сказал(а) «Спасибо»: 5 раз Поблагодарили: 7 раз в 5 постах
|
Я заранее инициализирую кэш с сертификатами и ключами Код: KeyStore ks = KeyStore.getInstance(config.getProperty(Config.SIGN_KEYSTORE_TYPE), config.getProperty(Config.CRYPTO_PROVIDER));
ks.load(null, config.getProperty(Config.SIGNATURE_CREDENTIAL).toCharArray());
Enumeration<String> it = ks.aliases();
while (it.hasMoreElements()) {
String alias = it.nextElement();
X509Certificate certificate = (X509Certificate) ks.getCertificate(alias);
Key key = ks.getKey(alias, config.getProperty(Config.SIGNATURE_CREDENTIAL).toCharArray());
PrivateKey privateKey = null;
if (key != null) {
privateKey = (PrivateKey) key;
}
signAttributesMap.putIfAbsent(alias, new Object[] {certificate, privateKey});
LOGGER.log(Level.INFO, "Alias: " + alias);
}
далее подпись выполняется с использованием ключей и сертификатов из этого кэша Код:Signature signature = Signature.getInstance("GOST3411withGOST3410DHEL", config.getProperty(Config.CRYPTO_PROVIDER));
byte[] sign;
// Формируем контекст подписи формата PKCS7.
final ContentInfo ci = new ContentInfo();
// all.contentType = new Asn1ObjectIdentifier(
// new OID(CMStools.STR_CMS_OID_SIGNED).value);
ci.contentType = new Asn1ObjectIdentifier(
new OID(STR_CMS_OID_SIGNED).value);
final SignedData cms = new SignedData();
ci.content = cms;
cms.version = new CMSVersion(1);
// Идентификатор алгоритма хеширования.
cms.digestAlgorithms = new DigestAlgorithmIdentifiers(1);
// final DigestAlgorithmIdentifier a = new DigestAlgorithmIdentifier(
// new OID(CMStools.DIGEST_OID).value);
final DigestAlgorithmIdentifier digestAlgorithmIdentifier = new DigestAlgorithmIdentifier(
new OID(OID_CMS_DIGEST).value);
digestAlgorithmIdentifier.parameters = new Asn1Null();
cms.digestAlgorithms.elements[0] = digestAlgorithmIdentifier;
// Т.к. подпись отсоединенная, то содержимое отсутствует.
// cms.encapContentInfo = new EncapsulatedContentInfo(
// new Asn1ObjectIdentifier(new OID(CMStools.STR_CMS_OID_DATA).value), null);
cms.encapContentInfo = new EncapsulatedContentInfo(
new Asn1ObjectIdentifier(new OID(STR_CMS_OID_DATA).value), null);
// Добавляем сертификат подписи.
cms.certificates = new CertificateSet(certificateList.size());
cms.certificates.elements = new CertificateChoices[certificateList.size()];
for (int i = 0; i < cms.certificates.elements.length; i++) {
final ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Certificate asnCertificate =
new ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Certificate();
final Asn1BerDecodeBuffer decodeBuffer =
new Asn1BerDecodeBuffer(certificateList.get(i).getEncoded());
asnCertificate.decode(decodeBuffer);
cms.certificates.elements[i] = new CertificateChoices();
cms.certificates.elements[i].set_certificate(asnCertificate);
}
// Добавялем информацию о подписанте.
cms.signerInfos = new SignerInfos(privateKeyList.size());
for (int i = 0; i < cms.signerInfos.elements.length; i++) {
cms.signerInfos.elements[i] = new SignerInfo();
cms.signerInfos.elements[i].version = new CMSVersion(1);
cms.signerInfos.elements[i].sid = new SignerIdentifier();
final byte[] encodedName = certificateList.get(i).getIssuerX500Principal().getEncoded();
final Asn1BerDecodeBuffer nameBuf = new Asn1BerDecodeBuffer(encodedName);
final Name name = new Name();
name.decode(nameBuf);
final CertificateSerialNumber num = new CertificateSerialNumber(
certificateList.get(i).getSerialNumber());
cms.signerInfos.elements[i].sid.set_issuerAndSerialNumber(
new IssuerAndSerialNumber(name, num));
// cms.signerInfos.elements[i].digestAlgorithm =
// new DigestAlgorithmIdentifier(new OID(CMStools.DIGEST_OID).value);
cms.signerInfos.elements[i].digestAlgorithm =
new DigestAlgorithmIdentifier(new OID(OID_CMS_DIGEST).value);
cms.signerInfos.elements[i].digestAlgorithm.parameters = new Asn1Null();
// cms.signerInfos.elements[i].signatureAlgorithm =
// new SignatureAlgorithmIdentifier(new OID(CMStools.SIGN_OID).value);
cms.signerInfos.elements[i].signatureAlgorithm =
new SignatureAlgorithmIdentifier(new OID(OID_CMS_SIGN).value);
cms.signerInfos.elements[i].signatureAlgorithm.parameters = new Asn1Null();
//signedAttributes
cms.signerInfos.elements[i].signedAttrs = new SignedAttributes(4);
//-contentType
int k = 0;
cms.signerInfos.elements[i].signedAttrs.elements[k] =
new Attribute(OID_CMS_ATTR_CONTENT_TYPE.value,
new Attribute_values(1));
final Asn1Type conttype = new Asn1ObjectIdentifier(STR_CMS_OID_DATA.value);
cms.signerInfos.elements[i].signedAttrs.elements[k].values.elements[0] = conttype;
//time Attribute
k += 1;
cms.signerInfos.elements[i].signedAttrs.elements[k] = new Attribute(STR_CMS_OID_SIGN_TYM_ATTR.value, new Attribute_values(1));
Time time = new Time();
// final Asn1GeneralizedTime genTime = new Asn1GeneralizedTime();
// //текущая дата с календаря
// genTime.setTime(Calendar.getInstance());
// time.set_generalTime(genTime);
Asn1UTCTime UTCTime = new Asn1UTCTime();
//текущая дата с календаря
UTCTime.setTime(Calendar.getInstance());
time.set_utcTime(UTCTime);
cms.signerInfos.elements[i].signedAttrs.elements[k].values.elements[0] =
time.getElement();
//--- time Attribute
//-message digest
k += 1;
cms.signerInfos.elements[i].signedAttrs.elements[k] =
new Attribute(STR_CMS_OID_DIGEST_ATTR.value,
new Attribute_values(1));
final byte[] messageDigestBlob;
// Если вместо данных у нас хеш, то сразу его передаем, ничего не вычисляем.
if (isExternalDigest) {
messageDigestBlob = data;
} // if
else {
messageDigestBlob = calculateDigestm(data, "GOST3411", config.getProperty(Config.CRYPTO_PROVIDER));
}
final Asn1Type messageDigest = new Asn1OctetString(messageDigestBlob);
cms.signerInfos.elements[i].signedAttrs.elements[k].values.elements[0] = messageDigest;
if (true) {
// Собственно, аттрибут с OID'ом id_aa_signingCertificateV2.
k += 1;
cms.signerInfos.elements[i].signedAttrs.elements[k] =
new Attribute(new OID(ALL_PKIX1Explicit88Values.id_aa_signingCertificateV2).value,
new Attribute_values(1));
// Идентификатор алгоритма хеширования, который использовался для
// хеширования контекста сертификата ключа подписи.
final DigestAlgorithmIdentifier a =
new DigestAlgorithmIdentifier(new OID(JCP.GOST_DIGEST_OID).value);
// Хеш сертификата ключа подписи.
final CertHash certHash = new CertHash(
calculateDigestm(certificateList.get(i).getEncoded(), "GOST3411", config.getProperty(Config.CRYPTO_PROVIDER)));
// Issuer name из сертификата ключа подписи.
GeneralName generalName = new GeneralName();
generalName.set_directoryName(name);
GeneralNames generalNames = new GeneralNames();
generalNames.elements = new GeneralName[1];
generalNames.elements[0] = generalName;
// Комбинируем издателя и серийный номер.
IssuerSerial issuerSerial = new IssuerSerial(generalNames, num);
ESSCertIDv2 essCertIDv2 =
new ESSCertIDv2(a, certHash, issuerSerial);
_SeqOfESSCertIDv2 essCertIDv2s = new _SeqOfESSCertIDv2(1);
essCertIDv2s.elements = new ESSCertIDv2[1];
essCertIDv2s.elements[0] = essCertIDv2;
// Добавляем сам аттрибут.
SigningCertificateV2 signingCertificateV2 = new SigningCertificateV2(essCertIDv2s);
cms.signerInfos.elements[i].signedAttrs.elements[k].values.elements[0] = signingCertificateV2;
} // if
//signature
Asn1BerEncodeBuffer encBufSignedAttr = new Asn1BerEncodeBuffer();
cms.signerInfos.elements[i].signedAttrs
.encode(encBufSignedAttr);
final byte[] hsign = encBufSignedAttr.getMsgCopy();
signature.initSign(privateKeyList.get(i));
signature.update(hsign);
sign = signature.sign();
cms.signerInfos.elements[i].signature = new SignatureValue(sign);
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,956 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 701 раз в 662 постах
|
Автор: VBurmistrov Key key = ks.getKey(alias, config.getProperty(Config.SIGNATURE_CREDENTIAL).toCharArray()); Попробуйте использовать JCPPrivateKeyEntry entry = (JCPPrivateKeyEntry)keyStore.getEntry(alias, new JCPProtectedParameter(password)) PrivateKey privateKey = entry.getPrivateKey() с заданием пароля вместо getKey. В случае getKey() с JCSP ввод пароля будет осуществлен при обращении к ключу для подписи (в окне или консоли). Отредактировано пользователем 14 ноября 2016 г. 16:39:21(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 06.07.2015(UTC) Сообщений: 45 Откуда: Москва Сказал(а) «Спасибо»: 5 раз Поблагодарили: 7 раз в 5 постах
|
Автор: afev В случае JCSP ввод пароля будет осуществлен при обращении к ключу для подписи (в окне или консоли).
А так, чтобы пароль кэшировался и не нужно было его вводить при каждом обращении, так возможно с JCSP? Можно ли это настроить в CSP по аналогии с Windows версией, где галочка Хранить ключи в памяти приложений
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,956 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 701 раз в 662 постах
|
Автор: afev JCPPrivateKeyEntry entry = (JCPPrivateKeyEntry)keyStore.getEntry(alias, new JCPProtectedParameter(password)) PrivateKey privateKey = entry.getPrivateKey() Этот вариант не подходит? |
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 06.07.2015(UTC) Сообщений: 45 Откуда: Москва Сказал(а) «Спасибо»: 5 раз Поблагодарили: 7 раз в 5 постах
|
Автор: afev Автор: afev JCPPrivateKeyEntry entry = (JCPPrivateKeyEntry)keyStore.getEntry(alias, new JCPProtectedParameter(password)) PrivateKey privateKey = entry.getPrivateKey() Этот вариант не подходит? Спасибо большое! Таким образом есть доступ к ключам, подпись вырабатывается! Проверил на JCP и на Java CSP! Хотя на первый взгляд визуально объект такой же. Правда у меня теперь появился другой вопрос к JCSP - подпись на XML не работает, выдает: Код:org.apache.xml.security.signature.XMLSignatureException: Unsupported method.
Original Exception was java.security.SignatureException: Unsupported method.
Тот же самый метод с провайдером JCP работает, подпись валидируется. Отредактировано пользователем 14 ноября 2016 г. 17:29:49(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,956 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 701 раз в 662 постах
|
Нужен полный стек ошибки. Предположу, что где-то вызывается XXX.getInstance(algorithm) без указания провайдера, при этом ключ - JCSP, а алгоритм, например, подписи - JCP. В getInstance помимо алгоритма должен быть указан провайдер, его реализующий (JCP не создаст подпись с ключом, полученным с помощью JCSP, например, и наоборот). Отредактировано пользователем 14 ноября 2016 г. 17:34:29(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,956 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 701 раз в 662 постах
|
Пожалуй, было бы лучше перенести беседу в портал техподдержки. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 06.07.2015(UTC) Сообщений: 45 Откуда: Москва Сказал(а) «Спасибо»: 5 раз Поблагодарили: 7 раз в 5 постах
|
Автор: afev Нужен полный стек ошибки. Предположу, что где-то вызывается XXX.getInstance(algorithm) без указания провайдера, при этом ключ - JCSP, а алгоритм, например, подписи - JCP. В getInstance помимо алгоритма должен быть указан провайдер, его реализующий (JCP не создаст подпись с ключом, полученным с помощью JCSP, например, и наоборот). Я использую org.apache.xml.security.signature.XMLSignature, там явно провайдер не указываю. Просто поменял местами в java.security security.provider.10=ru.CryptoPro.JCSP.JCSP security.provider.11=ru.CryptoPro.JCP.JCP И все пошло. Спасибо! Да обязательно зарегистрируюсь на портале техподдержки.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 13.02.2017(UTC) Сообщений: 2 Откуда: Краснодар
|
Не получается добавить сертификат в Ubuntu 16.04. Скопировал 6 ключей в папку /var/opt/cprocsp/keys/user/cf77013d.000Команда csptest -keyset -enum_cont -verifycontext -fqcn выдает следующее: Код:
CSP (Type:80) v4.0.9014 KC1 Release Ver:4.0.9842 OS:Linux CPU:AMD64 FastCode:READY:AVX.
AcquireContext: OK. HCRYPTPROV: 14611219
\\.\HDIMAGE\cf77013d-e7t0-4f37-9619-02d404a7j9a5
OK.
Total: SYS: 0,010 sec USR: 0,050 sec UTC: 0,150 sec
[ErrorCode: 0x00000000]
При попытке добавить сертификат certmgr -inst -store uMy -file bc_242087.cer -cont '\\.\HDIMAGE\cf77013d-e7t0-4f37-9619-02d404a7j9a5' выдает ошибку: Код:
Certmgr 1.0 (c) "CryptoPro", 2007-2010.
program for managing certificates, CRLs and stores
Invalid data in file bc_242087.cer
An error occurred while reading or writing to a file.
[ErrorCode: 0x80092003]
В чем может быть проблема? Отредактировано пользователем 13 февраля 2017 г. 16:55:23(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close