Статус: Новичок
Группы: Участники
Зарегистрирован: 29.03.2018(UTC) Сообщений: 3 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png)
|
Всем, доброго времени суток. Проблема возможно не нова, но однозначного ответа найти я не смог. Я создаю отделенную подпись через плагин, на вход подается чистая строка (данные не кодированы): Код:signDataAll: function (config) {
var oStore;
var res = {
success: false,
data: config.content
};
try {
oStore = this.createObject("CAPICOM.store");
oStore.Open();
} catch (e) {
res.error = "Ошибка при открытии хранилища: " + this.getErrorMessage(e);
return res;
}
var oCerts = oStore.Certificates.Find(this.CAPICOM_CERTIFICATE_FIND_TYPE.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, config.thumbprint);
if (oCerts.Count === 0) {
return "Не найден сертификат";
}
var oCert = oCerts.Item(1);
/*try {
var oSigner = this.createObject("CAdESCOM.CPSigner");
oSigner.Certificate = oCert;
} catch (e) {
res.error = "Ошибка при создания объекта для подписи: " + this.getErrorMessage(e);
return res;
} */
//var oSignedData = this.createObject("CAdESCOM.CadesSignedData");
for (var i = 0; i < res.data.length; i++) {
try {
var oSigner = this.createObject("CAdESCOM.CPSigner");
oSigner.Certificate = oCert;
} catch (e) {
res.error = "Ошибка при создания объекта для подписи: " + this.getErrorMessage(e);
return res;
}
var oSignedData = this.createObject("CAdESCOM.CadesSignedData");
if (res.data[i].dataToSign) {
oSignedData.Content = res.data[i].dataToSign;
oSignedData.ContentEncoding = this.CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BINARY;
if (config.tsaAddress) {
oSigner.TSAAddress = config.tsaAddress;
}
oSigner.Options = config.options || this.CAPICOM_CERTIFICATE_INCLUDE_OPTION.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN;
if (Ext.isArray(config.attributes)) {
Ext.Array.each(config.attributes, function (value) {
var oAttr = this.createObject("CADESCOM.CPAttribute");
oAttr.Name = value.name;
if (Ext.isDate(value.value))
oAttr.Value = this.convertDate(value.value);
else
oAttr.Value = value.value;
oSigner.AuthenticatedAttributes2.Add(oAttr);
}, this);
}
try {
res.data[i].signature = oSignedData.SignCades(oSigner, config.cadesType || this.CADESCOM_CADES_TYPE.CADESCOM_CADES_BES, config.detached || false);
res.data[i].dataToSign = oSignedData.Content;
}
catch (e) {
res.error = "Не удалось создать подпись из-за ошибки: " + this.getErrorMessage(e);
return res;
}
} else {
res.error = "Не указаны данные для подписания";
return res;
}
}
oStore.Close();
res.success = true;
return res;
}
проверку осуществляю следующим образом Код:verifyAll: function (config) {
var res = {
success: false,
data: config.content
};
//var oSignedData = this.createObject("CAdESCOM.CadesSignedData");
for (var i = 0; i < res.data.length; i++) {
var oSignedData = this.createObject("CAdESCOM.CadesSignedData");
try {
oSignedData.Content = res.data[i].dataToVerify;
oSignedData.ContentEncoding = this.CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BINARY;
/*originalSignedData dataToVerify*/
oSignedData.VerifyCades(res.data[i].signature, config.cadesType, config.detached || false);
res.data[i].signers = this.getSignersArray(oSignedData.Signers);
res.data[i].status = 'Действительна';
} catch (e) {
res.data[i].status = 'Недействительна';
res.data[i].error = "Не удалось проверить подпись из-за ошибки: " + this.getErrorMessage(e);
//return res;
}
}
res.success = true;
return res;
}
отделенную подпись сохраняю в БД. Все прекрасно работает. Но не могу проверить подпись с помощью JCP, код следующий: Код:public static String verifyCAdESSignature(String dataSource, String signature
, SignatureType signatureType) throws IOException {
InputStream dataSourceStream = new ByteArrayInputStream(dataSource.getBytes(StandardCharsets.UTF_8));
InputStream cadesCmsStream = new ByteArrayInputStream(signature.getBytes());
try {
verifyCAdESSignature(dataSourceStream, cadesCmsStream, signatureType);
} finally {
dataSourceStream.close();
cadesCmsStream.close();
}
return null;
}
Код:public static String verifyCAdESSignature(InputStream dataSource, InputStream signature
, SignatureType signatureType) {
try {
CAdESSignature cadesSignature = new CAdESSignature(signature,
dataSource, null);
cadesSignature.verify(null);
printSignatureInfo(cadesSignature);
CAdESSigner[] signers = cadesSignature.getCAdESSignerInfos();
printCAdESSignersInfo(signers);
} catch (Exception e) {
printCAdESException(e);
}
return null;
}
Каждый раз получаю ошибку Unexpected object reading content. (-2). Подскажите, что я делаю не так ?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Здравствуйте. Из base64 декодируете? |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 29.03.2018(UTC) Сообщений: 3 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png)
|
Добрый день. Подпись ? Нет на момент написания поста не декодировал. Затем вставил: Код: InputStream dataSourceStream = new ByteArrayInputStream(dataSource.getBytes(StandardCharsets.UTF_8));
InputStream cadesCmsStream = new ByteArrayInputStream(org.bouncycastle.util.encoders.Base64.decode(signature.getBytes()));
Данная ошибка пропала, но появился ряд новых, а именно can't create content verifier: Error constructing implementation (algorithm: GOST3411withGOST3410EL, provider: JCP, class: ru.CryptoPro.JCP.Sign.GostElSign) (8) это при первой попытке проверить. SelfTester Error: some test crashed twice in a row, usage of JCP is no longer available (-2) при всех последующих до перезагрузки всей машины. Что именно я делаю не так ? Отредактировано пользователем 30 марта 2018 г. 14:42:44(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Jcp установлен штатным способом под управлением учетной записи администратора? |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 29.03.2018(UTC) Сообщений: 3 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png)
|
Да но как оказалось я ставил пакет от jcsp, после переустановки на обычный jcp проблема с can't create content verifier: Error constructing implementation (algorithm: GOST3411withGOST3410EL, provider: JCP, class: ru.CryptoPro.JCP.Sign.GostElSign) (8) и SelfTester Error: some test crashed twice in a row, usage of JCP is no longer available (-2) Решилась. Но возникла следующая, при попытке проверить подпись получаю: org.bouncycastle.cms.CMSSignerDigestMismatchException: message-digest attribute value does not match calculated value, errors: 'Signature is invalid' (8) Я так понимаю, это потому, что подписываю и проверяю подпись на стороне плагина в кодировке по умолчанию. Что мне нужно сделать на стороне jcp, чтобы проверка подписи происходила корректно ? Подпись отделенная. На вход приходит обычная строка как в плагин так и в jcp. Код:try {
CAdESSignature cadesSignature = new CAdESSignature(signature,
dataSource, CAdESType.CAdES_BES);
cadesSignature.verify(null);
printSignatureInfo(cadesSignature);
CAdESSigner[] signers = cadesSignature.getCAdESSignerInfos();
printCAdESSignersInfo(signers);
} catch (Exception e) {
printCAdESException(e);
}
Сертификаты встроены в подпись, но вот список ото званых сертификатов походу нужно все же подать на вход.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Возможно, причина ошибки в этом: http://cpdn.cryptopro.ru...s/content-encoding.html:Код:
При использовании КриптоПро ЭЦП Browser plug-in данные, переданные при создании подписи, будут перекодированы в UCS-2 little endian и именно в таком виде данные будут подписаны. Это сделано для совместимости с теми ЭП, которые были созданы в Internet Explorer с использованием CAPICOM.
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close