THotPDF.SignPDFWithPFX

THotPDF

 

Föregående  Metoder  AddPubKeyRecipient

Signs an existing PDF placeholder using a PFX / PKCS#12 file, building a CMS SignedData container and writing the signed PDF in one call.

 

Delphi syntax (file overload):

class function SignPDFWithPFX(

  const InputPDFPath: string;

  const OutputPDFPath: string;

  const PFXFilePath: string;

  const Password: AnsiString): boolean; overload; static;

 

Delphi syntax (stream overload):

class function SignPDFWithPFX(

  InputStream: TStream;

  OutputStream: TStream;

  const PFXFilePath: string;

  const Password: AnsiString): boolean; overload; static;

 

Beskrivning

SignPDFWithPFX är den heltäckande startpunkten för PFX-signering som lades till i v2.119.27. Indata-PDF:en måste redan innehålla en signaturplatshållare som skapats av . Metoden:

 

1. Läser in indatans PDF, hittar sentinel-platshållarna /ByteRange + /Contents och patchar /ByteRange med faktiska byte offsets

2. Läser in PFX-filen och dekrypterar den med det angivna lösenordet. PBES2 med PBKDF2-HMAC-SHA-256 + AES-256-CBC stöds (detta är standard för PFX-filer exporterade av OpenSSL 3.0+, Windows 11+ certutil och macOS Keychain Access). Legacy PBE-SHA1-3DES files ger en diagnostic; exportera om med openssl pkcs12 -export ... -keypbe AES-256-CBC -certpbe AES-256-CBC

3. Beräknar SHA-256 över dokumentbytes som täcks av /ByteRange och bygger en CMS SignedData (RFC 5652) DER blob med X.509-certifikatet, signed attributes (contentType + messageDigest + signingTime) och en RSA + SHA-256-signatur över SET-tagged signed attributeslocalKeyId värden och följer därefter utfärdare-/ämnesnamn och Authority Key Identifier-/Subject Key Identifier-tillägg för att bevara den tillgängliga mellan- och rotkedjan

4. Väljer signeringsstemet från den matchade nyckeln, beräknar det nödvändiga dokumentssammandraget och bygger en CMS SignedData (RFC 5652) DER-blob som innehåller undertecknarcertifikatet, dess matchande kedja utan duplicerade DER-certifikat samt signerade attribut. RSA och ECDSA signerar attributsammandraget; Ed25519 och Ed448 signerar hela DER SET OF -attribut i PureEdDSA-läge. Ed25519 använder SHA-512 och Ed448 använder SHAKE256 med 512-bitars utdata och id-shake256-len

4. Hex-kodar CMS DER, kontrollerar att den får plats i /Contents-budgeten som AddSignedSignatureField reserverade (standard 8 KB täcker 1024 / 2048-bit RSA) och injicerar den i platshållaren

5. Skriver patched bytes till utdatasökvägen eller streamen

 

Returnerar True vid framgång. Utlöser EHPDFPFXError vid fel lösenord, unsupported encryption profile eller malformed PFX; EHPDFCMSError när indatans PDF saknar den förväntade platshållaren eller CMS DER överskrider den reserverade /Contents-budgeten; EHPDFRSAError vid RSA key mismatch

 

Typiskt arbetsflöde

 

Doc := THotPDF.Create(nil);

Doc.FileName := 'unsigned.pdf';

Doc.BeginDoc;

Doc.CurrentPage.AddSignedSignatureField(

  'Sig1', Rect(60, 60, 260, 90), 8192,

  'adbe.pkcs7.detached', 'Approved', 'Brussels', '', []);

Doc.EndDoc;

Doc.Free;

THotPDF.SignPDFWithPFX('unsigned.pdf', 'signed.pdf', 'mykey.pfx', 'mypassword');

 

Anteckningar

Signaturalgoritmen är RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). Signer identifier är IssuerAndSerialNumber som extraheras från X.509-certifikatet. encapContentInfo är detached (eContent utelämnas). Signed attributes sorteras efter stigande DER byte string enligt RFC 5652 §5.4 innan de hashatsHPDFEnumeratePFXIdentities för att granska den deterministiska identitetslistan och dess LocalKeyID och FriendlyName -fält, eller anropa HPDFParsePFXByLocalKeyID när bara det valda nyckelmaterialet krävs

För signering från ände till ände, initiera THPDFCMSSignOptions med HPDFCMSDefaultSignOptions, kopiera de valda exakta oktetterna till Options.PFXLocalKeyIDoch anropa HPDFCMSSignPDFStream överbelastningen som accepterar de alternativen. Det valda lävbladet, tillgängliga mellan certifikat och tillgänglig rot bäddas in automatiskt; anroparlevererade Options.AdditionalCertsDER -värden slås samman med exakt DER-avduplicering

 

Noteringar

RSA- och ECDSA-PFX-signering använder de inhemska HotPDF- och Windows-kryptografivägarna. Ed25519- och Ed448-PFX-signering kräver OpenSSL 3 libcrypto; direkta HPDFCMSSignPDFStream -anropare kan sätta THPDFCMSSignOptions.OpenSSLLibraryPath, medan bekvämlighetsöverbelastningen använder plattformens normala sökväg för bibliotek

Signaturalgoritmen är RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). Undertecknaridentifieraren är IssuerAndSerialNumber extraherad ur X.509-certifikatet. encapContentInfo är fristående (eContent utelämnat). Signerade attribut sorteras efter stigande DER-bytesträng enligt RFC 5652 avsnitt 5.4 innan de hashas

 

För PAdES B-T / B-LT / B-LTA-arbetsflöden som behöver RFC 3161 timestamps, DSS dictionaries eller document timestamp signatures gäller fortfarande producer-side helpers (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature); SignPDFWithPFX själv skapar en grundläggande CMS-only signature (motsvarande PAdES-B-B)

 

Se även: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField