Возвращает ошибку подписи для документа с валидной подписью. Исходный файл подписи и документ
имеют валидную подпись согласно проверке на сайте
http://www.gosuslugi.ru/pgu/eds/orderДокумент, который подписан - это xml файл, но подписывается как бинарный.
Environment:
JCP - version 1.0.54
JRE - Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
OS - Ubuntu Linux 12.04.4 LTS (64bit)
Код:
Код:
private void checkSign() throws Exception {
final ContentInfo all = new ContentInfo();
all.decode(new Asn1BerDecodeBuffer(getSignatureBinaryFile()));
final SignedData cms = (SignedData) all.content;
final Asn1BerEncodeBuffer encBuf = new Asn1BerEncodeBuffer();
cms.certificates.elements[0].encode(encBuf);
final CertificateFactory cf = CertificateFactory.getInstance("X.509");
final X509Certificate cert = (X509Certificate) cf.generateCertificate(encBuf.getInputStream());
byte[] text = getFileContent(doc_filename, false);
CMS.CMSVerify2(cms, cert, text);
System.exit(0);
}
Метод CMS.CMSVerify2 возвращает ошибку "Invalid signature". Этот метод взят из примера и косметически изменен.
Код:
public static void CMSVerify2(final SignedData cms, Certificate cert, byte[] data) throws Exception {
int i;
if (cms.version.value != 1) {
throw new Exception("Incorrect version");
}
if (!new OID(CMStools.STR_CMS_OID_DATA).eq(cms.encapContentInfo.eContentType.value)) {
throw new Exception("Nested not supported");
}
byte[] text = null;
if (data != null) {
text = data;
} else if (cms.encapContentInfo.eContent != null) {
text = cms.encapContentInfo.eContent.value;
}
if (text == null) {
throw new Exception("No content");
}
OID digestOid = null;
DigestAlgorithmIdentifier a = new DigestAlgorithmIdentifier(new OID(CMStools.DIGEST_OID).value);
for (i = 0; i < cms.digestAlgorithms.elements.length; i++) {
if (cms.digestAlgorithms.elements[i].algorithm.equals(a.algorithm)) {
digestOid = new OID(cms.digestAlgorithms.elements[i].algorithm.value);
break;
}
}
if (digestOid == null) {
throw new Exception("Unknown digest");
}
int pos = -1;
for (i = 0; i < cms.certificates.elements.length; i++) {
final Asn1BerEncodeBuffer encBuf = new Asn1BerEncodeBuffer();
cms.certificates.elements[i].encode(encBuf);
final byte[] in = encBuf.getMsgCopy();
if (Arrays.equals(in, cert.getEncoded())) {
System.out.println("Certificate: " + ((X509Certificate) cert).getSubjectDN());
pos = i;
break;
}
}
if (pos == -1) {
throw new Exception("Not signed on certificate.");
}
final SignerInfo info = cms.signerInfos.elements[pos];
if (info.version.value != 1) {
throw new Exception("Incorrect version");
}
if (!digestOid.equals(new OID(info.digestAlgorithm.algorithm.value))) {
throw new Exception("Not signed on certificate.");
}
final byte[] sign = info.signature.value;
// check
final Signature signature = Signature.getInstance(JCP.GOST_EL_SIGN_NAME);
signature.initVerify(cert);
signature.update(text);
final boolean checkResult = signature.verify(sign);
if (checkResult) {
CMStools.logger.info("Valid signature");
} else {
CMStools.logger.info("INVALID signature");
}
//return text;
}
Во втором методе в конце
final boolean checkResult = signature.verify(sign);
возвращает false.
Вывод такой:
Certificate: STREET=ул. Бражкина 7, CN=ООО Сивушный дом, GIVENNAME=Максимка Спиртович, SURNAME=Краснов, C=RU, ST=77 г. Москва, L=Москва, O=ООО Сивушный дом, OU=Отдел самогоноварения, T=Директор, OID.1.2.643.100.1=#120D36363433343137343733353631, OID.1.2.643.100.3=#120B3030303030303030303030, OID.1.2.643.3.131.1.1=#120C303039363731333433373731, EMAILADDRESS=info@astralnalog.ru
Jan 28, 2014 12:59:44 PM ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 1.0.54 36641
Jan 28, 2014 12:59:44 PM ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
Jan 28, 2014 12:59:44 PM leradata.dsf.CMS CMSVerify2
INFO: INVALID signature
Можете подсказать, в какую сторону дальше смотреть? Код примера в библиотеке
говорит, что подпись invalid, проверка на сайте дает положительный результат.
Что значит, что родпись в порядке.
Файл подписи:
https://dl.dropboxuserco....com/u/23011347/sign.binДокумент:
https://dl.dropboxuserco...23011347/signed_data.xmlСкриншот проверки подписи на сайте:
https://dl.dropboxuserco...1347/sign_screenshot.pngОтредактировано пользователем 28 января 2014 г. 15:06:20(UTC)
| Причина: Не указана