Java Itext 5 Неверная подпись при внешней подписании через makeignature.signeferredJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Java Itext 5 Неверная подпись при внешней подписании через makeignature.signeferred

Сообщение Anonymous »

Я использую iText 5 Java для внешнего подписания. Сначала я создаю внешний вид подписи, вычисляю хэш для подписанных атрибутов и оставляю пустое место для подписи. Позже, когда я получаю подписанный хэш от клиента, я вставляю его в PDF через makeignature.signeferred .
Но читатель PDF показывает подпись как недействительную. Жалоба, PDF был изменен.

Здесь Код используется для подписания. Я удалил много функционирующего кода, чтобы сохранить код на основе предметов первой необходимости.import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import com.itextpdf.text.pdf.security.*;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;

import java.io.*;
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class MklTest {
static String thisHash;

static class MyExternalSignatureContainer implements ExternalSignatureContainer {
protected byte[] sig;
public MyExternalSignatureContainer(byte[] sig) {
this.sig = sig;
}
public byte[] sign(InputStream is) {
return sig;
}

@Override
public void modifySigningDictionary(PdfDictionary signDic) {
}
}

static class EmptyContainer implements ExternalSignatureContainer {
public EmptyContainer() {
}
public byte[] sign(InputStream is) {
ExternalDigest digest = hashAlgorithm1 -> DigestAlgorithms.getMessageDigest(hashAlgorithm1, null);
try {
byte[] hash = DigestAlgorithms.digest(is, digest.getMessageDigest("SHA256"));

thisHash = Hex.encodeHexString(hash);

return new byte[0];
} catch (IOException | GeneralSecurityException e) {
throw new RuntimeException(e);
}
}

@Override
public void modifySigningDictionary(PdfDictionary pdfDictionary) {
pdfDictionary.put(PdfName.FILTER, PdfName.ADOBE_PPKMS);
pdfDictionary.put(PdfName.SUBFILTER, PdfName.ADBE_PKCS7_DETACHED);
}
}

public static String emptySignature(String src, String dest, String fieldname, Certificate[] chain) throws IOException, DocumentException, GeneralSecurityException {
PdfReader reader = new PdfReader(src);
FileOutputStream os = new FileOutputStream(dest);
PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');

Calendar cal = GregorianCalendar.getInstance();
cal.add(Calendar.MINUTE, 10);

PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, fieldname);
appearance.setCertificate(chain[0]);
appearance.setReason("Nice");
appearance.setLocation("Delhi");
appearance.setSignDate(cal);

ExternalSignatureContainer external = new EmptyContainer();
MakeSignature.signExternalContainer(appearance, external, 8192);

os.close();
reader.close();

return thisHash;
}

public static Certificate getCert() throws CertificateException {
String cert = ""; // the cert we get from client
ByteArrayInputStream userCertificate = new ByteArrayInputStream(Base64.decodeBase64(cert));

CertificateFactory cf = CertificateFactory.getInstance("X.509");

return cf.generateCertificate(userCertificate);
}

private static ExternalDigest getDigest() {
return new ExternalDigest() {
public MessageDigest getMessageDigest(String hashAlgorithm)
throws GeneralSecurityException {
return DigestAlgorithms.getMessageDigest(hashAlgorithm, null);
}
};
}

public static void createSignature(String src, String dest, String fieldname, byte[] signature) throws IOException, DocumentException, GeneralSecurityException {
PdfReader reader = new PdfReader(src);
FileOutputStream os = new FileOutputStream(dest);
ExternalSignatureContainer external = new MyExternalSignatureContainer(signature);
MakeSignature.signDeferred(reader, fieldname, os, external);

reader.close();
os.close();
}

public static void main(String[] args) throws Exception {
Certificate cert = getCert();
Certificate[] chain = {cert};

String src = "/home/spooderman/Downloads/sample.pdf";
String between = "/tmp/sample_out_between.pdf";
String dest = "/tmp/sample_out.pdf";
String fieldName = "sign";

String hash = emptySignature(src, between, fieldName, chain);

String signature = ""; // signed hash signature we get from client
byte[] signatureBytes = Hex.decodeHex(signature.toCharArray());

PdfPKCS7 sgn = new PdfPKCS7(null, chain, "SHA256", null, getDigest(), false);
sgn.setExternalDigest(signatureBytes, null, "RSA");

byte[] data = sgn.getEncodedPKCS7(Hex.decodeHex(hash.toCharArray()),null, null, null, MakeSignature.CryptoStandard.CMS);

createSignature(between, dest, fieldName, data);
}
}
< /code>
Это исходный pdf. < /p>
Это PDF с пустой подписью. < /p>
Это PDF с окончательной подписью. < /P>
Рассчитанный хэш для PDF. < /P>
954927c9286320e904920b0bf12f7cad387c1a9afd5a92314960a1083593f7dc
< /code>
Это подписанная хеш -подпись, которую я получил от клиента. < /p>
6c14b965c7e90c3134653a9261b0666dce7a7e28cb605fc3152ad111fa7915a77396799357daf1d37c52163ce6d34bfd96ee743e721b45e929f6d8aced144f094d03dce00f25c6c1fc5aa63c92322780f7de675c194ef17303a643055dbbedfec9d5200994fcdfc3ad9488d568ad3f6cd2d262e360a79ad90b5ffb188723de559f3696dcb223930f842172e4838f7d5e6a44494ced54bca54ed12133ea189d616a10039a222ce61885ad98b8ba0bd83d63b887e2c188ca10bd2f53f92f08c5585b9826553280c19976a0ba29f7789ad6a80010b4a6431d3b6bb8f27999b23d3739de03db6db8ab46acaf38b33bd37a74465744c3f95a093deff26cb44b45e27e
< /code>
Я пробовал много вещей, найденных на Stackoverflow, но проблема остается прежней. Любая помощь в правильном направлении будет действительно оценена.>

Подробнее здесь: https://stackoverflow.com/questions/675 ... -signdefer
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Ошибка при подписании нескольких полей подписи с помощью ITEXT C#
    Anonymous » » в форуме C#
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Ошибка при подписании нескольких полей подписи с помощью ITEXT C#
    Anonymous » » в форуме C#
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Неверная подпись JWT в коде C# и на веб-сайте JWT.io. Проверьте подпись, выполнив следующие действия.
    Anonymous » » в форуме C#
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous
  • Неверная подпись: предоставленная подпись не соответствует
    Anonymous » » в форуме Php
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Неверная подпись: предоставленная подпись не соответствует
    Anonymous » » в форуме Php
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»