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.
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);
}
}
[url=viewtopic.php?t=14917]Ich möchte[/url] 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]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; }
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
[/code] Irgendeine Idee, was ich falsch mache? Das ist, was die API -Dokumentation sagt.[code] 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"; }
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; }
Ich habe die Mission, eine PDF/A-Konformität zu erstellen, und um dies zu tun, verwende ich nach viel Arbeit Fnfe-mpe.org Validator. Fehler
Mein Problem ist:
ISO 19005-3:2012 clause 6.8 test 4
The...
Ich frage, weil ich keine ordnungsgemäße Dokumentation für den ITEXT finden kann, nur API -Referenz. oder Textposition nur mit iText? Code> mit .* Regex.
var regex = new Regex( .* );
var strat =...