Enterprise รุ่น
Licensing — เอกสารอ้างอิงเชิงลึก
โดยสรุป
หัวข้อที่มีชื่อว่า “โดยสรุป”หน้านี้เป็นเอกสารอ้างอิงเชิงลึกสำหรับพื้นผิว licensing ของ NextPDF Enterprise — โมดูลที่แก้ไขหาทุกความสามารถอื่นของ Enterprise ครอบคลุมแบบจำลองสถานะสิทธิ์ (EntitlementEvaluator, EntitlementStatus, EntitlementResult) การจำกัดความสามารถที่ถูกบังคับใช้ (FeatureGate, CapabilityCode, CapabilityRegistry) เครื่องจักรบังคับใช้ช่องทางแบบสองตัวจับเวลา (ChannelEnforcementPolicy, OnlineCheckScheduler) และไคลเอนต์ออนไลน์ที่ลงลายเซ็น (LicenseClient) การประเมินสิทธิ์ตามปกติไม่ต้องใช้เครือข่าย ไคลเอนต์ออนไลน์มีอยู่สำหรับการดำเนินการ activate, heartbeat, deactivate, verify-online และ renewal-probe ที่ชัดเจน รายละเอียดกลไกภายในยังคงอยู่ในเอกสารภายในของ repository ต้นทางและอยู่นอกขอบเขตของคู่มือนี้
ความพร้อมใช้งานและการให้สิทธิ์
หัวข้อที่มีชื่อว่า “ความพร้อมใช้งานและการให้สิทธิ์”ความสามารถนี้จัดส่งมาใน NextPDF Enterprise (nextpdf/enterprise) และเปิดใช้งานด้วย license envelope ระดับ Enterprise การนำไปใช้งานที่ไม่มีสิทธิ์นั้นจะไม่โหลดคลาสของความสามารถนี้ เปรียบเทียบรุ่นและรับ license
Licensing เป็นพื้นผิวพื้นฐานของ Enterprise มันมีอยู่เสมอเมื่อแพ็กเกจ Enterprise ถูกติดตั้งร่วมกับแพ็กเกจ Core เพราะมันเป็นพื้นผิวที่แก้ไขหาทุกสิ่งอื่น NextPDF Pro ไม่มีพื้นผิวสิทธิ์แยกต่างหาก แบบจำลองสถานะ เครื่องจักรบังคับใช้ และไคลเอนต์ออนไลน์จัดส่งมาใน nextpdf/enterprise เท่านั้น NextPDF Core (Apache-2.0) ไม่มีแบบจำลองสิทธิ์เลย — โฮสต์ที่ต้องการพฤติกรรม Apache-2.0 แบบไม่มีสิทธิ์จะใช้เอนจิน Core โดยตรง ไม่ใช่ไปป์ไลน์ Enterprise
พื้นผิว API สาธารณะ
หัวข้อที่มีชื่อว่า “พื้นผิว API สาธารณะ”ชนิดทั้งหมดอยู่ภายใต้ NextPDF\Enterprise\Licensing เครื่องจักรบังคับใช้อยู่ใน sub-namespace Channel การประกอบรันไทม์อยู่ใน Runtime และชนิด signed-status อยู่ใน Online
| สัญลักษณ์ | พารามิเตอร์ | พฤติกรรมเริ่มต้น | คืนค่า | โยนหรือล้มเหลวด้วย | หมายเหตุ |
|---|---|---|---|---|---|
EntitlementEvaluator::evaluate() | ?LicenseKey $license, ?DateTimeImmutable $now = null | จับคู่ license ที่ตรวจสอบแล้ว (หรือ null) เข้ากับการตัดสินสิทธิ์แบบเต็ม | EntitlementResult | ไม่มี | license ที่เป็น null ให้ผลลัพธ์ no-license แบบ fail-closed |
EntitlementEvaluator::evaluateEnforced() | ?LicenseKey $license, EnforcementOutcome $outcome | แปลง enforcement outcome ที่คำนวณไว้ล่วงหน้าให้เป็นผลลัพธ์สิทธิ์ | EntitlementResult | ไม่มี | รุ่นที่มีผลมาจาก outcome การลดระดับจากการบังคับใช้ทุกครั้งตกลงที่ Core |
EntitlementEvaluator::resolveBrandingMode(), ::resolveBrandingStrategy() | ?LicenseKey $license, ?DateTimeImmutable $now = null | แก้ไขหาการตัดสินการแสดงแบรนด์สำหรับผลลัพธ์ที่สร้างขึ้น | BrandingMode / BrandingStrategy | ไม่มี | อำนาจการแสดงแบรนด์เพียงหนึ่งเดียว มีเพียงช่องทางการประเมินเท่านั้นที่ใส่ลายน้ำ |
EntitlementResult | value object แบบอ่านอย่างเดียว | ถือสถานะ รุ่น ช่องทาง โหมดการแสดงแบรนด์ แฟล็ก runtime/update/support และคำเตือนที่เป็นทางเลือก | — | ไม่มี | ตัวช่วย: isFullyActive(), isExpired(), isDowngradedToCore(), shouldApplyEvaluationBranding() |
EntitlementStatus | enum ที่มีค่าเป็น string | Active, GracePeriod, DowngradedToCore, EvaluationExpired, NoLicense | — | ไม่มี | PerpetualFallback ยังถูกเก็บไว้แต่เลิกใช้แล้ว คงไว้เพียงเพื่อให้ผู้ใช้ก่อน 6.0 ยังคอมไพล์ได้ |
FeatureGate::hasCapability() | CapabilityCode $capability | ตรวจสอบความสามารถเทียบกับรุ่นที่มีผลซึ่งถูกบังคับใช้และสถานะแพ็ก | bool | ไม่มี | fail-closed ไปที่ core เมื่อเกิดข้อผิดพลาดของ resolver ใด ๆ |
FeatureGate::requireCapability() | CapabilityCode $capability | ผ่านแบบเงียบ ๆ หรือโยนพร้อมบริบท upsell ที่มีโครงสร้าง | void | SpectrumAuthenticationException SPEC-LIC-001 (ไม่มีสิทธิ์) หรือ SPEC-LIC-002 (แพ็กหมดอายุ) | บริบทถือ required_capability, required_pack, current_packs, upgrade_info_url |
FeatureGate::isFeatureEnabled(), ::requireFeature() | string $feature | การตรวจสอบตัวระบุฟีเจอร์แบบเดิม | bool / void | SpectrumAuthenticationException SPEC-AUTH-007 (เส้นทาง require) | ความเข้ากันได้แบบเดิม แนะนำให้ใช้การตรวจสอบความสามารถแทน |
ตัวเข้าถึงของ FeatureGate | ไม่มี | การสำรวจข้อมูล license | แตกต่างกันไป | ไม่มี | currentEdition(), isLicenseValid(), isInGracePeriod(), getActivePacks(), trialPolicy() |
CapabilityCode | enum ที่มีค่าเป็น string | ตัวระบุความสามารถแบบ canonical (core.*, pro.*, enterprise.*, pack.*) | — | ไม่มี | isPack(), packName(), minimumEdition(), forEdition() |
CapabilityRegistry | LicenseKey, รูปแบบเส้นทาง | การแก้ไขจากเส้นทางเป็นความสามารถและการค้นหาแพ็กก่อน dispatch | แตกต่างกันไป | ไม่มี | registerDefaultRoutes() ครอบคลุมเส้นทางบริการที่บันทึกไว้ |
LicenseKey | value object แบบอ่านอย่างเดียว | เคลม license ที่แจงและตรวจสอบแล้ว | — | ไม่มี | isExpired(), isInGracePeriod(), isFullyExpired(), hasFeature(), hasCapability(), activePackNames(); maxSlots เป็นข้อผูกพันตามสัญญาเท่านั้น |
LicenseValidator::buildVerifiedLicenseKey() | array $data | สร้าง LicenseKey ที่มีชนิดจาก payload ที่ตรวจสอบแล้ว | LicenseKey | SpectrumAuthenticationException SPEC-AUTH-001 เมื่อละเมิด schema | รองรับ schema 2.0, 1.0 และ payload แบบเดิม |
PackDefinition / PackRegistry | value object แบบอ่านอย่างเดียว | สถานะแพ็ก add-on พร้อมการหมดอายุและ grace ที่เป็นอิสระ | แตกต่างกันไป | ไม่มี | isActive(), isFullyExpired(), activePacks(), activeCapabilities() |
TrialPolicy | bool $enabled, int $maxPagesPerSecond = 2, ฟิลด์ลายน้ำ | นโยบายจำกัดปริมาณการประมวลผลสำหรับการทดลองใช้ | — | ไม่มี | fromLicenseKey(), disabled(), isThrottled(); อำนาจการแสดงแบรนด์ยังอยู่กับตัวประเมิน |
ChannelEnforcementPolicy::enforce() | LicenseKey $license, LocalState $state, int $systemNow, bool $revoked = false | รันเครื่องจักรสองตัวจับเวลา พร้อมการเพิกถอนและการติดป้ายใหม่ของการทดลองใช้ | EnforcementOutcome | ไม่มี | การเพิกถอนมีผลเหนือทุกตัวจับเวลาและสถานะการทดลองใช้ |
OnlineCheckScheduler::evaluate(), ::recordSuccessfulOnlineCheck() | License สถานะภายในเครื่อง การประทับเวลา | การประเมินสองตัวจับเวลา การต่ออายุ lease จากเวลาเซิร์ฟเวอร์ที่ตรวจสอบแล้ว | EnforcementOutcome / LocalState | ไม่มี | ONLINE_GRACE_SECONDS ให้ liveness grace 48 ชั่วโมงหลังจาก lease |
EnforcementDecision / EnforcementReason / EnforcementOutcome | enum + value object แบบอ่านอย่างเดียว | Active, Grace, DowngradedToCore พร้อมเหตุผลที่แม่นยำ | — | ไม่มี | แต่ละเหตุผลจับคู่กับหนึ่งการตัดสินแบบกำหนดได้แน่นอน |
Runtime\EntitlementResolver::currentEntitlement() | ไม่มี | อินเทอร์เฟซ: สิทธิ์ที่ถูกบังคับใช้ซึ่งรันไทม์ให้บริการ | EntitlementResult | กำหนดโดยการนำไปใช้ | EnforcedEntitlementResolver ประกอบ cache สถานะ นโยบาย และตัวประเมิน แบบ fail-closed ไปที่ Core |
LicenseStateCache::get(), ::getOrThrow() | bool $forceRefresh = false | cache ของ license ที่ตรวจสอบแล้วซึ่งรองรับ gate | ?LicenseKey | getOrThrow(): SpectrumAuthenticationException SPEC-AUTH-008; LicenseConfigurationException เมื่อการเชื่อมต่อไม่ถูกต้อง | invalidate(), isCacheValid() |
LicenseClient::activate(), ::heartbeat(), ::deactivate(), ::verifyOnline() | string $licenseJws, string $deploymentId, ?string $machineFingerprintHash = null, ?string $expectedLicenseId = null, ?string $clientNonce = null | การแลกเปลี่ยน signed-status หนึ่งครั้ง การตอบกลับถูกตรวจสอบเทียบกับ pinned root และผูกกับ nonce ที่ส่งไป | StatusResponse | LicenseClientException (transport, non-200, nonce ที่ให้มาไม่ถูกต้อง); SpectrumAuthenticationException (การตอบกลับที่ปลอมแปลง ถูกดัดแปลง เก่า nonce ผิด license ผิด หรือชนิดผิด) | มีเพียง fingerprint hash ที่ salt แล้วที่ถูกส่ง ไม่มีการส่ง fingerprint ดิบ |
LicenseClient::checkRenewal() | string $licenseId, string $customerId | การตรวจหาความพร้อมของการต่ออายุ 404 คือคำตอบ “none available” ตามปกติ | อาร์เรย์การต่ออายุ (available, download_url, expires_at) | LicenseClientException (เข้าถึงไม่ได้ non-200/404 หรือ download_url ที่นโยบายปฏิเสธ) | URL ในเนื้อหาที่ไม่ได้ลงลายเซ็นถูกคัดกรอง SSRF ก่อนที่จะออกไปได้ |
LicenseClient::__construct() | ดูรั้วลายเซ็น | ตรวจสอบ transport, URL scheme และชุด pin เมื่อสร้าง | — | LicenseConfigurationException (transport ที่ไม่บังคับใช้นโยบาย scheme ที่ไม่อนุญาต HTTP ธรรมดาที่ไม่มี pin ชุด pin ที่ผิดรูปแบบ) | getPinSet() เปิดเผยชุด pin ที่ active สำหรับเครื่องมือหมุนเวียนคีย์ |
Online\StatusResponse | value object แบบอ่านอย่างเดียว | สถานะที่ลงลายเซ็นซึ่งตรวจสอบแล้ว | — | ไม่มี | isLive() เป็น false เมื่อ revoked / expired / released; ถือ leaseExpiresAt จำนวน slot และสแนปช็อตสิทธิ์ |
LicenseChannelMode / OnlineMode / OnlinePolicy | enum + value object แบบอ่านอย่างเดียว | เคลมช่องทางและนโยบายออนไลน์ | — | ไม่มี | signed_source เทียบกับ ioncube; โหมดออนไลน์ required / optional / disabled พร้อม intervalDays และ leaseDays |
LicenseEdition | enum ที่มีค่าเป็น string | Core, Pro, Enterprise | — | ไม่มี | satisfies() นำลำดับชั้นของขั้นไปใช้ |
public function __construct(private ?EvaluationBrandingConfig $evaluationBrandingConfig = null)public function evaluate(?LicenseKey $license, ?DateTimeImmutable $now = null): EntitlementResultpublic function evaluateEnforced(?LicenseKey $license, EnforcementOutcome $outcome): EntitlementResultpublic function resolveBrandingMode(?LicenseKey $license, ?DateTimeImmutable $now = null): BrandingModepublic function resolveBrandingStrategy(?LicenseKey $license, ?DateTimeImmutable $now = null): BrandingStrategypublic function __construct(private readonly LicenseStateCache $licenseCache, private readonly EntitlementResolver $entitlementResolver, private readonly string $upgradeInfoUrl = self::DEFAULT_UPGRADE_URL)public function isFeatureEnabled(string $feature): boolpublic function requireFeature(string $feature): voidpublic function currentEdition(): ?stringpublic function isLicenseValid(): boolpublic function isInGracePeriod(): boolpublic function hasCapability(CapabilityCode $capability): boolpublic function requireCapability(CapabilityCode $capability): voidpublic function getActivePacks(): arraypublic function trialPolicy(): TrialPolicypublic function __construct(private readonly ClientInterface $httpClient, private readonly RequestFactoryInterface $requestFactory, private readonly StreamFactoryInterface $streamFactory, private readonly StatusX5cValidator $statusValidator, private readonly string $baseUrl = self::DEFAULT_BASE_URL, #[SensitiveParameter] private readonly ?string $apiKey = null, array $pinnedPublicKeys = [], array $backupPins = [], private readonly OutboundHttpPolicy $policy = new OutboundHttpPolicy(allowedSchemes: ['https'], connectTimeoutSeconds: 10, readTimeoutSeconds: 30, maxResponseBytes: 10_485_760, followRedirects: false, allowPrivateTargets: false, retryAttempts: 0, retryBaseBackoffMs: 250))public function activate(string $licenseJws, string $deploymentId, ?string $machineFingerprintHash = null, ?string $expectedLicenseId = null, ?string $clientNonce = null): StatusResponsepublic function heartbeat(string $licenseJws, string $deploymentId, ?string $machineFingerprintHash = null, ?string $expectedLicenseId = null, ?string $clientNonce = null): StatusResponsepublic function deactivate(string $licenseJws, string $deploymentId, ?string $machineFingerprintHash = null, ?string $expectedLicenseId = null, ?string $clientNonce = null): StatusResponsepublic function verifyOnline(string $licenseJws, string $deploymentId, ?string $machineFingerprintHash = null, ?string $expectedLicenseId = null, ?string $clientNonce = null): StatusResponsepublic function getPinSet(): ?PinSetpublic function checkRenewal(string $licenseId, string $customerId): arrayสัญญาพฤติกรรม
หัวข้อที่มีชื่อว่า “สัญญาพฤติกรรม”การประเมินสิทธิ์ให้ผลเป็นหนึ่งในห้าสถานะปัจจุบัน แต่ละสถานะมีผลลัพธ์ที่ตายตัวในรันไทม์
| สถานะ | Runtime | ความสามารถที่มีผล | การอัปเดต / การสนับสนุน | การแสดงแบรนด์ |
|---|---|---|---|---|
Active | อนุญาต | รุ่นที่ได้รับสิทธิ์ + แพ็กที่ active | ใช่ (แบบชำระเงิน); ไม่ (การประเมิน) | ไม่มี (แบบชำระเงิน); ลายน้ำ (การประเมิน) |
GracePeriod | อนุญาต | รุ่นที่ได้รับสิทธิ์ + แพ็กที่ active | ใช่ | ไม่มี (แบบชำระเงิน) |
DowngradedToCore | อนุญาต | Core เท่านั้น | ไม่ | ไม่มี (แบบชำระเงิน); ลายน้ำ (การทดลองใช้) |
EvaluationExpired | ถูกจำกัด | ไม่มี | ไม่ | ลายน้ำ |
NoLicense | ปิดใช้งาน (fail-closed) | ไม่มี | ไม่ | ลายน้ำ |
- การหมดอายุแบบชำระเงินไม่มีวันปิดรันไทม์ที่ติดตั้งไว้
runtimeAllowedยังคงเป็น true สำหรับทุกสถานะแบบชำระเงิน เมื่อเลย grace window รุ่นที่มีผลจะลดระดับเป็น Core: ความสามารถ Core ยังคงรันต่อไปอย่างไม่มีกำหนด ความสามารถ Pro/Enterprise/pack ทั้งหมดถูกปิด และการอัปเดตกับการสนับสนุนถูกเพิกถอน กรณีEntitlementStatus::PerpetualFallbackที่เลิกใช้แล้วเป็นชื่อของนโยบายการหมดอายุก่อน 6.0 และมีอยู่เพียงเพื่อความเข้ากันได้ในการคอมไพล์ - ไม่ใช่ทุกสถานะที่จบลงด้วยการรันแบบ Core Grace คงรุ่นที่ได้รับสิทธิ์เต็มไว้พร้อมคำเตือนต่ออายุที่ระบุวันที่ การหมดอายุของการประเมินจำกัดรันไทม์และคงลายน้ำไว้ สถานะ no-license ปิดเส้นทาง Enterprise แบบ fail-closed และใส่ลายน้ำที่มองเห็นได้บนผลลัพธ์แบบเดิมใด ๆ ดังนั้นมันจึงไม่มีวันผ่านเป็นการรันแบบชำระเงิน
- ลำดับการแก้ไขที่ตายตัว license ที่หมดอายุโดยสมบูรณ์จะไม่แก้ไขความสามารถใด ความสามารถของแพ็กอ้างอิงสถานะ active และการหมดอายุที่เป็นอิสระของแพ็กเอง ความสามารถระดับรุ่นแก้ไขเทียบกับรุ่นที่มีผลซึ่งถูกบังคับใช้ บนลำดับชั้นที่เคร่งครัด Enterprise ⊇ Pro ⊇ Core ไม่มีการอ้างอิง
LicenseKey::$editionดิบสำหรับการจำกัดสิทธิ์ - สองตัวจับเวลา ตัวที่จำกัดที่สุดชนะ ตัวจับเวลาสิทธิ์ (ทั้งสองช่องทาง) ขับเคลื่อน Active, Grace และการลดระดับเป็น Core หลัง grace ตัวจับเวลา online-liveness ใช้เฉพาะกับช่องทาง
ioncubeที่มีโหมดออนไลน์required: lease บวก liveness grace 48 ชั่วโมง ต้องยังสด เมื่ออยู่ offline เลย lease พรีเมียมจะหยุดชั่วคราวที่ระดับ Core การตรวจสอบออนไลน์ที่ตรวจสอบแล้วในภายหลังจะสร้าง lease ขึ้นใหม่และพรีเมียมกลับมาทำงานต่อ ช่องทางsigned_source— และโหมดออนไลน์ที่ไม่ใช่ required ใด ๆ — ไม่มีตัวจับเวลา liveness และยังคง offline และรองรับ air-gap ได้ - การป้องกันการย้อนกลับเป็นแบบกำหนดได้แน่นอน การบังคับใช้ประเมินเทียบกับพื้นแบบ monotonic: เวลาที่มีผลคือค่าสูงสุดของนาฬิการะบบและเวลาที่ตรวจสอบล่าสุด ดังนั้นการเปลี่ยนนาฬิกาย้อนหลังจึงไม่ให้เวลาเพิ่ม การย้อนกลับที่เกินความคลาดเคลื่อนที่ยอมรับได้และ grace ที่เหลือจะบังคับให้ลดระดับเป็น Core
- lease เดินหน้าด้วยเวลาที่เชื่อถือได้เท่านั้น การตรวจสอบออนไลน์ที่สำเร็จบันทึกเวลาเซิร์ฟเวอร์ที่ตรวจสอบและลงลายเซ็นแล้ว ไม่ใช่นาฬิกาภายในเครื่อง ดังนั้นการกระโดดนาฬิกาไปข้างหน้าในเครื่องจึงไม่สามารถขยาย lease ได้
- การแสดงแบรนด์มีอำนาจเดียว มีเพียงช่องทางการประเมินเท่านั้นที่กระตุ้นลายน้ำ license แบบชำระเงินแก้ไขเป็นไม่มีการแสดงแบรนด์ในทุกสถานะ รวมถึงสถานะที่ถูกลดระดับ
- การทดลองใช้เป็นชั้นนโยบายบนตัวจับเวลาเดียวกัน ปริมาณการประมวลผลถูกจำกัด (ค่าเริ่มต้น 2 pages/second) ลายน้ำการประเมินถูกใช้ และการหมดอายุเคร่งครัดโดยไม่มี grace มีเพียงเหตุผลที่รายงานเท่านั้นที่เปลี่ยน การตัดสินและรุ่นที่มีผลเป็นไปตามเครื่องจักรแบบชำระเงิน
- สัญญาออนไลน์ลงลายเซ็นแบบ end to end แต่ละคำขอถือ CSPRNG client nonce แต่ละการตอบกลับเป็น compact EdDSA JWS ชนิดสื่อ
application/nextpdf-status+jwtตรวจสอบผ่าน x5c chain ไปยัง pinned root ที่คอมไพล์เข้ามาและผูกกับ nonce ที่ส่งไป license id ที่ติดตั้ง และ endpoint ที่เรียก transport แบบ envelope ที่ไม่ลงลายเซ็นแบบเดิมถูกยกเลิกแล้ว เหลือเส้นทางความเชื่อถือเพียงหนึ่งเดียว SPKI pin ที่กำหนดค่าไว้เดินทางเป็นเฮดเดอร์X-NextPDF-Pinned-Public-Keyและชุด pin ต้องมี backup pin - ไม่มีการบังคับใช้ seat ในรันไทม์
maxSlotsเป็นข้อผูกพันตามสัญญาเท่านั้น — ไม่มี telemetry และไม่มี phone-home บังคับสำหรับการดำเนินงานปกติ
กรณีขอบและโหมดความล้มเหลว
หัวข้อที่มีชื่อว่า “กรณีขอบและโหมดความล้มเหลว”- การตรวจสอบความสามารถบน license ที่หมดอายุโดยสมบูรณ์จะลัดวงจรไปยัง “unavailable” ก่อนที่ตรรกะของแพ็กหรือรุ่นใดจะรัน
- แพ็ก add-on สามารถหมดอายุได้ในขณะที่ license พื้นฐานยัง active การปฏิเสธจึงอ่านว่า pack expired (
SPEC-LIC-002) ไม่ใช่ not-licensed (SPEC-LIC-001) และแสดงรายการแพ็กที่ active อยู่ในปัจจุบัน - ไฟล์สถานะการบังคับใช้ภายในเครื่องที่มีอยู่แต่อ่านหรือแจงไม่ได้เป็นสัญญาณการดัดแปลง เครื่องจักรจะ fail closed ไปยังการลดระดับเป็น Core พร้อม
EnforcementReason::CorruptStateไฟล์ที่ขาดหายไปโดยชอบธรรมไม่ถือว่าเสียหายและดำเนินการต่อตามปกติ - การย้อนนาฬิกาต่ำกว่าพื้น monotonic ที่เกินความคลาดเคลื่อนที่ยอมรับได้ (ค่าเริ่มต้น 120 seconds) และ grace ที่เหลือจะบังคับให้ลดระดับเป็น Core แบบกำหนดได้แน่นอน
- lease liveness ที่หมดอายุจะลดระดับ license
ioncubeที่มิฉะนั้นจะ Active การหมดอายุสิทธิ์ลดระดับโดยไม่คำนึงถึงสถานะ lease evaluate(null)เป็นแบบ fail-closed: รันไทม์ไม่ถูกอนุญาต ลายน้ำถูกใช้ และคำเตือนระบุ URL ราคา โฮสต์ที่ต้องการพฤติกรรม Core แบบไม่มีสิทธิ์ต้องสร้างเอนจิน Core โดยตรง- license การประเมินที่หมดอายุไม่มี grace และไม่มี fallback รันไทม์ถูกจำกัดและลายน้ำยังคงอยู่
checkRenewal()ถือว่า HTTP 404 เป็นคำตอบ “none available” ตามปกติ non-200 อื่นใดจะยกLicenseClientExceptionและdownload_urlที่ละเมิดนโยบายขาออกจะ fail closed ก่อนที่จะออกจากเมทอดได้- การตอบกลับสถานะที่ปลอมแปลง ถูกดัดแปลง เก่า nonce ผิด หรือ license ผิด จะไม่ให้
StatusResponseการตรวจสอบจะโยนSpectrumAuthenticationExceptionสถานะที่ลงลายเซ็นแต่revoked,expiredหรือreleasedจะตรวจสอบผ่านและปรากฏเป็นสัญญาณการลดระดับ (isLive()เป็น false) - การตอบกลับสถานะที่สร้างขึ้นสำหรับการแลกเปลี่ยนอื่นจะถูกปฏิเสธ:
response_typeที่ตรวจสอบแล้วต้องตรงกับ endpoint ที่เรียก FeatureGatefail closed เมื่อเกิดข้อผิดพลาดของ resolver ใด ๆ: รุ่นที่มีผลลดระดับเป็นcoreและไม่มีการมอบความสามารถพรีเมียมใดEnforcedEntitlementResolverเป็นแบบ fail-closed แบบ end to end: ข้อยกเว้นใด ๆ ในเชนของมันจะให้ผลลัพธ์ no-license (Core) และบันทึกข้อผิดพลาด PSR-3 ไม่ใช่การมอบพรีเมียม
พฤติกรรมโหมด FIPS
หัวข้อที่มีชื่อว่า “พฤติกรรมโหมด FIPS”ชั้น licensing ไม่เพิ่มนโยบายการเข้ารหัสลับของตนเอง ลายเซ็นของ license และสถานะเป็นการตรวจสอบ Ed25519 ที่ดำเนินการโดย host crypto provider ใน build ที่จำกัดด้วย FIPS อัลกอริทึมที่ provider ไม่อนุมัติจะล้มเหลวที่ขอบเขตการเข้ารหัสลับพร้อมข้อผิดพลาดที่ชัดเจน ไม่มีสิ่งใดลดระดับแบบเงียบ ๆ สิ่งเหล่านี้เป็นการอ้างความสามารถเกี่ยวกับโค้ด NextPDF: NextPDF ไม่ใช่โมดูลการเข้ารหัสลับที่ผ่านการตรวจสอบรับรอง ไม่ถือการรับรองใด และไม่มอบการรับรองใด
ความสอดคล้อง
หัวข้อที่มีชื่อว่า “ความสอดคล้อง”| เคลม | มาตรฐาน | ข้อ |
|---|---|---|
| ไฟล์ license และการตอบกลับสถานะเป็น JWS แบบ compact-serialization ตรวจสอบแบบ fail-closed | RFC 7515 | §3.1 |
| ลายเซ็นของ license และสถานะเป็น Ed25519 | RFC 8032 | §5.1 |
| x5c chain ในการตอบกลับที่ลงลายเซ็นตรวจสอบย้อนกลับไปยัง trust anchor ที่ถูก pin และคอมไพล์เข้ามา | RFC 5280 | §6.1 |
| ชุด SPKI pin ที่กำหนดค่าไว้ต้องมี backup pin สำหรับคีย์ที่ยังไม่ได้นำไปใช้งาน | RFC 7469 | §4.3 |
เคลมที่ตรวจสอบแล้ว (iss, aud, exp, nbf, iat) เป็นชื่อเคลมที่ลงทะเบียนไว้ | RFC 7519 | §4.1 |
ทุกข้อถูกถอดความ ไม่มีการนำข้อความ normative มาแสดงซ้ำ NextPDF ไม่อ้างการรับรองใด การรองรับไม่เท่ากับความสอดคล้อง และความสอดคล้องไม่เท่ากับการรับรอง โมดูลจัดพฤติกรรมของตนให้สอดคล้องกับข้อที่อ้างถึงในฐานะความสามารถ การยอมรับ license หรือ status envelope ถูกตัดสินโดยตัวตรวจสอบ pinned-root ของ NextPDF เอง ไม่ใช่โดยหน่วยงานภายนอก
บันทึกการพัฒนา
หัวข้อที่มีชื่อว่า “บันทึกการพัฒนา”- สร้าง
LicenseClientด้วย transport ที่บังคับใช้นโยบาย (โดยหลักคือSecurityAwareHttpClient) ไคลเอนต์ PSR-18 ดิบถูกปฏิเสธเมื่อสร้าง เพื่อให้ทราฟฟิก license ไม่มีวันถูกส่งโดยปราศจากการควบคุม anti-SSRF, no-redirect, byte-cap และการหมดเวลา - client nonce ที่ผู้เรียกกำหนดต้องถอดรหัสได้อย่างน้อย 16 bytes ของ entropy ต้นทางอ้างอิงขอบเขตนี้ใน RFC 8555 §6.5 ข้อนั้นอยู่นอก corpus ที่อ้างถึง ดังนั้นขอบเขตนี้จึงระบุไว้ที่นี่จากต้นทางผลิตภัณฑ์เท่านั้น
- จำกัดฟีเจอร์ผ่าน
FeatureGateอย่าแตกแขนงบนLicenseKey::$editionดิบ gate อ้างอิงเฉพาะรุ่นที่มีผลซึ่งถูกบังคับใช้เท่านั้นและ fail closed ไปที่core - อย่า switch บน
EntitlementStatus::PerpetualFallbackที่เลิกใช้แล้วในโค้ดใหม่ ให้ทดสอบisDowngradedToCore()หรือจับคู่DowngradedToCoreแทน - ปฏิบัติต่อการปฏิเสธความสามารถเป็น payload การแก้ไข นำเสนอบริบทที่มีโครงสร้างและ URL การอัปเกรดแก่ผู้เรียก แทนที่จะยุบมันเป็นข้อผิดพลาดทั่วไป
- โมดูลนี้เกี่ยวข้องกับฟังก์ชันการเข้ารหัสลับ ให้ปฏิบัติต่อมันว่าเป็นเรื่องอ่อนไหวด้านความปลอดภัยในการทบทวนของคุณเอง เงื่อนไขด้านความจุและ seat ถูกกำกับโดยข้อตกลง license ไม่ใช่โดยการบังคับใช้ในรันไทม์ เอกสารอ้างอิงนี้ไม่ใช่ความเห็นทางกฎหมาย ปรึกษาที่ปรึกษาด้านการปฏิบัติตามข้อกำหนดและกฎหมายของคุณเอง
ขอบเขตการเผยแพร่
หัวข้อที่มีชื่อว่า “ขอบเขตการเผยแพร่”หน้านี้บันทึกเฉพาะพฤติกรรมที่สังเกตได้จากภายนอกและพื้นผิว API สาธารณะที่รองรับเท่านั้น เส้นทาง namespace ภายใน คลาสตัวช่วย ตารางกลไก ชื่อไฟล์ runbook และ prefix ของ ticket อยู่นอกขอบเขต
ดูเพิ่มเติม
หัวข้อที่มีชื่อว่า “ดูเพิ่มเติม”- Licensing — NextPDF Enterprise — หน้าความสามารถพร้อมคำแนะนำการตั้งค่าและการผสานการทำงาน
- Billing — เอกสารอ้างอิงเชิงลึก — ระดับแผน นโยบายการใช้เกิน และการยกยอด
- SaaS — เอกสารอ้างอิงเชิงลึก — พื้นผิวบริการแบบหลายผู้เช่าที่ route map ปกป้อง
- Branding — เอกสารอ้างอิงเชิงลึก — กลยุทธ์การแสดงแบรนด์ที่ตัวประเมินแก้ไข