ITEXT 9 - Unterzeichnung eines PDF mit einem externen Dienst - "Dokument wurde geändert oder beschädigt, nachdem die SigJava

Java-Forum
Anonymous
 ITEXT 9 - Unterzeichnung eines PDF mit einem externen Dienst - "Dokument wurde geändert oder beschädigt, nachdem die Sig

Post by Anonymous »

Ich möchte ein Dokument unter Verwendung einer externen API unterschreiben. Sie können einen Hash Ihres Dokuments an diesen Service senden und einen signierten Hash zurückholen.

Code: Select all

private String generateHash(byte[] content) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA256");
byte[] hash = digest.digest(content);
return Base64.getEncoder().encodeToString(hash);
}
< /code>
So behandle ich die Antwort mit dem Signature Hash: < /p>
byte[] signByte = Base64.getDecoder().decode(stsCallbackDocumentResponse.getSignByte());
< /code>
Nach der Unterzeichnung ist die Signatur ungültig, da "das Dokument nach Anbringen der Signatur geändert oder beschädigt wurde".private byte[] signPdf(byte[] content, byte[] signByte, String reason, String location)
throws GeneralSecurityException, IOException {
ByteArrayInputStream inputStream = new ByteArrayInputStream(content);
PdfReader reader = new PdfReader(inputStream);

StampingProperties stampingProperties = new StampingProperties().useAppendMode();

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PdfSigner signer = new PdfSigner(reader, outputStream, stampingProperties);

// .setFieldName("Signature1");
Rectangle rect = new Rectangle(36, 648, 200, 100);
signer.getSignerProperties().setPageRect(rect).setPageNumber(1);
if (reason != null) {
signer.getSignerProperties().setReason(reason);
}
if (location != null) {
signer.getSignerProperties().setLocation(location);
}

IExternalDigest digest = new BouncyCastleDigest();
IExternalSignature signature = new IExternalSignature() {

@Override
public String getDigestAlgorithmName() {
return DigestAlgorithms.SHA256;
}

@Override
public String getSignatureAlgorithmName() {
return "RSA";
}

@Override
public ISignatureMechanismParams getSignatureMechanismParameters() {
return null;
}

@Override
public byte[] sign(byte[] message) throws GeneralSecurityException {
return signByte;
}
};

StsAccessToken stsAccessToken = stsAccessTokenRepository
.findByApplicationUserId(SecurityUtils.getCurrentUserId());

Certificate[] chain = generateCertificateChain(stsAccessToken.getSigningCertificate().getPemCertificate());

signer.signDetached(digest, signature, chain, null, null, null, 0, PdfSigner.CryptoStandard.CMS);

return outputStream.toByteArray();
}

private Certificate[] generateCertificateChain(String pemCertificate) {
try {
byte[] decodedCert = java.util.Base64.getDecoder()
.decode(pemCertificate.replaceAll("-----\\w+ CERTIFICATE-----", "").replaceAll("\n", ""));
InputStream inputStream = new ByteArrayInputStream(decodedCert);

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

X509Certificate certificate = (X509Certificate) certFactory.generateCertificate(inputStream);

List certificateChain = new ArrayList();
certificateChain.add(certificate);

return certificateChain.toArray(new Certificate[0]);
} catch (Exception e) {
throw new ServiceException(e);
}
}
< /code>
Schließlich erstelle ich ein Dokument aus dem resultierenden Byte [].  < /p>
Ich habe auch versucht, direkt in einem Dokument zu speichern.PdfSigner signer = new PdfSigner(reader, new FileOutputStream("/home/alex/repo/alex.pdf"), stampingProperties);
< /code>
Abhängigkeiten: < /p>
        
com.itextpdf
sign
9.1.0


com.itextpdf
bouncy-castle-adapter
9.1.0

Irgendeine Idee, was ich falsch mache? Das ist, was die API -Dokumentation sagt.

Code: Select all

 1. /api/v1/signature
Body:
- id: unique identifier of the record.
- hashByte: the hash value of the document, encoded (e.g. Base64) to validate data integrity.
- algorithmName: name of the algorithm used to generate the hash (e.g. SHA256).
- docName: name of the document or file for which the hash was calculated.
2. /api/v1/callback
Response:
- id: unique identifier of the record.
- signByte: A digital signature in the form of an array of bytes, encoded in Base64.
< /code>
Ich habe den Code wie folgt aktualisiert, aber die Signatur ist immer noch ungültig.  < /p>
    public void signDocument(DocumentContent documentContent) {
/*
* {
*  "id": documentContent.getId(),
*  "hashByte": generateHash(documentContent.getContent()),
*  "algorithmName": "SHA256",
*  "docName": documentContent.getName()
* }
* send sign request
*/
}

private String generateHash(byte[] content) {
try {
PdfReader reader = new PdfReader(new ByteArrayInputStream(content));
PdfSigner signer = new PdfSigner(reader, new ByteArrayOutputStream(),
new StampingProperties().useAppendMode());
signer.getSignerProperties().setPageRect(new Rectangle(36, 648, 200, 100)).setPageNumber(1);

final HashHolder extracted = new HashHolder();
IExternalSignature hashExtractor = new IExternalSignature() {

@Override
public byte[] sign(byte[] hash) throws GeneralSecurityException {
extracted.hash = hash;
return new byte[0];
}

@Override
public String getDigestAlgorithmName() {
return DigestAlgorithms.SHA256;
}

@Override
public String getSignatureAlgorithmName() {
return "RSA";
}

@Override
public ISignatureMechanismParams getSignatureMechanismParameters() {
return null;
}
};
signer.signDetached(new BouncyCastleDigest(), hashExtractor, getCertificateChain(), null, null, null, 0,
PdfSigner.CryptoStandard.CMS);

MessageDigest messageDigest = MessageDigest.getInstance("SHA256");
byte[] hash = messageDigest.digest(extracted.hash);

return Base64.getEncoder().encodeToString(hash);
} catch (Exception e) {
throw new ServiceException(e);
}
}

public void addCallbackSignatureHash(DocumentContent documentContent) {
try {
byte[] signByte = Base64.getDecoder().decode(getCallbackSignByte());
PdfReader reader = new PdfReader(new ByteArrayInputStream(documentContent.getContent()));

PdfSigner signer = new PdfSigner(reader, new FileOutputStream("/home/alex/repo/alex.pdf"),
new StampingProperties().useAppendMode());
signer.getSignerProperties().setPageRect(new Rectangle(36, 648, 200, 100)).setPageNumber(1);

IExternalSignature signature = new IExternalSignature() {

@Override
public String getDigestAlgorithmName() {
return DigestAlgorithms.SHA256;
}

@Override
public String getSignatureAlgorithmName() {
return "RSA";
}

@Override
public ISignatureMechanismParams getSignatureMechanismParameters() {
return null;
}

@Override
public byte[] sign(byte[] message) throws GeneralSecurityException {
return signByte;
}
};
signer.signDetached(new BouncyCastleDigest(), signature, getCertificateChain(), null, null, null, 0,
PdfSigner.CryptoStandard.CMS);

} catch (Exception e) {
throw new ServiceException(e);
}
}
Was fehlt mir diese Zeit?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post