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

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

ชนิดทั้งหมดอยู่ภายใต้ 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ไม่มีอำนาจการแสดงแบรนด์เพียงหนึ่งเดียว มีเพียงช่องทางการประเมินเท่านั้นที่ใส่ลายน้ำ
EntitlementResultvalue object แบบอ่านอย่างเดียวถือสถานะ รุ่น ช่องทาง โหมดการแสดงแบรนด์ แฟล็ก runtime/update/support และคำเตือนที่เป็นทางเลือกไม่มีตัวช่วย: isFullyActive(), isExpired(), isDowngradedToCore(), shouldApplyEvaluationBranding()
EntitlementStatusenum ที่มีค่าเป็น stringActive, GracePeriod, DowngradedToCore, EvaluationExpired, NoLicenseไม่มีPerpetualFallback ยังถูกเก็บไว้แต่เลิกใช้แล้ว คงไว้เพียงเพื่อให้ผู้ใช้ก่อน 6.0 ยังคอมไพล์ได้
FeatureGate::hasCapability()CapabilityCode $capabilityตรวจสอบความสามารถเทียบกับรุ่นที่มีผลซึ่งถูกบังคับใช้และสถานะแพ็กboolไม่มีfail-closed ไปที่ core เมื่อเกิดข้อผิดพลาดของ resolver ใด ๆ
FeatureGate::requireCapability()CapabilityCode $capabilityผ่านแบบเงียบ ๆ หรือโยนพร้อมบริบท upsell ที่มีโครงสร้างvoidSpectrumAuthenticationException SPEC-LIC-001 (ไม่มีสิทธิ์) หรือ SPEC-LIC-002 (แพ็กหมดอายุ)บริบทถือ required_capability, required_pack, current_packs, upgrade_info_url
FeatureGate::isFeatureEnabled(), ::requireFeature()string $featureการตรวจสอบตัวระบุฟีเจอร์แบบเดิมbool / voidSpectrumAuthenticationException SPEC-AUTH-007 (เส้นทาง require)ความเข้ากันได้แบบเดิม แนะนำให้ใช้การตรวจสอบความสามารถแทน
ตัวเข้าถึงของ FeatureGateไม่มีการสำรวจข้อมูล licenseแตกต่างกันไปไม่มีcurrentEdition(), isLicenseValid(), isInGracePeriod(), getActivePacks(), trialPolicy()
CapabilityCodeenum ที่มีค่าเป็น stringตัวระบุความสามารถแบบ canonical (core.*, pro.*, enterprise.*, pack.*)ไม่มีisPack(), packName(), minimumEdition(), forEdition()
CapabilityRegistryLicenseKey, รูปแบบเส้นทางการแก้ไขจากเส้นทางเป็นความสามารถและการค้นหาแพ็กก่อน dispatchแตกต่างกันไปไม่มีregisterDefaultRoutes() ครอบคลุมเส้นทางบริการที่บันทึกไว้
LicenseKeyvalue object แบบอ่านอย่างเดียวเคลม license ที่แจงและตรวจสอบแล้วไม่มีisExpired(), isInGracePeriod(), isFullyExpired(), hasFeature(), hasCapability(), activePackNames(); maxSlots เป็นข้อผูกพันตามสัญญาเท่านั้น
LicenseValidator::buildVerifiedLicenseKey()array $dataสร้าง LicenseKey ที่มีชนิดจาก payload ที่ตรวจสอบแล้วLicenseKeySpectrumAuthenticationException SPEC-AUTH-001 เมื่อละเมิด schemaรองรับ schema 2.0, 1.0 และ payload แบบเดิม
PackDefinition / PackRegistryvalue object แบบอ่านอย่างเดียวสถานะแพ็ก add-on พร้อมการหมดอายุและ grace ที่เป็นอิสระแตกต่างกันไปไม่มีisActive(), isFullyExpired(), activePacks(), activeCapabilities()
TrialPolicybool $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 / EnforcementOutcomeenum + value object แบบอ่านอย่างเดียวActive, Grace, DowngradedToCore พร้อมเหตุผลที่แม่นยำไม่มีแต่ละเหตุผลจับคู่กับหนึ่งการตัดสินแบบกำหนดได้แน่นอน
Runtime\EntitlementResolver::currentEntitlement()ไม่มีอินเทอร์เฟซ: สิทธิ์ที่ถูกบังคับใช้ซึ่งรันไทม์ให้บริการEntitlementResultกำหนดโดยการนำไปใช้EnforcedEntitlementResolver ประกอบ cache สถานะ นโยบาย และตัวประเมิน แบบ fail-closed ไปที่ Core
LicenseStateCache::get(), ::getOrThrow()bool $forceRefresh = falsecache ของ license ที่ตรวจสอบแล้วซึ่งรองรับ gate?LicenseKeygetOrThrow(): 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 ที่ส่งไปStatusResponseLicenseClientException (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\StatusResponsevalue object แบบอ่านอย่างเดียวสถานะที่ลงลายเซ็นซึ่งตรวจสอบแล้วไม่มีisLive() เป็น false เมื่อ revoked / expired / released; ถือ leaseExpiresAt จำนวน slot และสแนปช็อตสิทธิ์
LicenseChannelMode / OnlineMode / OnlinePolicyenum + value object แบบอ่านอย่างเดียวเคลมช่องทางและนโยบายออนไลน์ไม่มีsigned_source เทียบกับ ioncube; โหมดออนไลน์ required / optional / disabled พร้อม intervalDays และ leaseDays
LicenseEditionenum ที่มีค่าเป็น stringCore, Pro, Enterpriseไม่มีsatisfies() นำลำดับชั้นของขั้นไปใช้
public function __construct(private ?EvaluationBrandingConfig $evaluationBrandingConfig = null)
public function evaluate(?LicenseKey $license, ?DateTimeImmutable $now = null): EntitlementResult
public function evaluateEnforced(?LicenseKey $license, EnforcementOutcome $outcome): EntitlementResult
public function resolveBrandingMode(?LicenseKey $license, ?DateTimeImmutable $now = null): BrandingMode
public function resolveBrandingStrategy(?LicenseKey $license, ?DateTimeImmutable $now = null): BrandingStrategy
public function __construct(private readonly LicenseStateCache $licenseCache, private readonly EntitlementResolver $entitlementResolver, private readonly string $upgradeInfoUrl = self::DEFAULT_UPGRADE_URL)
public function isFeatureEnabled(string $feature): bool
public function requireFeature(string $feature): void
public function currentEdition(): ?string
public function isLicenseValid(): bool
public function isInGracePeriod(): bool
public function hasCapability(CapabilityCode $capability): bool
public function requireCapability(CapabilityCode $capability): void
public function getActivePacks(): array
public function trialPolicy(): TrialPolicy
public 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): StatusResponse
public function heartbeat(string $licenseJws, string $deploymentId, ?string $machineFingerprintHash = null, ?string $expectedLicenseId = null, ?string $clientNonce = null): StatusResponse
public function deactivate(string $licenseJws, string $deploymentId, ?string $machineFingerprintHash = null, ?string $expectedLicenseId = null, ?string $clientNonce = null): StatusResponse
public function verifyOnline(string $licenseJws, string $deploymentId, ?string $machineFingerprintHash = null, ?string $expectedLicenseId = null, ?string $clientNonce = null): StatusResponse
public function getPinSet(): ?PinSet
public 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 ที่เรียก
  • FeatureGate fail closed เมื่อเกิดข้อผิดพลาดของ resolver ใด ๆ: รุ่นที่มีผลลดระดับเป็น core และไม่มีการมอบความสามารถพรีเมียมใด
  • EnforcedEntitlementResolver เป็นแบบ fail-closed แบบ end to end: ข้อยกเว้นใด ๆ ในเชนของมันจะให้ผลลัพธ์ no-license (Core) และบันทึกข้อผิดพลาด PSR-3 ไม่ใช่การมอบพรีเมียม

ชั้น licensing ไม่เพิ่มนโยบายการเข้ารหัสลับของตนเอง ลายเซ็นของ license และสถานะเป็นการตรวจสอบ Ed25519 ที่ดำเนินการโดย host crypto provider ใน build ที่จำกัดด้วย FIPS อัลกอริทึมที่ provider ไม่อนุมัติจะล้มเหลวที่ขอบเขตการเข้ารหัสลับพร้อมข้อผิดพลาดที่ชัดเจน ไม่มีสิ่งใดลดระดับแบบเงียบ ๆ สิ่งเหล่านี้เป็นการอ้างความสามารถเกี่ยวกับโค้ด NextPDF: NextPDF ไม่ใช่โมดูลการเข้ารหัสลับที่ผ่านการตรวจสอบรับรอง ไม่ถือการรับรองใด และไม่มอบการรับรองใด

เคลมมาตรฐานข้อ
ไฟล์ license และการตอบกลับสถานะเป็น JWS แบบ compact-serialization ตรวจสอบแบบ fail-closedRFC 7515§3.1
ลายเซ็นของ license และสถานะเป็น Ed25519RFC 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 อยู่นอกขอบเขต