콘텐츠로 이동
getnextpdf.com

Enterprise 에디션

서명 검증 — 심층 참조

이 페이지는 NextPDF Enterprise의 AdES 검증 측(verify-side) 표면에 대한 심화 레퍼런스입니다. 진입점은 NextPDF\Enterprise\Security\Validation\AdESValidationEngine입니다. 이 엔진은 basic, with-time, long-term, archival 타임스탬프 검사에 대한 NextPDF의 ETSI 모델 기반 검증 흐름을 구현합니다. 즉 basic 검증, 시간을 고려한 검증, 장기 데이터를 고려한 검증, archival DocTimeStamp 커버리지 체인 검증입니다. 결과는 ETSI URN 문자열 값을 갖는 MainIndicationSubIndication enum 케이스를 담은 ValidationReport 값입니다. 이 페이지에서 함께 문서화하는 지원 표면은 다음과 같습니다. SignatureDataExtractor SPI와 그 구현인 CmsSignatureDataExtractor, 바이트 수준 스캐너인 PdfSignatureDictionaryScanner, 경로 검증 표면인 NextPDF\Enterprise\Security\Pki, 그리고 BatchSignatureValidator입니다. 워크플로 수준의 안내는 서명 검증: AdES / PAdES 암호학적 검증 측을 참조하세요.

이 기능은 NextPDF Enterprise(nextpdf/enterprise)에 포함되며 Enterprise 등급 라이선스 봉투로 활성화됩니다. 해당 권한이 없는 배포 환경에서는 이 기능의 클래스가 로드되지 않습니다. 에디션을 비교하고 라이선스를 받으세요.

심볼매개변수기본 동작반환예외 또는 실패 방식비고
AdESValidationEngine::__construct11개의 선택적 매개변수: ?PathValidatorInterface $chainValidator, ?SignatureDataExtractor $extractor, ClockInterface $clock, ?LoggerInterface $logger, string $defaultPolicy, NetworkPolicy $networkPolicy, 그리고 5개의 선택적 검증기 협력자모든 기본값은 fail-closed입니다: 엔진 클록 위의 Pki 경로 검증기, extractor 없음, TSA 트러스트 저장소 없음새 엔진예외를 던지지 않음트러스트 저장소가 없으면 TSA 체인 평가는 신뢰되지 않음(untrusted)으로 보고되며, 이는 INDETERMINATE로 매핑되고 결코 통과가 되지 않습니다
AdESValidationEngine::validateBasicstring $signedData, string $signatureBasic 검증: 포맷, 다이제스트, 암호, 취약 알고리즘, 체인, provenance로 게이트된 폐기(revocation)ValidationReport예외를 던지지 않음; 추출 및 경로 실패는 fail-closed 리포트로 매핑됨extractor가 없으면 가드 검사만 수행; 엣지 케이스 참조
AdESValidationEngine::validateWithTimestring $signedData, string $signature, DateTimeImmutable $claimedTime먼저 basic 검증; 인증서 유효 창과 폐기를 주장된 시간과 대조ValidationReport예외를 던지지 않음속성이 존재하면 엄격한 서명 타임스탬프 게이트 적용; $claimedTime이 시간 앵커로 유지됨
AdESValidationEngine::validateWithLongTermDatastring $signedData, string $signature, array $dssData (certs/ocsps/crls)Basic 통과 필요; genTime 기준 TSA로 무장한 서명 타임스탬프 게이트; POE, DSS 폐기, archival 게이트ValidationReport예외를 던지지 않음내장 데이터가 불충분한 NetworkPolicy::STRICT_OFFLINEINDETERMINATE / TRY_LATER를 반환함
AdESValidationEngine::validateArchivalTimestampChainstring $pdfBytes, array $dssData = [], ?TrustAnchorStoreInterface $anchors = null정확한 ByteRange 바이트 위의 증거 기반 DocTimeStamp 커버리지 체인ValidationReport적대적 바이트에도 예외를 던지지 않음TOTAL_PASSED는 EOF를 커버하는 신뢰된 체인에 한함
MainIndication문자열 기반 enum, 세 개의 케이스ETSI URN 값; 아래 케이스 목록 참조
SubIndication문자열 기반 enum, 열다섯 개의 케이스ETSI URN 값; 아래 케이스 목록 참조
ValidationReport::__constructMainIndication $mainIndication, ?SubIndication $subIndication, DiagnosticData $diagnosticData, DateTimeImmutable $validationTime, string $validationPolicy = ''불변(final readonly) 검증 결과새 리포트예외를 던지지 않음isPassed(), isFailed(), isIndeterminate(), toArray()
DiagnosticData::__constructarray $certificateChain, array $timestamps, array $revocationData, string $validationPolicy, string $signatureFormat, array $warnings (모두 기본값 있음)불변 증거 컨테이너; 감사 추적 전용새 값예외를 던지지 않음toArray()는 보고용으로 참조를 직렬화함
SignatureDataExtractor::extractstring $signedData, string $signatureSPI: CMS를 파싱하고 검증 구성 요소를 추출ExtractedSignatureData서명을 파싱할 수 없을 때 SignatureExtractionException인터페이스; ASN.1 파싱을 엔진과 분리함
CmsSignatureDataExtractor::extractstring $signedData, string $signature추출과 함께 분리형 PAdES basic 서명을 암호학적으로 검증ExtractedSignatureDataCMS를 전혀 파싱할 수 없을 때에만 SignatureExtractionException암호 또는 바인딩 실패 시 cryptoValid / hashValid가 false인 데이터를 반환하며, 그로 인해 예외를 던지지 않음
PdfSignatureDictionaryScanner::scanstring $pdfBytes정밀 맞춤 안티 스푸핑 교차 검사를 갖춘 /ByteRange + /Contents 딕셔너리의 바이트 수준 스캔list<PdfSignatureOccurrence>전역적(total); 결코 예외를 던지지 않음; 잘못된 후보는 건너뜀커버리지 종료 지점 기준, 가장 이른 것부터 정렬됨
PathValidatorInterface::validatearray $chain, ?DateTimeImmutable $validationTime = null, array $initialPolicies = []정책 처리를 포함한 RFC 5280 §6.1.4 경로 검증PathValidationResult구조적으로 유효하지 않은 체인이나 위반된 적대적 한계에 대해 PathValidationException체인은 엔드 엔티티가 먼저, 앵커가 마지막
PathValidatorInterface::validateWithAiaChasingarray $chain, ?DateTimeImmutable $validationTime = null누락된 중간 인증서의 AIA 해석 후 검증PathValidationResultPathValidationException페치는 타임아웃과 바이트 한계로 제한됨
CertificateChainValidator생성자: 엔진, PathValidationOptions, 클록, 로거; 정적 withDefaults()기본 적대적 한계를 갖춘 SPI 구현두 메서드 모두 PathValidationResult 반환PathValidationExceptionOpenSSLCertificate를 PEM으로 내보낼 수 없을 때도 던져짐
PathValidationOptions::__construct한계값(maxDepth, maxPolicyFanout, fetchTimeoutSeconds, fetchSizeCapBytes)과 정책 플래그, ?TrustAnchorStoreInterface $trustAnchors, bool $requireTrustedAnchor깊이 32, 팬아웃 64, 페치당 5초, 페치당 10 MiB; 모든 플래그 false새 옵션예외를 던지지 않음팩토리: defaults(), strict(), withTrustAnchors()
PathValidationResult::__constructbool $valid, string $trustAnchorFingerprint, DateTimeImmutable $validatedAt, array $validPolicies, ?RevocationCheckResult $revocation, bool $trustAnchorTrusted, array $fetchedCertificates, array $failureReasons불변 결과; trustAnchorTrusted는 기본 false (fail-closed)새 값예외를 던지지 않음트러스트 멤버십은 구조적 유효성과 구별됨
PolicyProcessor생성자: PolicyTreeState $state, PathValidationOptions $options; processCertificate(string $certDer, int $depth, bool $selfIssued), finalizeWrapUp(), tree()RFC 5280 §6.1.4 정책 트리 확장, 매핑, 마무리(wrap-up)void / list<non-empty-string> / PolicyTree모든 정책 처리 실패에 대해 PathValidationException (fail-closed)마무리는 anyPolicy를 제외한 생존 정책 OID를 반환함
PolicyTreeattach(PolicyTreeNode $node, PathValidationOptions $options), enforceFanout(...), remove(...), 그리고 읽기 쿼리깊이 인덱스를 갖춘 valid_policy_tree 상태메서드마다 다름활성 리프 개수가 팬아웃 한계를 초과하면 PathValidationExceptionANY_POLICY_OID(2.5.29.32.0)를 노출함
NameConstraintsChecker::processCertificatestring $certDer, bool $applyNameCheckRFC 5280 §6.1.4(g)에 따라 허용 / 제외 서브트리를 누적하고 강제함void위반된 서브트리, 제약 내 지원되지 않는 GeneralName 형태, 또는 위반된 한계에 대해 PathValidationException비교 불가능한 이름은 fail-closed로 처리됨
TrustAnchorStoreInterface::containsFingerprintstring $anchorDerSha256Hex앵커의 DER 인증서에 대한 소문자 hex SHA-256 기준 멤버십bool예외를 던지지 않음경로 검증기가 참조하는 트러스트 심(seam)
BatchSignatureValidator::validatearray $inputs (list<DocumentSignatureInput>)배치별 폐기 캐싱을 갖춘 다중 문서 서명 검증BatchValidationReport빈 목록에 대해 InvalidArgumentException; 리소스 가드가 1000개 초과 문서 배치를 거부함NextPDF\Enterprise\Signature에 위치함
final class AdESValidationEngine
public function validateBasic(string $signedData, string $signature): ValidationReport
public function validateWithTime(
string $signedData,
string $signature,
DateTimeImmutable $claimedTime,
): ValidationReport
public function validateWithLongTermData(
string $signedData,
string $signature,
array $dssData,
): ValidationReport
public function validateArchivalTimestampChain(
string $pdfBytes,
array $dssData = [],
?TrustAnchorStoreInterface $anchors = null,
): ValidationReport
public function validate(
array $chain,
?DateTimeImmutable $validationTime = null,
array $initialPolicies = [],
): PathValidationResult;
public function validateWithAiaChasing(
array $chain,
?DateTimeImmutable $validationTime = null,
): PathValidationResult;
public static function withDefaults(
?ClockInterface $clock = null,
?AiaChaser $aiaChaser = null,
?LoggerInterface $logger = null,
): self
public function containsFingerprint(string $anchorDerSha256Hex): bool;
public function extract(string $signedData, string $signature): ExtractedSignatureData;
public function scan(string $pdfBytes): array
public function validate(array $inputs): BatchValidationReport

Indication enum. MainIndication 케이스: TOTAL_PASSED, TOTAL_FAILED, INDETERMINATE. 백킹 값은 urn:etsi:019102:mainindication:total-passed 패턴(소문자, 하이픈 구분)을 따릅니다. SubIndication 케이스: HASH_FAILURE, SIG_CRYPTO_FAILURE, REVOKED, EXPIRED, NOT_YET_VALID, NO_POE, TRY_LATER, CERTIFICATE_CHAIN_GENERAL_FAILURE, FORMAT_FAILURE, REVOKED_CA_NO_POE, CRYPTO_CONSTRAINTS_FAILURE, POLICY_PROCESSING_FAILURE, REVOCATION_OUT_OF_BOUNDS_NO_POE, NO_SIGNING_CERTIFICATE_FOUND, TIMESTAMP_ORDER_FAILURE. 각각은 정확한 케이스 이름과 함께 urn:etsi:019102:subindication:<CASE_NAME>로 백킹됩니다.

  • 리포트 인, 리포트 아웃. 네 개의 엔진 진입점은 적대적 입력에 대해 예외를 던지는 대신 ValidationReport를 반환합니다. 잡힌 SignatureExtractionException은 가드 경로로 라우팅되고, 잡힌 PathValidationExceptionTOTAL_FAILED / CERTIFICATE_CHAIN_GENERAL_FAILURE로 매핑됩니다.
  • Basic 검증 순서. 포맷 검사가 먼저입니다. 파싱 불가능한 구조는 TOTAL_FAILED / FORMAT_FAILURE입니다(EN 319 102-1 §5.3.4). 그다음 다이제스트(HASH_FAILURE)와 암호학적 검증(SIG_CRYPTO_FAILURE)이 이어지며, 이는 EN 319 102-1 §5.2.7.4의 빌딩 블록 결과와 일치합니다. 다이제스트는 검증기가 재계산하여 messageDigest signed 속성과 비교합니다(RFC 5652 §5.6). 생산자가 제공한 다이제스트는 결코 신뢰하지 않습니다.
  • 취약 알고리즘은 등급이 낮아집니다. SHA-1로 검증되거나 취약한 서명 인증서 바인딩으로 검증되는 서명은 INDETERMINATE / CRYPTO_CONSTRAINTS_FAILURE를 반환하며 결코 TOTAL_PASSED가 되지 않습니다. 시간 경로는 이를 재확인하여 취약한 서명이 시간 유효 통과로 세탁되지 않도록 합니다.
  • 폐기 provenance 게이트. Extractor의 폐기 플래그는 extractor가 실제로 폐기 검사를 수행한 경우(revocationChecked가 true)에만 참조됩니다. 검사되지 않은 기본값은 “폐기되지 않음이 확인됨”도 아니고 REVOKED 트리거도 아닙니다. 폐기 증거는 DSS 경로로 확립됩니다.
  • 비통과 전파. 시간 및 장기 경로는 비통과 basic 결과를 결코 상향하지 않습니다. 한 가지 예외가 존재합니다: basic의 INDETERMINATE / REVOKED$claimedTime과 대조하여 해소되며, 주장된 시간 또는 그 이전의 폐기는 TOTAL_FAILED / REVOKED입니다. 이는 폐기 관련 미결정을 시간 증거로 해소하는 EN 319 102-1 §5.3.4 패턴을 반영합니다. 비교를 수행할 수 없을 때에는 해소되지 않은 basic 리포트가 그대로 전파됩니다.
  • 엄격한 서명 타임스탬프 바인딩 (fail-closed; BC 파괴). CMS가 id-aa-timeStampToken unsigned 속성을 담고 있으면, 그 존재만으로 시간 및 장기 경로 모두에서 강제가 트리거됩니다. warn-only 모드는 없습니다. 카디널리티는 정확히 하나의 속성에 정확히 하나의 값이어야 합니다(EN 319 122-1 §5.3). 그 외의 모든 형태는 TOTAL_FAILED / FORMAT_FAILURE입니다. 토큰은 끝에서 끝까지 암호학적으로 검증되어야 합니다. 검증 불가능한 토큰, 파서 차이(parser-differential) 충돌, 또는 imprint 불일치는 INDETERMINATE / TIMESTAMP_ORDER_FAILURE입니다. 지원되지 않거나 SHA-1 imprint 알고리즘은 INDETERMINATE / CRYPTO_CONSTRAINTS_FAILURE입니다. 바인딩 규칙은 RFC 3161 Appendix A입니다: 토큰의 messageImprint는 SignerInfo signature 값 옥텟의 해시와 같아야 하며, 상수 시간으로 비교됩니다.
  • 장기 경로 게이트. clause-5.4로 주석된 경로에서 바인딩된 서명 타임스탬프는 추가로 토큰의 genTime에서 TSA 인증서 평가를 받습니다. 신뢰되지 않은 앵커는 INDETERMINATE / CERTIFICATE_CHAIN_GENERAL_FAILURE이며 결코 통과가 아닙니다. 내장 DSS 자료가 불충분한 NetworkPolicy::STRICT_OFFLINEINDETERMINATE / TRY_LATER를 반환합니다. 존재 증명(proof-of-existence), DSS 폐기, archival 체인 결과는 각각 매핑된 하위 표시와 함께 INDETERMINATE로 단락(short-circuit)됩니다.
  • Archival 체인 게이트. DocTimeStamp가 없으면 INDETERMINATE / NO_POE입니다. 구조적으로 부적합한 ByteRange는 TOTAL_FAILED / FORMAT_FAILURE입니다. 각 토큰은 검증되어야 하고, 그 imprint를 정확히 ByteRange가 커버하는 바이트에 바인딩해야 하며, TSA-at-genTime 파셋 매핑(EXPIRED, NOT_YET_VALID, REVOKED_CA_NO_POE, CERTIFICATE_CHAIN_GENERAL_FAILURE, 또는 strict-offline 하의 TRY_LATER)을 통과해야 합니다. 순서가 강제됩니다: 비감소 genTime, 엄격히 진행되는 커버리지, 그리고 이전 토큰의 /Contents 구멍을 담는 후속 토큰. 가장 최근 토큰은 최종 바이트를 커버해야 합니다. 뒤에 남는 바이트는 TIMESTAMP_ORDER_FAILURE입니다. 검증기 클록보다 300초 넘게 앞선 genTimeTIMESTAMP_ORDER_FAILURE입니다.
  • 진단은 결코 결정하지 않습니다. DiagnosticData::$timestamps의 존재 증명 항목은 감사 추적 전용입니다. 그것들은 결코 표시를 바꾸지 않으며, 누산기는 모든 진입점에서 초기화됩니다.
  • Pki 한계가 암호보다 먼저입니다. PathValidationOptions 한계(깊이 32, 정책 팬아웃 64, 페치당 5초와 10 MiB)는 비싼 작업 전에 검사됩니다. PathValidationResult::$trustAnchorTrusted$valid와 구별됩니다. requireTrustedAnchor는 확정되지 않은 종점을 무효로 만듭니다. strict()requireExplicitPolicy, 하드 페일 폐기 전송, 그리고 requireTrustedAnchor를 활성화합니다. 경로 유효성은 RFC 5280 §6.1에 따라 앵커 상대적입니다: 유효한 경로는 입력으로 제공된 트러스트 앵커에서 시작합니다.
  • 배치 표면. BatchSignatureValidator::validate()는 빈 목록에 대해 InvalidArgumentException을 던지고, 리소스 가드를 통해 1000개 초과 문서 배치를 거부합니다. 그 파이프라인에서 모든 암호학적 검증은 PHP가 담당합니다.
  • 기본 엔진에는 extractor가 없습니다. new AdESValidationEngine()은 가드 검사만 수행합니다: 빈 서명 또는 빈 signed 데이터는 TOTAL_FAILED이고, 비어 있지 않은 모든 쌍은 INDETERMINATE / NO_SIGNING_CERTIFICATE_FOUND로 해소되며 결코 TOTAL_PASSED가 되지 않습니다. 암호학적 검증을 얻으려면 NextPDF\Enterprise\Security\Validation\CmsSignatureDataExtractor를 주입하세요.
  • 기본 TSA 트러스트 검사에는 저장소가 없습니다. 그러면 모든 TSA 체인이 신뢰되지 않음으로 보고되므로, archival 및 장기 서명 타임스탬프 결과는 INDETERMINATE로 유지됩니다. validateArchivalTimestampChain(..., $anchors) 또는 구성된 TsaCertificateAtGenTimeCheck를 통해 앵커를 제공하세요.
  • $pdfBytes. validateArchivalTimestampChain('')TOTAL_FAILED / FORMAT_FAILURE를 반환합니다.
  • 수정 전 서명 타임스탬프는 통과할 수 없습니다. 엄격한 바인딩 수정 이전의 NextPDF 버전이 생성한 토큰은 다른 입력을 imprint했습니다. 그것들은 Appendix A 바인딩을 영구히 실패합니다. 긍정적 결과를 복원하려면 다시 서명하고 다시 타임스탬프하세요. 이는 의도적이고 문서화된 BC 파괴입니다.
  • 중복 또는 겹치는 DocTimeStamp. 동일 리비전 중복, 동등하거나 겹치는 커버리지, 또는 이전 토큰의 서명 구멍을 담지 않는 후속 토큰은 순서 게이트를 실패합니다.
  • 스캐너는 전역적이고 바이트 수준입니다. scan()은 잘못되거나 스푸핑된 후보를 조용히 건너뜁니다. 콘텐츠 스트림 내부의 미끼 /ByteRange는 거부됩니다. 간접 객체를 해석하거나 상호 참조 테이블을 순회하지 않습니다.
  • 도달 가능성이 아니라 커버리지. validateArchivalTimestampChain()은 파일 끝까지의 암호학적 바이트 범위 커버리지를 증명합니다. 객체 수준의 도달 가능성 분석(예: 커버된 리비전 내부에서 재지정된 문서 루트)은 범위 외로 선언됩니다.
  • Pki 직접 사용은 예외를 던집니다. PathValidatorInterface 구현을 직접 호출하면 구조적으로 유효하지 않은 체인, 위반된 한계, 지원되지 않는 제약 형태, 그리고 OpenSSLCertificate 핸들의 PEM 내보내기 실패에 대해 PathValidationException이 표면화됩니다. 엔진은 이 클래스를 잡습니다. 여러분 자신의 호출자는 이를 처리해야 합니다.

검증 측은 SHA-2를 사용하는 RSA PKCS#1 v1.5와 P-256/P-384/P-521 상의 ECDSA를 수용합니다. RSASSA-PSS, EdDSA, SHA-3 토큰은 지원되지 않음으로 fail-closed됩니다. SHA-1은 CRYPTO_CONSTRAINTS_FAILURE로 등급이 낮아집니다. Enterprise FIPS 140-3 크립토 정책 프로파일(보안 모듈과 함께 문서화됨) 하에서, 이 제약은 어떤 알고리즘이 수용되는가에 적용됩니다. 검증 흐름 자체 — 다이제스트 재계산, 서명 검사, 바인딩, 경로 검증 — 는 변경되지 않습니다. NextPDF는 FIPS 140-3 인증서를 보유하고 있지 않으며 이 페이지는 어떤 것도 주장하지 않습니다.

주장표준조항
Basic Signature 검증은 time-stamp 및 with-time 검증을 위한 재사용 가능한 빌딩 블록이다.ETSI EN 319 102-1§5.3.1
무결성 실패는 HASH_FAILURE로 매핑되고, 실패한 서명 검사는 SIG_CRYPTO_FAILURE로 매핑된다.ETSI EN 319 102-1§5.2.7.4
포맷 검사가 먼저 실행되며 비통과는 프로세스를 멈춘다.ETSI EN 319 102-1§5.3.4
폐기 관련 미결정은 시간 증거로 해소될 수 있다.ETSI EN 319 102-1§5.3.4
유효한 인증 경로는 입력으로 제공된 트러스트 앵커에서 시작한다.RFC 5280§6.1
검증기가 콘텐츠 다이제스트를 재계산하며, 그것은 messageDigest signed 속성과 같아야 한다.RFC 5652§5.6
서명 타임스탬프의 messageImprint는 SignerInfo signature 필드 값을 해시한다.RFC 3161Appendix A
signature-time-stamp 속성은 정확히 하나의 AttributeValue를 담는다.ETSI EN 319 122-1§5.3

모든 조항은 의역된 것이며, NextPDF는 규범 텍스트를 재현하지 않습니다. NextPDF는 어떠한 AdES / PAdES 적합성 또는 인증 주장도 하지 않습니다. 표준에 대한 지원은 그에 대한 적합성이 아니며, 적합성은 인증이 아닙니다 — NextPDF는 어떤 인증도 보유하지 않으며 어떤 인증도 부여하지 않습니다. 엔진은 인용된 검증 절차를 역량(capability)으로 구현합니다. 이는 적격(qualified)이거나 인증된 검증 서비스가 아니며, TOTAL_PASSED 리포트는 암호학적 진술이지 법적 판정이 아닙니다. enum 값은 리포트 데이터의 상호운용성을 위해 ETSI URN 식별자 패턴을 재사용하며, 그 재사용은 어떤 보증도 주장하지 않습니다.

  • 조항 레이블 매핑. 패키지 소스는 진입점을 EN 319 102-1 조항 5.2, 5.3, 5.4로 주석합니다. 컴플라이언스 코퍼스는 Basic Signature 검증 프로세스 자체를 조항 5.3에, 암호학적 빌딩 블록을 5.2.7.4에 둡니다. 이 페이지는 조회된 조항 번호를 인용하며, 레이블이 아니라 동작 계약이 권위를 갖습니다.
  • 결정론적 테스트. 모든 시간 비교는 주입된 PSR-20 ClockInterface를 통해 흐릅니다. 창 검사, 300초 genTime 스큐 경계, CRL 신선도 결정을 테스트하려면 고정 클록을 주입하세요.
  • 컴포지션. 모든 엔진 협력자는 생성자로 주입되며 선택적이고, fail-closed 기본값을 갖습니다. 기본 경로 검증기는 엔진 클록 위의 CertificateChainValidator::withDefaults()입니다. 기본 옵션은 적합하고 제약 없는 입력에 대해 정책 및 이름 제약 처리를 no-op로 유지합니다.
  • 네임스페이스. 엔진 표면은 NextPDF\Enterprise\Security\Validation에, 경로 검증 표면은 NextPDF\Enterprise\Security\Pki에, 배치 오케스트레이터는 NextPDF\Enterprise\Signature에 위치합니다.
  • 리포트 위생. 리포트는 불변이며 toArray()를 통해 직렬화 가능합니다. 진단 컨텍스트는 각 진입점에서 초기화되므로, 리포트는 동일 엔진 인스턴스의 이전 실행에서 나온 증거를 결코 담지 않습니다.

이 페이지는 외부에서 관찰 가능한 동작과 지원되는 공개 API 표면만을 문서화합니다. 내부 네임스페이스 경로, 헬퍼 클래스, 메커니즘 표, 런북 파일명, 티켓 접두사는 범위 외입니다.