THotPDF.SignPDFWithPFX

THotPDF

 

Önceki  Yöntemler  AddPubKeyRecipient

Var olan bir PDF yer tutucusunu PFX / PKCS#12 dosyasıyla imzalar, tek bir kimlik bilgisini deterministik olarak seçer, kullanılabilir sertifika zinciriyle bir CMS SignedData kapsayıcısı kurar ve imzalı PDF'i tek çağrıda yazar

 

Delphi sözdizimi (dosya aşırı yüklemesi):

class function SignPDFWithPFX(

  const InputPDFPath: string;

  const OutputPDFPath: string;

  const PFXFilePath: string;

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

 

Delphi sözdizimi (stream aşırı yüklemesi):

class function SignPDFWithPFX(

  InputStream: TStream;

  OutputStream: TStream;

  const PFXFilePath: string;

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

 

Açıklama

SignPDFWithPFX, v2.119.27'de eklenen uçtan uca PFX imzalama giriş noktasıdır. Girdi PDF'i, subFilter adbe.pkcs7.detached ile THPDFPage.AddSignedSignatureField (veya PAdES sarmalayıcısı) tarafından yazılmış bir imza yer tutucusunu çoktan içermelidir. Metot:

 

1. Girdiyi sınırlı bir 256 KB'lık tampon üzerinden kopyalar veya aynı konumlanabilir okunur/yazılır stream'i yeniden kullanır; /ByteRange + /Contents yer tutucularını bulur ve sabit genişlikli /ByteRange alanını gerçek bayt ofsetleriyle konumlayarak yamalar

2. PFX dosyasını yükler ve verilen parolayla çözer. PBES2; varsayılan HMAC-SHA-1 veya açık HMAC-SHA-256, HMAC-SHA-384 ve HMAC-SHA-512 PBKDF2 PRF'leriyle AES-128-CBC, AES-192-CBC ve AES-256-CBC'yi kabul eder. İsteğe bağlı bir PBKDF2 keyLength'i seçilen AES şifresiyle eşleşmelidir; eski PBE-SHA1-3DES dosyaları, eski sertifika dışa aktarımları için desteklenmeye devam eder. Diğer şifreleme profilleri, sorunlu OID ile bir tanı üretir

3. RSA, adlandırılmış eğrili ECDSA, Ed25519 veya Ed448 özel anahtarlarını sertifikalarla; açık anahtar malzemesi ve tam RFC 2985 localKeyId değerleri üzerinden eşleştirir, ardından mevcut ara ve kök zinciri korumak için veren / konu adlarını ve Authority Key Identifier / Subject Key Identifier uzantılarını izler

4. Eşleşen anahtardan imzalama şemasını seçer, gerekli belge özetini hesaplar ve imzalayıcı sertifikasını, yinelenen DER sertifikaları olmadan eşleşen zincirini ve imzalı öznitelikleri içeren bir CMS SignedData (RFC 5652) DER blob'u kurar. RSA ve ECDSA öznitelik özetini imzalar; Ed25519 ve Ed448, eksiksiz DER SET OF özniteliklerini PureEdDSA kipinde imzalar. Ed25519 SHA-512 kullanır; Ed448, 512 bitlik çıktıyla SHAKE256 ve id-shake256-len kullanır

5. CMS DER'ini onaltılık kodlar, AddSignedSignatureField'in rezerve ettiği /Contents bütçesine sığdığını doğrular (varsayılan 8 KB, 1024 / 2048 bitlik RSA'yı karşılar) ve yer tutucunun içine enjekte eder

6. Yamalanmış baytları çıktı yoluna veya stream'e yazar

 

Başarıda True döndürür. Hatalı parola, desteklenmeyen şifreleme veya özel anahtar profili, bozuk PFX, belirsiz kimlik, belirsiz veren ya da sertifika zinciri döngüsünde EHPDFPFXError; girdi PDF'i beklenen yer tutucuyu içermiyorsa, isteğe bağlı bir EdDSA sağlayıcısı yoksa, imzalama başarısız olursa veya CMS DER'i rezerve edilen /Contents bütçesini aşarsa EHPDFCMSError; RSA anahtarı uyuşmazlığında EHPDFRSAError fırlatır

 

Tipik iş akışı

 

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');

 

Çok kimlikli PFX dosyaları

Kullanışlı aşırı yükleme; birden fazla eşleşen sertifika ve özel anahtar içeren bir PFX'i bilinçli olarak reddeder. Deterministik kimlik listesini ve bunların LocalKeyID ile FriendlyName alanlarını incelemek için HPDFEnumeratePFXIdentities'i çağırın; yalnızca seçilen anahtar malzemesi gerekiyorsa HPDFParsePFXByLocalKeyID'yi çağırın

Uçtan uca imzalama için THPDFCMSSignOptions'u HPDFCMSDefaultSignOptions ile başlatın, seçilen kesin oktetleri Options.PFXLocalKeyID'ye kopyalayın ve bu seçenekleri kabul eden HPDFCMSSignPDFStream aşırı yüklemesini çağırın. Seçilen yaprak sertifika, mevcut ara sertifikalar ve mevcut kök otomatik gömülür; çağıranın sağladığı Options.AdditionalCertsDER değerleri kesin DER tekilleştirmesiyle birleştirilir

 

Notlar

RSA ve ECDSA PFX imzalama, yerel HotPDF ve Windows kriptografi yollarını kullanır. Ed25519 ve Ed448 PFX imzalama, OpenSSL 3 libcrypto gerektirir; doğrudan HPDFCMSSignPDFStream çağıranları THPDFCMSSignOptions.OpenSSLLibraryPath ayarlayabilir, kullanışlı aşırı yükleme ise normal platform kitaplık arama yolunu kullanır

İmza algoritması RSA + SHA-256'dır (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). İmzalayıcı tanımlayıcı, X.509 sertifikasından çıkarılan IssuerAndSerialNumber'dır. encapContentInfo detached'tır (eContent atlanır). İmzalı öznitelikler, hash'lenmeden önce RFC 5652 bölüm 5.4 uyarınca artan DER bayt dizisine göre sıralanır

 

RFC 3161 zaman damgaları, DSS sözlükleri veya belge zaman damgası imzaları gerektiren PAdES B-T / B-LT / B-LTA iş akışları için üretici tarafı yardımcıları (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature) geçerliliğini korur; SignPDFWithPFX'in kendisi temel bir yalnızca-CMS imzası yazar (PAdES-B-B eşdeğeri)

Stream aşırı yüklemesi, eksiksiz ikinci bir PDF'i asla bellekte tutmaz. Yamalanmış çıktıyı sınırlı aralıklarla hash'ler ve dosya uzunluğunu değiştirmeden onaltılık CMS değerini konumlayarak yamalar. Sabit genişlikli ondalık ofsetler, 10.000.000.000 bayttan küçük hazırlanmış PDF'leri destekler

 

Ayrıca bkz.: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField