|
THotPDF.SignPDFWithPFX
|
Ö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
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 3. RSA, adlandırılmış eğrili ECDSA, Ed25519 veya Ed448 özel anahtarlarını sertifikalarla; açık anahtar malzemesi ve tam RFC 2985 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 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
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 Uçtan uca imzalama için
Notlar RSA ve ECDSA PFX imzalama, yerel HotPDF ve Windows kriptografi yollarını kullanır. Ed25519 ve Ed448 PFX imzalama, OpenSSL 3 İ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 |