Wie man PDF-Dokumente in TypeScript sichert und signiert

Wie man PDF-Dokumente in TypeScript sichert und signiert

Dieser Leitfaden zeigt, wie man PDF-Dokumente mit Aspose.PDF FOSS für TypeScript verschlüsselt, zertifiziert, signiert und verifiziert. Document.Save() und Document.Open() übernehmen die public-key encryption zu Empfängerzertifikaten, während Document.Certify(), Document.Sign() und Document.VerifySignatures() PAdES-style digital signatures handhaben. Es erfordert Node.js 22 oder höher.

Schritt-für-Schritt-Anleitung

Schritt 1: Paket installieren

git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-TypeScript.git
cd Aspose.PDF-FOSS-for-TypeScript
npm install
npm run build

Überprüfen Sie die Installation, indem Sie die Document-Klasse in einer neuen TypeScript-Datei importieren — diese Zeile sollte ohne Fehler aufgelöst werden, sobald das Paket installiert ist:

import { Document } from '@asposefoss/pdf';

Schritt 2: Erforderliche Klassen importieren

Importieren Sie Document, um die Datei zu öffnen, zu speichern, zu signieren und zu prüfen; die Signatur- und Verschlüsselungsschritte unten übergeben einfache Optionsobjekte, sodass keine weiteren Importe erforderlich sind:

import { Document } from '@asposefoss/pdf';

Schritt 3: Ein Dokument für Empfängerzertifikate verschlüsseln

Document.Save() akzeptiert eine encrypt-Option, die ein oder mehrere recipients enthält, jeweils identifiziert durch ein Zertifikat (PEM-Zeichenkette oder DER-Bytes), ein algorithm und gemeinsam genutzte permissions:

const doc = Document.OpenFile('report.pdf');

const bytes = doc.Save({
  encrypt: {
    recipients: [{ certificate: recipientCertPem }],
    algorithm: 'aes256', // 'aes256' (default) | 'aes128' | 'rc4'
    permissions: { copying: false }, // shared across all recipients
  },
});

Schritt 4: Ein verschlüsseltes Dokument öffnen

Übergeben Sie eine recipient-Option an Document.Open() mit entweder dem passenden privaten Schlüssel und Zertifikat oder einem PKCS#12-Bundle:

const opened = Document.Open(bytes, {
  recipient: { privateKey, certificate: recipientCertPem },
  // or: recipient: { pkcs12: p12Bytes, passphrase: '…' },
});

console.log(opened.Permissions); // recovered permission flags (not enforced)

Schritt 5: Ein Dokument zertifizieren und signieren

Document.Certify() und Document.Sign() sind beide asynchron und erwarten eine Identität (certificate + privateKey) sowie Optionen, die das Signaturfeld, das Aussehen und den Grund beschreiben. Die Zertifizierung sollte zuerst über die gesamte Datei erfolgen; weitere Genehmigungssignaturen werden danach schrittweise angehängt:

async function certifyAndSign(sourcePath: string, signaturePageIndex: number): Promise<void> {
  const certifying = Document.OpenFile(sourcePath);
  await certifying.Certify(
    { certificate: authorCert, privateKey: authorKey },
    {
      permissions: 'form-fill',
      reason: 'Certifying the document',
      fieldName: 'Certification',
      appearance: { page: signaturePageIndex, rect: [400, 100, 550, 140] },
    },
  );
  const certifiedBytes = certifying.Save();

  const approving = Document.Open(certifiedBytes);
  await approving.Sign(
    { certificate: approverCert, privateKey: approverKey },
    { reason: 'Approved for publication', fieldName: 'Approval', subFilter: 'PAdES' },
  );
  approving.WriteTo('signed.pdf');
}

Schritt 6: Signaturen prüfen

Document.VerifySignatures() ist asynchron und gibt pro Signaturfeld ein SignatureReport zurück, das kryptografische integrity, signature Gültigkeit meldet und ob es coversWholeFile:

async function verify(path: string): Promise<void> {
  const doc = Document.OpenFile(path);
  const reports = await doc.VerifySignatures();
  for (const r of reports) {
    console.log(`${r.name}: integrity=${r.integrity} signature=${r.signature} `
      + `coversWholeFile=${r.coversWholeFile} docMDP=${r.docMDP}`);
  }
}

Häufige Probleme und Lösungen

Document.Sign() / Document.Certify() werfen oder hängen. Beide sind asynchron — await der Aufruf. Vergessen await lässt das zurückgegebene Promise ungelöst und das Schreiben erfolgt, bevor die Signatur abgeschlossen ist.

Eine spätere Genehmigungs-Signatur macht die Zertifizierung ungültig. Inkrementell signieren: speichere zuerst die zertifizierten Bytes (certifying.Save()), öffne sie erneut mit Document.Open(), dann rufe auf Sign() bei dem wieder geöffneten Dokument — das Schreiben einer vollständigen Neuschreibung anstelle eines inkrementellen Anhangs unterbricht die Zertifizierung /ByteRange Digest.

VerifySignatures() reports coversWholeFile: false für die erste Signatur aber true für die letzte. Dies ist erwartungsgemäß für eine certify-then-sign-Kette: Die Zertifizierung wurde signiert, bevor die Genehmigung angehängt wurde, sodass nur die neueste Signatur /ByteRange bis zum Ende der Datei reicht.

Entschlüsselung schlägt mit dem richtigen privaten Schlüssel fehl. Bestätigen Sie das certificate übergeben an recipient entspricht exakt dem Zertifikat, zu dem das Dokument verschlüsselt wurde in Document.Save()’s recipients Liste — ein mit einem neuen Schlüsselpaar neu ausgestelltes Zertifikat kann Daten, die mit dem alten verschlüsselt wurden, nicht entschlüsseln.

Häufig gestellte Fragen

Kann ein Dokument für mehr als einen Empfänger verschlüsselt werden?

Ja — recipients in Document.Save()s encrypt-Option akzeptiert ein Array; jeder passende private Schlüssel des Empfängers kann die resultierende Datei öffnen.

Welches Signaturformat erzeugt Document.Sign()?

Das Übergeben von subFilter: 'PAdES' in den Signieroptionen erzeugt eine PAdES-kompatible Signatur; das Weglassen verwendet den standardmäßigen Signatur-Subfilter der Bibliothek.

Wie kann ich prüfen, ob ein Dokument zertifiziert oder nur signiert ist?

Untersuchen Sie das docMDP-Feld im SignatureReport, das von Document.VerifySignatures() zurückgegeben wird — eine Zertifizierungssignatur liefert ein DocMDP-Berechtigungsurteil; eine reine Genehmigungssignatur nicht.

Werden wiederhergestellte Permissions nach Document.Open() von der Bibliothek erzwungen?

Nein — opened.Permissions meldet die in der verschlüsselten Datei aufgezeichneten Berechtigungsflags zur Inspektion; deren Durchsetzung in einer Anwendung liegt in der Verantwortung des Aufrufers.

Siehe auch

 Deutsch