ข้ามไปยังเนื้อหา
getnextpdf.com

Enterprise รุ่น

การเซ็นด้วย HSM — เอกสารอ้างอิงเชิงลึก

หน้านี้เป็นเอกสารอ้างอิงเชิงลึกสำหรับพื้นผิวการเซ็นด้วย HSM ของ NextPDF Enterprise ครอบคลุมประเภทสาธารณะสามรายการ NextPDF\Enterprise\Security\Signature\Hsm\Pkcs11Signer เซ็นผ่านโทเคน PKCS#11 ด้วยส่วนขยาย ext-pkcs11 NextPDF\Enterprise\Security\Signature\Hsm\OpenSslCliSigner เซ็นผ่านไบนารี openssl ในกระบวนการย่อย สำหรับคีย์ที่รองรับด้วย provider หรือ engine ที่ PHP ext-openssl ไม่สามารถโหลดได้ NextPDF\Enterprise\Security\Signature\Hsm\Provider\HsmSignerProviderAdapter เปิดเผยตัวใดตัวหนึ่งในรูปแบบ SignerProviderInterface แบบรวมศูนย์ ในทุกเส้นทางคีย์ส่วนตัวจะอยู่ภายในขอบเขตของโทเคน NextPDF ส่งไบต์ที่ต้องการเซ็นให้และรับลายเซ็นกลับมา เส้นทางแบบ post-quantum (signPqs) เป็น ตัวอย่างพรีวิว โดยปิดใช้งานตามค่าเริ่มต้น ไม่มีการอ้างความสอดคล้อง และไม่มีเส้นทางการตรวจสอบที่รองรับในตัวตรวจสอบ PDF ปัจจุบัน NextPDF ไม่ถือครองการรับรองใดและไม่มอบการรับรองใด การสนับสนุนไม่เท่ากับความสอดคล้อง และความสอดคล้องไม่เท่ากับการรับรอง

ความสามารถนี้มาพร้อมกับ NextPDF Enterprise (nextpdf/enterprise) และเปิดใช้งานด้วยซองไลเซนส์ระดับ Enterprise การติดตั้งที่ไม่มีสิทธิ์ดังกล่าวจะไม่โหลดคลาสของความสามารถนี้ เปรียบเทียบรุ่นและรับไลเซนส์

ประเภททั้งสามอยู่ใน NextPDF\Enterprise\Security\Signature\Hsm อะแดปเตอร์อยู่ใน sub-namespace Provider ของมัน ตัวเซ็นทั้งสองใช้งานสัญญา NextPDF\Contracts\HsmSignerInterface ของ Core

สัญลักษณ์พารามิเตอร์พฤติกรรมเริ่มต้นคืนค่าโยนข้อยกเว้นหรือล้มเหลวด้วยหมายเหตุ
Pkcs11Signer::__construct()string $libraryPath, int $slotId, string $pin, string $certLabel, ?string $keyLabel = null, array $chainDer = [], bool $enablePostQuantum = false, ?FipsSignatureEnforcer $fipsEnforcer = nullเปิดไลบรารีของผู้ผลิต ล็อกอินเข้าสู่สล็อต และโหลดใบรับรองและเมทาดาทาอัลกอริทึมของคีย์จากโทเคนHsmOperationException เมื่อไม่มี ext-pkcs11 หรือการเข้าถึงโทเคนล้มเหลวแคชแฮนเดิลของโมดูลหนึ่งตัวต่อเส้นทางไลบรารีต่อกระบวนการ PIN และป้ายกำกับเป็น #[SensitiveParameter]
Pkcs11Signer::sign()string $data, string $algorithm = 'sha256WithRSAEncryption'เซ็นบนโทเคน เอาต์พุต ECDSA ดิบจะถูกแปลงเป็น DER ECDSA-Sig-Valuestring ไบต์ลายเซ็นดิบHsmOperationException (ไม่พบคีย์ โทเคนล้มเหลว) InvalidArgumentException (อัลกอริทึมที่ไม่มีการแมป) ข้อยกเว้นจากเกต FIPS ก่อนการเซ็นเมื่อมีการเชื่อมต่อ enforcerชุดอัลกอริทึมแบบปิด ดูสัญญาพฤติกรรม
Pkcs11Signer::signPqs()string $data, Pkcs11PqsAlgorithm $algorithm, string $context = '', bool $randomized = trueปฏิเสธเว้นแต่มีการตั้งค่า $enablePostQuantum ส่งไปยังกลไก PQ ของ PKCS#11 แบบชั่วคราวstring ไบต์ลายเซ็นดิบHsmOperationException (ปิดใช้งาน โทเคนล้มเหลว ความยาวลายเซ็นไม่ตรงกัน) InvalidArgumentException (context เกิน 255 ไบต์)พรีวิว ไม่มีการอ้างความสอดคล้อง ตัวระบุกลไกเป็นแบบชั่วคราว
Pkcs11Signer::isPostQuantumEnabled()ไม่มีรายงานแฟล็กที่เลือกเปิดใช้ในคอนสตรัคเตอร์boolไม่มี
Pkcs11Signer::getCertificateDer()ไม่มีคืนค่าใบรับรองของผู้เซ็นที่อ่านจากโทเคนstring (DER)ไม่มีโหลดครั้งเดียวตอนสร้างอินสแตนซ์
Pkcs11Signer::getCertificateChainDer()ไม่มีคืนค่าใบรับรองกลางที่ให้ผ่านคอนสตรัคเตอร์array<string> (DER)ไม่มีไม่รวมใบรับรองของผู้เซ็น
OpenSslCliSigner::__construct()string $keyUri, string $certPath, string $pin, array $extraCertPaths = [], OpenSslCliBackend $backend = OpenSslCliBackend::Auto, string $opensslBinary = 'openssl', int $timeoutSeconds = 30, ?string $modulePath = null, ?string $configPath = null, bool $legacyPinDelivery = false, ?FipsSignatureEnforcer $fipsEnforcer = nullตรวจสอบ proc_open ตรวจสอบไบนารีและเวอร์ชัน แก้ไข backend และโหลดใบรับรองHsmOperationException (proc_open ถูกปิด ไฟล์โมดูล/คอนฟิก/ใบรับรองหายไป ไบนารีล้มเหลว ไม่มี backend) InvalidArgumentException (pin-value อยู่ใน $keyUri)OpenSslCliBackend::Auto เลือก provider ของ OpenSSL 3.x ก่อน แล้วจึงเป็น engine
OpenSslCliSigner::sign()string $data, string $algorithm = 'sha256WithRSAEncryption'รัน openssl dgst ในกระบวนการย่อย โดยค่าเริ่มต้น PIN จะส่งผ่านไฟล์ pin-source ชั่วคราวแบบ 0600string ไบต์ลายเซ็นดิบHsmOperationException (หมดเวลา PIN ถูกปฏิเสธ ไม่พบคีย์ โหลดโมดูลล้มเหลว เอาต์พุตว่างเปล่า ไฟล์ pin ล้มเหลว) InvalidArgumentException (อัลกอริทึมที่ไม่มีการแมป) ข้อยกเว้นจากเกต FIPS ก่อนการเซ็นกระบวนการย่อยจะถูกยุติหลังจาก $timeoutSeconds และ stderr จะถูกปกปิดข้อมูลก่อนไปถึงข้อความ
OpenSslCliSigner accessor surfaceไม่มีผลลัพธ์การสร้างอินสแตนซ์แบบอ่านอย่างเดียวstring / array<string> / OpenSslCliBackendไม่มีgetCertificateDer, getCertificateChainDer, getPublicKeyAlgorithm, getCertificatePem, getResolvedBackend, getOpensslVersion
HsmSignerProviderAdapter::__construct()HsmSignerInterface $hsm, string $providerId, SignatureAlgorithm $algorithm = SignatureAlgorithm::Pkcs1v15ห่อหุ้มตัว HSM รูปธรรมให้เป็น SignerProviderInterfaceไม่มีข้อกำหนดของ provider id: pkcs11-{module-id}, openssl-cli
HsmSignerProviderAdapter::providerId()ไม่มีคืนค่า id ที่ให้ผ่านคอนสตรัคเตอร์non-empty-stringไม่มี
HsmSignerProviderAdapter::supportsAlgorithm()SignatureAlgorithm $algoแมป enum ให้เป็นชื่อสไตล์ OpenSSL แล้วตัดร่วมกับชุดที่อนุญาตของ backendboolไม่มีปฏิเสธอัลกอริทึมแบบ digest อย่างเดียว id แบบ openssl-engine ไม่ประกาศสิ่งใด
HsmSignerProviderAdapter::sign()string $data, ?string $keyVersion = nullส่งผ่านตัวเซ็นที่ห่อหุ้มด้วยอัลกอริทึมที่กำหนดไว้non-empty-stringKeyManagementException ($keyVersion ไม่เป็น null) SignatureFailedException (อัลกอริทึมที่แมปไม่ได้ ไดรเวอร์ล้มเหลว ลายเซ็นว่างเปล่า)สัญญา SPI แบบ fail-closed ข้อผิดพลาดของไดรเวอร์ทุกรายการปรากฏเป็นชนิดที่กำหนด
public function __construct(private readonly string $libraryPath, private readonly int $slotId, #[SensitiveParameter] private readonly string $pin, #[SensitiveParameter] private readonly string $certLabel, #[SensitiveParameter] private readonly ?string $keyLabel = null, array $chainDer = [], private readonly bool $enablePostQuantum = false, ?FipsSignatureEnforcer $fipsEnforcer = null)
public function sign(string $data, string $algorithm = 'sha256WithRSAEncryption'): string
public function signPqs(string $data, Pkcs11PqsAlgorithm $algorithm, string $context = '', bool $randomized = true): string
public function isPostQuantumEnabled(): bool
public function getCertificateDer(): string
public function getCertificateChainDer(): array
public function __construct(private string $keyUri, string $certPath, #[SensitiveParameter] private string $pin, array $extraCertPaths = [], private OpenSslCliBackend $backend = OpenSslCliBackend::Auto, private string $opensslBinary = 'openssl', private int $timeoutSeconds = 30, private ?string $modulePath = null, private ?string $configPath = null, private bool $legacyPinDelivery = false, private ?FipsSignatureEnforcer $fipsEnforcer = null)
public function sign(string $data, string $algorithm = 'sha256WithRSAEncryption'): string
public function getCertificateDer(): string
public function getCertificateChainDer(): array
public function getPublicKeyAlgorithm(): string
public function getCertificatePem(): string
public function getResolvedBackend(): OpenSslCliBackend
public function getOpensslVersion(): string
public function __construct(private HsmSignerInterface $hsm, private string $providerId, private SignatureAlgorithm $algorithm = SignatureAlgorithm::Pkcs1v15)
public function providerId(): string
public function supportsAlgorithm(SignatureAlgorithm $algo): bool
public function sign(string $data, ?string $keyVersion = null): string
  • การเก็บรักษาคีย์ คีย์ส่วนตัวไม่เคยออกจากขอบเขตของโทเคน Pkcs11Signer มอบหมายการดำเนินการให้โทเคน OpenSslCliSigner ส่ง การอ้างอิง คีย์ — URI แบบ PKCS#11 — ให้กระบวนการย่อย openssl ตัวเซ็นทั้งสองไม่สามารถส่งออกคีย์ได้
  • เซสชันและการล็อกอิน Pkcs11Signer แคชแฮนเดิลของโมดูล PKCS#11 หนึ่งตัวต่อเส้นทางไลบรารีต่อกระบวนการ เพราะอินเทอร์เฟซของโทเคนต้องเริ่มต้นเพียงครั้งเดียวต่อกระบวนการ การดำเนินการแต่ละครั้งจะเปิดเซสชันและล็อกอินด้วย PIN การล็อกอินจะยืนยันตัวตนของผู้ใช้ก่อนการใช้คีย์ส่วนตัวใดๆ (PKCS#11 v3.1 §5.6.8) เมื่อสล็อตรายงานว่ามีการล็อกอินอยู่แล้ว ตัวเซ็นจะล็อกเอาต์แล้วล็อกอินใหม่ ดังนั้นโทเคนที่ต้องการ PIN ใหม่ต่อการดำเนินการจะได้รับ PIN นั้น
  • ชุดอัลกอริทึม (แบบปิด) ตัวเซ็นทั้งสองยอมรับเฉพาะ: sha256WithRSAEncryption, sha384WithRSAEncryption, sha512WithRSAEncryption RSASSA-PSS, RSASSA-PSS-SHA256, RSASSA-PSS-SHA384, RSASSA-PSS-SHA512 ecdsa-with-SHA256, ecdsa-with-SHA384, ecdsa-with-SHA512 Pkcs11Signer ยังยอมรับ ecdsa-raw เพิ่มเติม ตัวระบุอื่นใดจะทำให้เกิด InvalidArgumentException — ไม่มีการเซ็นด้วยอัลกอริทึมทดแทนใดๆ
  • การผูกค่า salt ของ PSS สำหรับ PSS ทุกแบบ ความยาว salt จะเท่ากับความยาว digest — 32, 48 หรือ 64 ไบต์ — และพารามิเตอร์ hash และ MGF จะตรงกับ digest ที่เลือก สิ่งนี้เป็นไปตามโครงสร้างพารามิเตอร์กลไกของ PSS ที่ความยาว salt โดยทั่วไปเท่ากับความยาว hash ของข้อความ (PKCS#11 v3.1 §6.1.9) ตัวเซ็นทั้งสองใช้การจับคู่แบบเดียวกัน ดังนั้นการกำหนดค่าที่ใช้ได้บน backend หนึ่งก็ใช้ได้บนอีก backend หนึ่ง
  • การแปลง ECDSA โทเคนจะคืนลายเซ็น ECDSA เป็นการเชื่อมต่อแบบดิบที่เติมศูนย์ของ r และ s (PKCS#11 v3.1 §6.3.1) Pkcs11Signer::sign() จะแปลงเอาต์พุตนั้นเป็นรูปแบบ ECDSA-Sig-Value ที่เข้ารหัสแบบ DER ซึ่งตัวตรวจสอบ PDF และ OpenSSL คาดหวัง ผู้เรียกไม่เคยจัดการกับรูปแบบดิบ
  • การส่ง PIN (เส้นทาง CLI) ในค่าเริ่มต้นที่ปลอดภัย PIN จะถูกเขียนลงไฟล์ชั่วคราวที่สร้างด้วยสิทธิ์เฉพาะเจ้าของเท่านั้น อ้างอิงผ่านแอตทริบิวต์ pin-source ของ URI แบบ PKCS#11 และถูกลบทิ้งหลังจากกระบวนการย่อยสิ้นสุด ในโหมดนี้ PIN จะไม่ถูกวางไว้ในบรรทัดคำสั่งและไม่ถูกส่งออกไปยังสภาพแวดล้อมของกระบวนการย่อย เมื่อ $legacyPinDelivery = true PIN จะถูกฝังเป็น pin-value ใน URI ซึ่งสังเกตเห็นได้ในบรรทัดคำสั่งของกระบวนการ โหมดนี้ต้องเลือกเปิดใช้เองเท่านั้น
  • วินัยของกระบวนการย่อย OpenSslCliSigner เรียกไบนารีด้วยอาร์เรย์อาร์กิวเมนต์ — ไม่มีการแทรกค่าผ่านเชลล์ — บังคับใช้ $timeoutSeconds ยุติกระบวนการย่อยเมื่อหมดเวลา และจำแนก stderr เป็นข้อผิดพลาดชนิดที่กำหนด ความลับจะถูกปกปิดจาก stderr ก่อนถูกอ้างในข้อความข้อยกเว้น
  • ความหมายของอะแดปเตอร์ โทเคน HSM ไม่มีแนวคิดเวอร์ชันคีย์ที่จัดการได้ คีย์บนโทเคนคือเวอร์ชัน HsmSignerProviderAdapter::sign() จึงปฏิเสธ $keyVersion ที่ไม่เป็น null ใดๆ ด้วย KeyManagementException แทนที่จะเพิกเฉย supportsAlgorithm() ตัดร่วมการแมป enum กับชุดที่ยอมรับของ backend ที่ห่อหุ้ม ดังนั้นอะแดปเตอร์จะไม่ประกาศกลไกที่ backend จะปฏิเสธในเวลาเซ็น ลายเซ็นว่างเปล่าจากไดรเวอร์จะทำให้เกิด SignatureFailedException
  • พรีวิว post-quantum signPqs() ถูกกั้นด้วยแฟล็กคอนสตรัคเตอร์ $enablePostQuantum และปฏิเสธที่จะทำงานหากไม่มี สตริง context จำกัดที่ 255 ไบต์ ตรงกับขอบเขต context ของ ML-DSA (FIPS 204) ลายเซ็นที่คืนมาต้องตรงกับความยาวไบต์ที่แน่นอนของชุดพารามิเตอร์ Pkcs11PqsAlgorithm ที่เลือก มิฉะนั้นการเรียกจะล้มเหลว ตัวระบุกลไกเป็นไปตามส่วนขยาย PQ ของ PKCS#11 แบบชั่วคราวและยังไม่เป็นข้อสรุปสุดท้าย โปรไฟล์ PAdES ไม่รู้จักชุด post-quantum ตัวตรวจสอบ PDF ส่วนใหญ่ปฏิเสธลายเซ็นเช่นนั้น และ NextPDF ไม่มีเส้นทางการตรวจสอบให้ ไม่มีการอ้างความสอดคล้อง
  • การสร้าง Pkcs11Signer โดยไม่มี ext-pkcs11 จะทำให้เกิด HsmOperationException ทันที ส่วนขยายนี้ไม่ได้รวมมากับ PHP รุ่นมาตรฐาน
  • ป้ายกำกับใบรับรองหรือคีย์ส่วนตัวที่ไม่ตรงกับออบเจกต์ใดบนโทเคนจะทำให้เกิด HsmOperationException ที่ระบุคลาสของออบเจกต์ที่หายไป ป้ายกำกับคีย์อาจแตกต่างจากป้ายกำกับใบรับรองได้อย่างถูกต้องบนโทเคนบางตัว
  • การล็อกอินที่ล้มเหลวซ้ำๆ สามารถล็อก PIN ที่โทเคนได้ โทเคนเป็นผู้บังคับใช้นโยบายนั้น ไม่ใช่ NextPDF โทเคนที่คีย์ต้องการการยืนยันตัวตนทุกครั้งที่ใช้จะได้รับการล็อกอินใหม่ผ่านเส้นทางล็อกเอาต์แล้วลองใหม่ (PKCS#11 v3.1, ความหมายแบบ always-authenticate)
  • OpenSslCliSigner ปฏิเสธ $keyUri ที่มี pin-value อยู่แล้วตอนสร้างอินสแตนซ์แบบ fail-closed เพราะการส่งเช่นนั้นจะข้ามเส้นทาง PIN ที่ปลอดภัย
  • บน Windows โหมดไฟล์ pin ที่ปลอดภัยจะล้มเหลวแบบปิดด้วย HsmOperationException บิตสิทธิ์ของไฟล์ไม่สามารถจำกัดการให้สิทธิ์อ่านแบบ ACL ที่นั่นได้ ดังนั้นตัวเซ็นจึงปฏิเสธที่จะทิ้ง PIN แบบข้อความธรรมดาไว้ที่ ACL ของไดเรกทอรีชั่วคราว การส่ง PIN แบบเดิมเป็นทางเลือกที่มีเอกสารและต้องเลือกเปิดใช้เองสำหรับโฮสต์ Windows ที่เชื่อถือได้
  • การตรวจจับ backend อัตโนมัติต้องใช้ OpenSSL 3.x สำหรับเส้นทาง provider LibreSSL ไม่เคยแก้ไขเป็น provider เมื่อทั้งการตรวจสอบ provider และ engine ไม่สำเร็จ การสร้างอินสแตนซ์จะล้มเหลวด้วย HsmOperationException แทนที่จะเลื่อนความล้มเหลวไปยังเวลาเซ็น
  • กระบวนการย่อยที่เกิน $timeoutSeconds จะถูกยุติและรายงานว่าหมดเวลา กระบวนการย่อยที่ออกอย่างสะอาดด้วยเอาต์พุตว่างเปล่าจะถูกรายงานว่าเป็นความล้มเหลวลายเซ็นว่างเปล่า ทั้งสองสถานการณ์ไม่สามารถสร้างเอกสารที่เซ็นเพียงบางส่วนได้
  • ลายเซ็น post-quantum ที่ความยาวไบต์ไม่ตรงกับชุดพารามิเตอร์ที่เลือกจะถูกปฏิเสธก่อนที่จะไปถึงการเข้ารหัส CMS
  • HsmSignerProviderAdapter ที่มี provider id openssl-engine ซึ่งเลิกใช้แล้วจะไม่ประกาศอัลกอริทึมใด ดังนั้นการกำหนดค่าที่ล้าสมัยจะล้มเหลวในการเลือก provider แทนที่จะเป็นเวลาเซ็น

ตัวเซ็นทั้งสองยอมรับ FipsSignatureEnforcer แบบไม่บังคับ เมื่อมีการเชื่อมต่อ โหมด FIPS จะทำงานสำหรับตัวเซ็นนั้น: sign() จะปฏิเสธอัลกอริทึมลายเซ็นที่ไม่ได้รับอนุญาตหรือคีย์ที่ต่ำกว่าเกณฑ์ ก่อน ที่การเซ็นบนโทเคนหรือกระบวนการย่อยใดจะเกิดขึ้น เกณฑ์ขั้นต่ำเป็นไปตามตารางการสร้างลายเซ็น — โมดูลัส RSA ต่ำกว่า 2048 บิตและอันดับ ECDSA ต่ำกว่า 224 บิตไม่ได้รับอนุญาต (NIST SP 800-131A Rev.2 §3 Table 2) หากไม่มี enforcer พฤติกรรมจะไม่เปลี่ยนแปลง เกตครอบคลุมเฉพาะเส้นทาง sign() แบบคลาสสิกเท่านั้น signPqs() อยู่ภายใต้แฟล็กพรีวิวของตนเอง สิ่งเหล่านี้เป็นการอ้างความสามารถเกี่ยวกับโค้ดของ NextPDF: การตรวจรับรอง FIPS 140-3 ผูกกับโมดูลเข้ารหัสผ่าน CMVP ซึ่งในการติดตั้งนี้คือ HSM หรือ provider ของผู้ดำเนินการ — NextPDF ไม่ใช่โมดูลที่ผ่านการตรวจรับรอง ไม่ถือครองการรับรองใด และไม่มอบการรับรองใด

ข้อกล่าวอ้างมาตรฐานข้อกำหนด
การล็อกอินยืนยันตัวตนของผู้ใช้ต่อโทเคนก่อนการดำเนินการคีย์ส่วนตัว PIN ที่ผิดจะปฏิเสธการเข้าถึงPKCS#11 v3.1§5.6.8
คีย์แบบ always-authenticate ต้องล็อกอินใหม่ต่อการใช้แต่ละครั้ง การยืนยันตัวตนใหม่ที่ล้มเหลวซ้ำๆ สามารถล็อก PIN ได้PKCS#11 v3.1CKA_ALWAYS_AUTHENTICATE re-authentication
ลายเซ็น ECDSA ของโทเคนคือการเชื่อมต่อ r‖s แบบดิบ ตัวเซ็นจะแปลงเป็น DER เพื่อความเข้ากันได้กับ PDFPKCS#11 v3.1§6.3.1
พารามิเตอร์ PSS ผูก hash, MGF และความยาว salt ตัวเซ็นตั้งค่า salt ให้เท่ากับความยาว digestPKCS#11 v3.1§6.1.9
เกต FIPS ปฏิเสธการสร้างลายเซ็นด้วย RSA ต่ำกว่า 2048 บิตหรืออันดับ ECDSA ต่ำกว่า 224 บิตNIST SP 800-131A Rev.2§3 Table 2
สตริง context แบบ post-quantum จำกัดที่ 255 ไบต์FIPS 204HashML-DSA context handling
การตรวจรับรอง FIPS 140-3 ผูกกับโมดูลเข้ารหัสผ่าน CMVPFIPS 140-3CMVP program scope

ข้อกำหนดทั้งหมดเป็นการเรียบเรียงใหม่ ไม่มีการนำข้อความเชิงบรรทัดฐานมาแสดงซ้ำ NextPDF ไม่ได้อ้างการรับรองใด ตัวเซ็นจัดพฤติกรรมให้สอดคล้องกับข้อกำหนดที่อ้างในฐานะความสามารถ ลายเซ็นที่ผลิตออกมาจะตรวจสอบผ่านหรือไม่เป็นการตัดสินใจของผู้ตรวจสอบเทียบกับ trust anchor ของตน ความปลอดภัยของคีย์ขึ้นอยู่กับโทเคน HSM และผู้ดำเนินการ — ไม่ใช่ NextPDF เพียงลำพัง

  • กลไกการส่ง PIN เป็นไปตามข้อกำหนด pin-source ของ URI แบบ PKCS#11 (RFC 7512) RFC นั้นอยู่นอกคลังอ้างอิงที่ยกมา ดังนั้นพฤติกรรมข้างต้นจึงอ้างอิงจากซอร์สของผลิตภัณฑ์ ไม่ใช่การอ้างสเปก

  • ยืนยันว่ารันไทม์โหลด ext-pkcs11 ก่อนสร้าง Pkcs11Signer การสร้างอินสแตนซ์จะล้มเหลวอย่างรวดเร็วเมื่อไม่มีส่วนขยาย ตัวเซ็น CLI ต้องเปิดใช้ proc_open และมีไบนารี openssl ที่ติดตั้ง provider หรือ engine แบบ PKCS#11

  • PIN ป้ายกำกับใบรับรอง และป้ายกำกับคีย์เป็น #[SensitiveParameter] จึงถูกยกเว้นจาก stack trace จ่าย PIN จากตัวจัดการความลับ อย่าเขียนลงในซอร์ส การกำหนดค่าที่คอมมิตเข้าระบบควบคุมเวอร์ชัน หรือบันทึกล็อก

  • การสร้างอินสแตนซ์เป็นขั้นตอนที่มีค่าใช้จ่ายสูงบนตัวเซ็นทั้งสอง: เส้นทาง PKCS#11 จะล็อกอินและอ่านใบรับรอง และเส้นทาง CLI จะตรวจสอบไบนารีและ backend สร้างครั้งเดียวและนำอินสแตนซ์กลับมาใช้ซ้ำ แคชโมดูลต่อไลบรารีทำให้การสร้างซ้ำกับไลบรารีเดียวกันปลอดภัย

  • ห่อหุ้มตัวเซ็นใน HsmSignerProviderAdapter เมื่อผู้เรียกทำงานผ่าน SignerProviderInterface ส่ง provider id ตามแบบแผนสำหรับคลาสที่ห่อหุ้ม — pkcs11-{module-id} หรือ openssl-cli — เพื่อให้การตรวจสอบความสามารถใช้ชุดที่อนุญาตของ backend ที่ถูกต้อง

  • ก่อนเปิดใช้พรีวิว post-quantum ให้ตรวจสอบตัวระบุกลไกของเฟิร์มแวร์โทเคนเทียบกับค่าชั่วคราวที่ NextPDF ลงทะเบียนไว้ ความไม่ตรงกันจะล้มเหลวในเวลาเซ็น อย่าเปิดใช้พรีวิวสำหรับเอาต์พุต PAdES ที่ใช้งานจริง

  • getResolvedBackend() และ getOpensslVersion() มีไว้สำหรับการบันทึกหลักฐาน จัดเก็บไว้พร้อมกับหลักฐานการเซ็นเมื่อโปรแกรมความสอดคล้องของคุณต้องการความสามารถในการทำซ้ำ

หน้านี้บันทึกเฉพาะพฤติกรรมที่สังเกตได้จากภายนอกและพื้นผิว API สาธารณะที่รองรับเท่านั้น เส้นทาง namespace ภายใน คลาสตัวช่วย ตารางกลไก ชื่อไฟล์ runbook และคำนำหน้าตั๋วอยู่นอกขอบเขต