วิธีการรักษาความปลอดภัยและลงนามเอกสาร PDF ด้วย TypeScript
คู่มือนี้แสดงวิธีการเข้ารหัส, รับรอง, ลงลายเซ็น, และตรวจสอบเอกสาร PDF ด้วย Aspose.PDF FOSS สำหรับ TypeScript. Document.Save() และ Document.Open() จัดการการเข้ารหัสแบบกุญแจสาธารณะไปยังใบรับรองของผู้รับ, ในขณะที่ Document.Certify(), Document.Sign(), และ Document.VerifySignatures() จัดการลายเซ็นดิจิทัลแบบ PAdES. จำเป็นต้องใช้ Node.js 22 หรือใหม่กว่า.
คู่มือแบบทีละขั้นตอน
ขั้นตอนที่ 1: ติดตั้งแพคเกจ
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ตรวจสอบการติดตั้งโดยการนำเข้า class Document ในไฟล์ TypeScript ใหม่ — บรรทัดนี้ควรทำงานโดยไม่มีข้อผิดพลาดเมื่อแพคเกจถูกติดตั้งเรียบร้อยแล้ว:
import { Document } from '@asposefoss/pdf';ขั้นตอนที่ 2: นำเข้าคลาสที่จำเป็น
นำเข้า Document เพื่อเปิด, บันทึก, ลงลายมือชื่อ, และตรวจสอบไฟล์; ขั้นตอนการลงลายมือชื่อและการเข้ารหัสด้านล่างส่งผ่านอ็อบเจ็กต์ตัวเลือกแบบธรรมดา ดังนั้นไม่จำเป็นต้องนำเข้าเพิ่มเติม:
import { Document } from '@asposefoss/pdf';ขั้นตอนที่ 3: เข้ารหัสเอกสารให้กับใบรับรองของผู้รับ
Document.Save() ยอมรับตัวเลือก encrypt ที่บรรจุ recipients หนึ่งหรือหลายรายการ, แต่ละรายการระบุด้วยใบรับรอง (สตริง PEM หรือไบต์ DER), algorithm, และ 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
},
});ขั้นตอนที่ 4: เปิดเอกสารที่เข้ารหัส
ส่งตัวเลือก recipient ไปยัง Document.Open() พร้อมด้วยคีย์ส่วนตัวและใบรับรองที่ตรงกัน, หรือชุด PKCS#12:
const opened = Document.Open(bytes, {
recipient: { privateKey, certificate: recipientCertPem },
// or: recipient: { pkcs12: p12Bytes, passphrase: '…' },
});
console.log(opened.Permissions); // recovered permission flags (not enforced)
ขั้นตอนที่ 5: รับรองและลงลายมือชื่อเอกสาร
Document.Certify() และ Document.Sign() ทั้งสองทำงานแบบอะซิงโครนัสและรับอัตลักษณ์ (certificate + privateKey) พร้อมตัวเลือกที่อธิบายฟิลด์ลายมือชื่อ, รูปแบบ, และเหตุผล การรับรองควรทำก่อน, ครอบคลุมไฟล์ทั้งหมด; ลายมือชื่อการอนุมัติเพิ่มเติมจะถูกต่อเติมอย่างต่อเนื่องต่อมา:
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');
}ขั้นตอนที่ 6: ตรวจสอบลายมือชื่อ
Document.VerifySignatures() เป็นแบบอะซิงโครนัสและส่งคืน SignatureReport หนึ่งรายการต่อฟิลด์ลายเซ็น, แต่ละรายการรายงาน integrity การเข้ารหัสลับ, ความถูกต้องของ signature, และว่ามัน 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}`);
}
}ปัญหาทั่วไปและการแก้ไข
Document.Sign() / Document.Certify() throw หรือ hang. ทั้งสองเป็นแบบอะซิงโครนัส — await การเรียก. การลืม await ทำให้ promise ที่คืนกลับไม่ถูก resolve และการเขียนเกิดขึ้นก่อนการลงนามเสร็จสิ้น.
ลายเซ็นการอนุมัติในภายหลังทำให้การรับรองเป็นโมฆะ. ลงนามแบบเพิ่มขึ้น: บันทึกไบต์ที่ได้รับการรับรองก่อน (certifying.Save()), เปิดใหม่ด้วย Document.Open(), จากนั้นเรียก Sign() บนเอกสารที่เปิดใหม่นั้น — การเขียนใหม่ทั้งหมดแทนการต่อเติมแบบเพิ่มขั้นทำให้การรับรองของ /ByteRange ดิจสต์.
VerifySignatures() reports coversWholeFile: false สำหรับลายเซ็นแรกแต่ true สำหรับลายเซ็นสุดท้าย. นี่เป็นสิ่งที่คาดหวังสำหรับสายการ certify-then- sign: การรับรองถูกลงนามก่อนที่การอนุมัติจะถูกต่อเติม, ดังนั้นจึงมีเพียงลายเซ็นล่าสุดของ /ByteRange ขยายจนถึงส่วนท้ายของไฟล์.
การถอดรหัสล้มเหลวแม้ใช้คีย์ส่วนตัวที่ถูกต้อง. ยืนยัน certificate ส่งไปยัง recipient ตรงกับใบรับรองที่เอกสารถูกเข้ารหัสไปใน Document.Save()’s recipients รายการ — ใบรับรองที่ออกใหม่พร้อมคู่คีย์ใหม่จะไม่สามารถถอดรหัสข้อมูลที่เข้ารหัสด้วยคีย์เก่าได้.
คำถามที่พบบ่อย
เอกสารสามารถเข้ารหัสให้กับผู้รับมากกว่าหนึ่งคนได้หรือไม่?
ใช่ — recipients ในตัวเลือก encrypt ของ Document.Save() ยอมรับอาเรย์; กุญแจส่วนตัวที่ตรงกับผู้รับใดก็สามารถเปิดไฟล์ที่ได้.
รูปแบบลายเซ็นที่ Document.Sign() สร้างคืออะไร?
การส่ง subFilter: 'PAdES' ในตัวเลือกการเซ็นจะสร้างลายเซ็นที่เข้ากันได้กับ PAdES; การละเว้นจะใช้ subfilter ลายเซ็นเริ่มต้นของไลบรารี.
ฉันจะตรวจสอบว่าเอกสารได้รับการรับรองหรือแค่ถูกเซ็นอย่างเดียวได้อย่างไร?
ตรวจสอบฟิลด์ docMDP บน SignatureReport ที่ Document.VerifySignatures() คืนค่า — ลายเซ็นรับรองจะรายงานผลการอนุญาต DocMDP; ลายเซ็นแบบยอมรับเท่านั้นจะไม่ทำเช่นนั้น.
การกู้คืน Permissions หลังจาก Document.Open() ถูกบังคับใช้โดยไลบรารีหรือไม่?
ไม่ — opened.Permissions รายงานแฟล็กการอนุญาตที่บันทึกไว้ในไฟล์ที่เข้ารหัสเพื่อการตรวจสอบ; การบังคับใช้ในแอปพลิเคชันเป็นความรับผิดชอบของผู้เรียก.