วิธีการรักษาความปลอดภัยและลงนามเอกสาร PDF ด้วย TypeScript

วิธีการรักษาความปลอดภัยและลงนามเอกสาร 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 รายงานแฟล็กการอนุญาตที่บันทึกไว้ในไฟล์ที่เข้ารหัสเพื่อการตรวจสอบ; การบังคับใช้ในแอปพลิเคชันเป็นความรับผิดชอบของผู้เรียก.

ดูเพิ่มเติม

 ภาษาไทย