Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,963 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Если посмотреть код класса DefaultTimeStampTokenProvider, то в нем есть определение идентификатора алгоритма хеширования, а он, скорее всего, определяется неправильно, либо вообще никак (в списке его нет). Я сделал почти копию этого класса, только добавил свой identifierForDigest: Код:
private String identifierForDigest(String algName) {
return JCP.GOST_DIGEST_OID;
}
Подпись создалась. P.S. Наверно, проще будет использовать JCP.GOST_DIGEST_OID сразу вместо GOST3411. P.P.S. Еще потребуется добавить в ".withAlgorithmsProviderEx(new DefaultAlgorithmsProviderEx() {": Код:
public String getDigestAlgorithmForDataObjsReferences() {
return Consts.URI_GOST_DIGEST;
}
public String getDigestAlgorithmForTimeStampProperties() {
return Consts.URI_GOST_DIGEST;
}
У генератора запроса штампа можно поставить this.tsRequestGenerator.setCertReq(true); - штамп может быть без сертификата службы штампов, тогда придется добавить этот сертификат в доверенные при проверке подписи. Для проверки, по аналогии с реализацией TimeStampVerificationProvider для подписи, потребуется добавить свой класс, реализующий TimeStampVerificationProvider, и снова withDigestEngineProvider(). Отредактировано пользователем 29 мая 2015 г. 16:32:56(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 27.05.2015(UTC) Сообщений: 6
|
На данынй момент не удается сформировать подпись, т.к. ответ от testca.cryptopro.ru содержит статус REJECTION.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 03.06.2015(UTC) Сообщений: 3 Откуда: Астрахань Сказал(а) «Спасибо»: 2 раз
|
Пробовал использовать Ваш фрагмент кода: Автор: eagames-ru Код:
KeyingDataProvider kp = new DirectKeyingDataProvider(secContainer.getCertificate(), secContainer.getKey());
XadesSigningProfile prof = new XadesTSigningProfile(kp)
.withTimeStampTokenProvider(MyTimeStampTokenProvider.class)
.withDigestEngineProvider(new DefaultMessageDigestProvider() {
@Override
public MessageDigest getEngine(String digestAlgorithmURI) throws UnsupportedAlgorithmException {
try {
return MessageDigest.getInstance("GOST3411");
} catch (NoSuchAlgorithmException nsae) {
throw new UnsupportedAlgorithmException(nsae.getMessage(), digestAlgorithmURI, nsae);
}
}
})
.withAlgorithmsProviderEx(new DefaultAlgorithmsProviderEx() {
@Override
public Algorithm getSignatureAlgorithm(String keyAlgorithmName)
throws UnsupportedAlgorithmException {
return new GenericAlgorithm("http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411");
}
@Override
public String getDigestAlgorithmForReferenceProperties() {
return "http://www.w3.org/2001/04/xmldsig-more#gostr3411";
}
});
XadesSigner signer = prof.newSigner();
DataObjectDesc obj = new DataObjectReference(textNodeId);
SignedDataObjects dataObjs = new SignedDataObjects(obj).withDataObjectsTimeStamp();
signer.sign(dataObjs, signedNode);
Код:
class MyTimeStampTokenProvider extends DefaultTimeStampTokenProvider {
@Inject
public MyTimeStampTokenProvider(MessageDigestEngineProvider messageDigestProvider) {
super(messageDigestProvider);
}
@Override
protected String getTSAUrl() {
return "http://testca.cryptopro.ru/tsp/tsp.srf";
}
}
Получаю следующую ошибку: Код:
xades4j.XAdES4jXMLSigException: The requested algorithm http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411 does not exist. Original Message was: null
at xades4j.production.SignerBES.createSignature(SignerBES.java:313)
at xades4j.production.SignerBES.sign(SignerBES.java:159)
at xades4j.production.SignerBES.sign(SignerBES.java:122)
at ru.vkabank.CertificateInitializationData.signBody(CertificateInitializationData.java:158)
at ru.vkabank.SmewMessagesBuilder.writeDocumentSign(SmewMessagesBuilder.java:59)
at ru.vkabank.SmevAlgorithm.createPaymentDocument(SmevAlgorithm.java:119)
at ru.vkabank.SmevAlgorithm.execute(SmevAlgorithm.java:67)
at ru.vkabank.Main.main(Main.java:14)
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:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: org.apache.xml.security.signature.XMLSignatureException: The requested algorithm http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411 does not exist. Original Message was: null
Original Exception was java.lang.NullPointerException
at org.apache.xml.security.algorithms.SignatureAlgorithm.getSignatureAlgorithmSpi(SignatureAlgorithm.java:160)
at org.apache.xml.security.algorithms.SignatureAlgorithm.<init>(SignatureAlgorithm.java:135)
at org.apache.xml.security.algorithms.SignatureAlgorithm.<init>(SignatureAlgorithm.java:106)
at org.apache.xml.security.signature.SignedInfo.<init>(SignedInfo.java:141)
at org.apache.xml.security.signature.XMLSignature.<init>(XMLSignature.java:301)
at xades4j.production.SignerBES.createSignature(SignerBES.java:309)
... 12 more
Не подскажете, как решить проблему с незарегестрированным алгоритмом? Буду очень благодарен
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,963 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Добавьте в начало JCPXMLDSigInit.init(). |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 03.06.2015(UTC) Сообщений: 3 Откуда: Астрахань Сказал(а) «Спасибо»: 2 раз
|
Автор: afev Добавьте в начало JCPXMLDSigInit.init(). Уже пробовал, не помогло. Также пробовал регистрировать через JCEMapper: Код:
JCEMapper.register("http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411",
new JCEMapper.Algorithm("", "GOST3411withGOST3410EL", "Signature"));
Получил ту же ошибку.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 27.05.2015(UTC) Сообщений: 6
|
afev, подскажите, удалось ли выполнить успешно валидацию подписанного сообщения с помощью xades4j?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 04.06.2015(UTC) Сообщений: 10
Поблагодарили: 1 раз в 1 постах
|
Последние несколько дней тестовый стенд ГИС-ГМП начал ругаться на неправильную ЭЦП. Судя по всему они таки включили проверку только по XadES-T..
Кто-нибудь нашел рабочее решение для Java?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 27.05.2015(UTC) Сообщений: 6
|
Добился того, что при валидации получаю ошибку: Certificate must have an ExtendedKeyUsage extension marked as critical. И, действительно, от TSA сервера приходит ответ, где в сертификате Extended Key Usage не помечен как critical. Подскажите, можно ли изменить ли эту настройку на тестовом TSA сервере КриптоПРО (http://testca.cryptopro.ru/tsp/tsp.srf).
Данная проверка происходит внутри бибилиотеки BouncyCastle, и как я понял, выключить ее невозможно, только, если закомментировать в исходниках и пересобирать, что не желательно.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,963 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Сделать расширение критическим, скорее всего, не выйдет. Наверно, придется создать свой экземпляр класса проверки и закомментировать validate (можно сделать свой класс провайдера проверки и скопировать содержимое дефолтного класса из исходников xades4j). P.S. Не подскажете, где можно проверить документ с подписью? Отредактировано пользователем 4 июня 2015 г. 23:12:16(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 27.05.2015(UTC) Сообщений: 6
|
Конкретно validate проходит успешно. Проверить, вроде бы, можно здесь, но у меня не получилось зарегистрироваться. http://212.234.160.9/pub/registration.shtmlПроверку выполняем сами библиотекой xades4j. Сейчас столкнулся с ошибкой xades4j.verification.TimeStampDigestMismatchException: Verification failed for property 'SignatureTimeStamp': input digest and token message imprint mismatch Основной код проверки Код:
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
CertificateValidationProvider cvp = new MyPKIXCertificateValidationProvider(trustAnchors, false);
XadesVerificationProfile instance = new XadesVerificationProfile(cvp);
instance.withDigestEngineProvider(new DefaultMessageDigestProvider() {
@Override
public MessageDigest getEngine(String digestAlgorithmURI) throws UnsupportedAlgorithmException {
try {
return MessageDigest.getInstance("GOST3411");
} catch (NoSuchAlgorithmException nsae) {
throw new UnsupportedAlgorithmException(nsae.getMessage(), digestAlgorithmURI, nsae);
}
}
}).withTimeStampTokenVerifier(new GostTimeStampVerifiecationProvider(cvp, new DefaultMessageDigestProvider() {
@Override
public MessageDigest getEngine(String digestAlgorithmURI) throws UnsupportedAlgorithmException {
try {
return MessageDigest.getInstance("GOST3411");
} catch (NoSuchAlgorithmException nsae) {
throw new UnsupportedAlgorithmException(nsae.getMessage(), digestAlgorithmURI, nsae);
}
}
}));
xadesVerifier = instance.newVerifier();
Node finalPaymentNode = doc.getElementsByTagNameNS("http://roskazna.ru/gisgmp/xsd/116/PaymentInfo", "FinalPayment").item(0);
xadesVerifier.verify((Element) ((Element) finalPaymentNode).getElementsByTagNameNS("http://www.w3.org/2000/09/xmldsig#", "Signature").item(0), null);
классы MyPKIXCertificateValidationProvider и GostTimeStampVerifiecationProvider созданы по аналогии с MyTimeStampTokenProvider
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close