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 การติดตั้งที่ไม่มีสิทธิ์ดังกล่าวจะไม่โหลดคลาสของความสามารถนี้ เปรียบเทียบรุ่นและรับไลเซนส์
พื้นผิว API สาธารณะ
หัวข้อที่มีชื่อว่า “พื้นผิว API สาธารณะ”ประเภททั้งสามอยู่ใน 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-Value | string ไบต์ลายเซ็นดิบ | 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 ชั่วคราวแบบ 0600 | string ไบต์ลายเซ็นดิบ | 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 แล้วตัดร่วมกับชุดที่อนุญาตของ backend | bool | ไม่มี | ปฏิเสธอัลกอริทึมแบบ digest อย่างเดียว id แบบ openssl-engine ไม่ประกาศสิ่งใด |
HsmSignerProviderAdapter::sign() | string $data, ?string $keyVersion = null | ส่งผ่านตัวเซ็นที่ห่อหุ้มด้วยอัลกอริทึมที่กำหนดไว้ | non-empty-string | KeyManagementException ($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'): stringpublic function signPqs(string $data, Pkcs11PqsAlgorithm $algorithm, string $context = '', bool $randomized = true): stringpublic function isPostQuantumEnabled(): boolpublic function getCertificateDer(): stringpublic function getCertificateChainDer(): arraypublic 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'): stringpublic function getCertificateDer(): stringpublic function getCertificateChainDer(): arraypublic function getPublicKeyAlgorithm(): stringpublic function getCertificatePem(): stringpublic function getResolvedBackend(): OpenSslCliBackendpublic function getOpensslVersion(): stringpublic function __construct(private HsmSignerInterface $hsm, private string $providerId, private SignatureAlgorithm $algorithm = SignatureAlgorithm::Pkcs1v15)public function providerId(): stringpublic function supportsAlgorithm(SignatureAlgorithm $algo): boolpublic 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,sha512WithRSAEncryptionRSASSA-PSS,RSASSA-PSS-SHA256,RSASSA-PSS-SHA384,RSASSA-PSS-SHA512ecdsa-with-SHA256,ecdsa-with-SHA384,ecdsa-with-SHA512Pkcs11Signerยังยอมรับ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 = truePIN จะถูกฝังเป็น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 idopenssl-engineซึ่งเลิกใช้แล้วจะไม่ประกาศอัลกอริทึมใด ดังนั้นการกำหนดค่าที่ล้าสมัยจะล้มเหลวในการเลือก provider แทนที่จะเป็นเวลาเซ็น
พฤติกรรมในโหมด FIPS
หัวข้อที่มีชื่อว่า “พฤติกรรมในโหมด FIPS”ตัวเซ็นทั้งสองยอมรับ 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.1 | CKA_ALWAYS_AUTHENTICATE re-authentication |
| ลายเซ็น ECDSA ของโทเคนคือการเชื่อมต่อ r‖s แบบดิบ ตัวเซ็นจะแปลงเป็น DER เพื่อความเข้ากันได้กับ PDF | PKCS#11 v3.1 | §6.3.1 |
| พารามิเตอร์ PSS ผูก hash, MGF และความยาว salt ตัวเซ็นตั้งค่า salt ให้เท่ากับความยาว digest | PKCS#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 204 | HashML-DSA context handling |
| การตรวจรับรอง FIPS 140-3 ผูกกับโมดูลเข้ารหัสผ่าน CMVP | FIPS 140-3 | CMVP 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()มีไว้สำหรับการบันทึกหลักฐาน จัดเก็บไว้พร้อมกับหลักฐานการเซ็นเมื่อโปรแกรมความสอดคล้องของคุณต้องการความสามารถในการทำซ้ำ
ดูเพิ่มเติม
หัวข้อที่มีชื่อว่า “ดูเพิ่มเติม”- การเซ็นด้วยฮาร์ดแวร์ซีเคียวริตี้โมดูล (PKCS#11) — หน้าความสามารถพร้อมขั้นตอนการติดตั้ง การกำหนดค่า และการตรวจสอบ
- ความปลอดภัย — เอกสารอ้างอิงเชิงลึก — พื้นผิวความปลอดภัยของ Enterprise แบบรวม
- ลายเซ็น — เอกสารอ้างอิงเชิงลึก — ตัวผลิต PAdES B-LT / B-LTA ระยะยาว
- FIPS 140 — เอกสารอ้างอิงเชิงลึก — นโยบายการเข้ารหัส ชุดการทดสอบตัวเอง และเกต
FipsSignatureEnforcer - พรีวิว PQC — เอกสารอ้างอิงเชิงลึก — พื้นผิวพรีวิว post-quantum และขอบเขตของมัน
- ความปลอดภัย / การเซ็น (Core) — ตัวเซ็น CMS ของ Core และสัญญาการเซ็น
ขอบเขตการเผยแพร่
หัวข้อที่มีชื่อว่า “ขอบเขตการเผยแพร่”หน้านี้บันทึกเฉพาะพฤติกรรมที่สังเกตได้จากภายนอกและพื้นผิว API สาธารณะที่รองรับเท่านั้น เส้นทาง namespace ภายใน คลาสตัวช่วย ตารางกลไก ชื่อไฟล์ runbook และคำนำหน้าตั๋วอยู่นอกขอบเขต