Enterprise 에디션
FIPS 140-2/3 암호화 정책 및 자체 테스트
한눈에 보기
섹션 제목: “한눈에 보기”NextPDF Enterprise는 서명 또는 암호화 작업이 선택할 수 있는 암호화 옵션을 Federal Information Processing Standards(FIPS) 승인 집합으로 제한하며, 그 집합을 벗어난 선택은 모두 거부합니다. 런타임 가드는 작업이 실행되기 전에 각 해시, 서명 알고리즘 식별자, 암호화 알고리즘, 키 강도를 검사합니다. 전원 인가 자체 테스트 모음은 프로세스가 시작될 때 한 번 실행됩니다. known-answer 테스트가 하나라도 실패하면 모듈은 오류 상태로 진입합니다. 이 페이지는 그 동작을 설명합니다. 정책이 무엇을 허용하는지, 가드가 무엇을 거부하는지, 자체 테스트가 무엇을 다루는지, 그리고 인증에 대한 명시적 입장입니다.
NextPDF Enterprise는 컴플라이언스를 지원합니다. 인증된 암호화 모듈은 아닙니다. 인증을 받지 않았다는 명시적 입장은 보안 및 컴플라이언스를 참조하십시오.
프런트매터에 사전 요구 사항이 나열되어 있으며, 사전 요구 사항에서 이를 반복합니다.
가용성 및 라이선스
섹션 제목: “가용성 및 라이선스”이 기능은 NextPDF Enterprise(nextpdf/enterprise)에 포함되어 제공되며 Enterprise 계층 라이선스 봉투로 활성화됩니다. 해당 권한이 없는 배포는 이 기능의 클래스를 로드하지 않습니다. 에디션을 비교하고 라이선스를 받으십시오.
NextPDF Core와 NextPDF Pro는 FIPS 모드 프로파일을 제공하지 않습니다. 가드와 자체 테스트는 프로세스 내에서 실행되며, 정책 검사와 자체 테스트는 문서 콘텐츠를 호스트 밖으로 보내지 않습니다.
이 기능이 하는 일
섹션 제목: “이 기능이 하는 일”이 기능은 암호화 정책, 런타임 가드, 전원 인가 자체 테스트라는 세 부분으로 구성됩니다.
암호화 정책은 암호화 선택을 승인 집합으로 제한하며, 두 가지 프리셋을 제공합니다.
- Strict (FIPS 140-3 세대에 맞춤) — SHA-256, SHA-384, SHA-512 해시, 이 해시들을 사용하는 RSA 및 ECDSA 서명 객체 식별자(OID), AES-256-CBC 암호화, 그리고 RSA 2048 및 타원곡선 256의 최소 키 크기.
- Standard (FIPS 140-2 세대에 맞춤) — strict와 동일하되, 이전 상호 운용성을 위해 AES-128-CBC도 허용합니다.
서명 생성에 대해, NIST SP 800-131A Rev.2 §3은 RSA 키 2048 비트 이상과 ECDSA 차수 224 비트 이상을 허용합니다. strict 프리셋의 2048/256 하한은 그 최소값과 같거나 그 이상입니다. 정책은 알 수 없는 키 유형을 기본적으로 거부합니다 — 인식되지 않는 유형을 조용히 받아들이지 않습니다.
런타임 가드는 정책을 감싸고, 해시, 서명 OID, 암호화 알고리즘, 키 강도에 대한 assert 방식의 메서드를 노출합니다. 어떤 선택이 허용되지 않으면, 정책과 위반 항목의 이름을 담은 타입화된 위반을 발생시키고 작업을 중단합니다. 이 경로는 fail-closed입니다. 정책은 스스로 완화되지 않으며, 더 약한 알고리즘으로 대체하지도 않습니다. RSASSA-PSS 서명의 경우, 생성 게이트는 메시지 다이제스트를 명시적으로 바인딩합니다. 모든 PSS 변형은 하나의 서명 OID를 공유하며, 해시는 OID가 아니라 PSS 매개변수에 있습니다. OID 허용 목록만으로는 실제 적용되는 다이제스트를 증명할 수 없으므로, 게이트는 다이제스트가 FIPS 승인(SHA-256/384/512)임을 단언합니다. 다이제스트를 알 수 없거나 승인되지 않은 PSS 토큰, 예를 들어 SHA-1 PSS는 어떤 서명자 디스패치보다 먼저 fail-closed로 거부합니다 (FIPS 186-5 §5.4(b)).
전원 인가 자체 테스트는 프로세스 시작 시 known-answer-test(KAT) 모음을 한 번 실행합니다. 이 모음은 승인된 해시, 메시지 인증, 암호화, 인증 암호화, 서명, 무작위 비트 함수를 다룹니다. ISO/IEC 19790:2025 §7.10.4.2에 따라, known-answer 테스트는 계산된 출력이 알려진 정답과 일치하지 않을 때 실패합니다. 실패가 발생하면 모듈은 오류 상태로 진입하고 암호화 서비스를 거부합니다 (ISO/IEC 19790:2025 §7.2.4.3). 오류 상태는 프로세스에 고착됩니다. 프로세스 내의 어떤 부트 가드라도 오류를 관찰한 뒤에는, 프로세스 전체가 그 수명 동안 fail-closed 상태로 유지됩니다. 새 부트 가드나 정책을 생성해도 이를 해소할 수 없습니다. 이후 통과하는 자체 테스트 재실행도 래치된 오류를 해제하지 않습니다 — ISO/IEC 19790:2025 §7.10.2에 따라 오직 프로세스 재시작(진정한 전원 재인가)만이 이를 해제합니다. 결과는 프로세스 수명 동안 캐시됩니다. 관리자 엔드포인트나 명령을 위한 온디맨드 재실행을 실행할 수 있지만, 이는 주기적 자체 테스트 의무를 충족하기 위한 것이지 오류 복구를 위한 것이 아닙니다.
정책은 NIST SP 800-38D §5.2.1에 따라 인증 암호화 사용 시 키마다 고유한 초기화 벡터(IV)를 요구합니다.
이렇게 동작하는 이유
섹션 제목: “이렇게 동작하는 이유”FIPS 검증은 특정 암호화 모듈 경계에 부여되며, 그 모듈을 호출하는 애플리케이션에 부여되지 않습니다. 따라서 NextPDF는 정책을 집행하고 자체 테스트 모음을 실행하되, 모든 프리미티브는 사용자가 구성한 FIPS 검증된 제공자에게 위임합니다 — 검증된 모듈이라고 주장하는 대신 승인된 선택을 단언합니다. 오류 상태가 의도적으로 프로세스에 고착되는 이유는, 자체 테스트 불일치가 곧 모듈을 더 이상 신뢰할 수 없음을 뜻하기 때문입니다. 그러므로 새 가드나 이후의 통과하는 재실행이 이를 조용히 해제해서는 안 되며, 오직 진정한 프로세스 재시작만이 이를 해제합니다. 이는 실패를 그 자리에서 조용히 복구 가능한 것으로 만드는 대신 정직하고 감사 가능한 것으로 유지합니다. 그 결과, NextPDF가 인증받았다고 주장하는 범위를 결코 과장하지 않으면서도 컴플라이언스를 지원하는 기능이 됩니다.
설계 배경: 감사관에게 넘길 수 있는 컴플라이언스.
사전 요구 사항
섹션 제목: “사전 요구 사항”- NextPDF Core와 Enterprise 패키지를 설치하고, 활성 Enterprise 라이선스를 유지하십시오.
- FIPS 호환 작동을 주장하려면, NextPDF를 FIPS 검증된 암호화 제공자 — 예를 들어 FIPS 검증된 OpenSSL 제공자 — 또는 FIPS 검증된 하드웨어 보안 모듈(HSM)로 구성하십시오. NextPDF Enterprise는 구조적 조립, 다이제스트 계산, 정책 집행을 수행합니다. 기반이 되는 프리미티브는 사용자가 제공하는 검증된 경계 내에서 실행됩니다.
- 프리셋을 선택하십시오. FIPS 140-3에 맞춘 집행에는 strict를, AES-128-CBC 상호 운용성이 필요한 경우에는 standard를 선택합니다.
- 프리셋 — strict 또는 standard를 선택합니다. strict는 AES-256-CBC만 허용하고, standard는 AES-128-CBC도 허용합니다.
- 가드 — 선택한 정책으로 가드를 생성합니다. 가드를 각 암호화 선택을 단언하는 경계로 사용하십시오.
- 자체 테스트 연결 — 각 워커 프로세스가 자신의 자체 테스트 주기를 실행하도록 애플리케이션 부트스트랩에서 부트 가드를 연결합니다. 각 프로세스 인스턴스는 자체 전원 인가 자체 테스트를 실행합니다.
단계별 안내
섹션 제목: “단계별 안내”- 애플리케이션 부트스트랩에서 부트 가드를 통해 전원 인가 자체 테스트를 실행하고 모듈이 작동 가능한 상태인지 단언합니다. 그렇지 않으면 프로세스를 중단하십시오.
- strict 또는 standard 정책으로 가드를 생성합니다.
- 각 암호화 작업 전에 가드를 통해 해시, 서명 OID, 암호화 알고리즘, 키 강도를 단언합니다.
- 타입화된 위반을 포착하고, 구조적 메시지를 로깅한 뒤, 작업을 거부하십시오. 더 약한 선택으로 폴백하지 마십시오.
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Enterprise\Security\Fips\FipsBootGuard;use NextPDF\Enterprise\Security\Fips\FipsCryptoPolicy;use NextPDF\Enterprise\Security\Fips\FipsModeGuard;use NextPDF\Enterprise\Security\Fips\FipsSelfTest;use NextPDF\Enterprise\Security\Fips\FipsModuleErrorStateException;use Psr\Log\LoggerInterface;
/** * Run the power-on self-test, then build a guard on the strict policy. * * The self-test runs once per process. A known-answer failure raises a * module-error-state exception; the caller must stop rather than proceed * with an unverified crypto path. * * @param LoggerInterface $logger Structural diagnostics only — never secrets. * * @throws FipsModuleErrorStateException When a power-on known-answer test fails. * * @return FipsModeGuard A guard ready to assert each cryptographic choice. */function bootFipsGuard(LoggerInterface $logger): FipsModeGuard{ $bootGuard = new FipsBootGuard(new FipsSelfTest());
try { $bootGuard->assertOperational(); } catch (FipsModuleErrorStateException $e) { $logger->critical('FIPS power-on self-test failed; refusing crypto services.', [ 'reason' => $e->getMessage(), ]);
throw $e; }
return new FipsModeGuard(FipsCryptoPolicy::strict());}<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Enterprise\Security\Fips\FipsModeGuard;use NextPDF\Enterprise\Security\Fips\FipsViolationException;use Psr\Log\LoggerInterface;
final readonly class FipsCheckedSigning{ public function __construct( private FipsModeGuard $guard, private LoggerInterface $logger, ) {}
/** * Assert the signing choices against the active policy before signing. * * A disallowed hash, signature OID, or key strength raises a typed * violation; the operation is refused rather than downgraded. * * @param string $hash The hash algorithm name (e.g. 'sha256'). * @param string $signatureOid The signature algorithm OID. * @param string $keyType The key type (e.g. 'rsa', 'ec'). * @param positive-int $keyBits The key length in bits. * * @throws FipsViolationException When any choice is not approved. */ public function assertApproved( string $hash, string $signatureOid, string $keyType, int $keyBits, ): void { try { $this->guard->assertHashAllowed($hash); $this->guard->assertSignatureAlgorithmAllowed($signatureOid); $this->guard->assertKeyStrengthAllowed($keyType, $keyBits); } catch (FipsViolationException $e) { $this->logger->error('FIPS policy violation', ['reason' => $e->getMessage()]);
throw $e; } }}- 전원 인가 자체 테스트를 실행하고 작동 가능 상태로 보고되는지 확인합니다. 승인된 모든 알고리즘 클래스 — 해시, 메시지 인증, 암호화, 인증 암호화, 서명, 무작위 비트 — 를 실행하는지 확인합니다.
- 승인된 선택, 예를 들어 SHA-256, RSA 2048을 단언하고 통과하는지 확인합니다. 허용되지 않는 선택, 예를 들어 SHA-1, RSA 1024를 단언하고 타입화된 위반이 발생하는지 확인합니다.
- 의도적으로 손상된 해시 또는 무작위 소스를 자체 테스트에 주입하고, 모듈이 오류 상태로 진입하여 서비스를 거부하는지 확인합니다.
- 알 수 없는 키 유형이 받아들여지지 않고 기본적으로 거부되는지 확인합니다.
보안 및 컴플라이언스
섹션 제목: “보안 및 컴플라이언스”- Fail-closed. 어떤 암호화 선택이 허용되지 않으면, 가드는 타입화된 위반을 발생시키고 작업을 중단합니다. 정책은 스스로 완화되지 않으며, 더 약한 알고리즘으로 대체하지도 않습니다.
- 불일치 시 자체 테스트가 거부합니다. known-answer-test 실패는 모듈을 프로세스에 고착된 오류 상태로 전환합니다. 프로세스 전체가 fail-closed 상태로 유지됩니다. 새 부트 가드나 정책으로는 복구할 수 없으며, 통과하는 재실행도 래치를 해제하지 않습니다. 오직 프로세스 재시작만이 이를 해제합니다 (ISO/IEC 19790:2025 §7.10.4.2; §7.10.2).
- 키 강도. strict 프리셋은 RSA 2048 및 타원곡선 256 최소값을 집행하며, 이는 NIST SP 800-131A Rev.2 §3의 허용 하한과 같거나 그 이상입니다.
- IV 고유성. 인증 암호화 사용에는 키마다 고유한 IV가 필요합니다 (NIST SP 800-38D §5.2.1).
이 페이지는 암호화 정책을 다룹니다. 모든 규범 출처는 의역되었으며, 규범 텍스트는 그대로 재현되지 않았습니다. > NextPDF Enterprise는 FIPS 검증된 암호화 모듈이 아니며 FIPS 인증을 주장하지 않습니다. FIPS 검증된 암호화 제공자 — 예를 들어 FIPS 검증된 OpenSSL 제공자 — 또는 FIPS 검증된 하드웨어 보안 모듈(HSM)로 구성했을 때에만 FIPS 호환 모드로 작동합니다. FIPS 모드 정책은 컴플라이언스를 지원하며, 이는 인증도 아니고 법률 의견도 아닙니다. 규제 의무에 대해서는 자체 컴플라이언스 및 법률 자문가에게 문의하십시오.
실패 처리
섹션 제목: “실패 처리”- 부트 시 자체 테스트 실패. 부트 가드는 모듈 오류 상태 예외를 발생시킵니다. 프로세스를 중단하십시오. 검증되지 않은 암호화 경로로 진행하지 마십시오.
- 정책 위반. 가드는 정책과 위반 항목의 이름을 담은 타입화된 위반을 발생시킵니다. 작업을 거부하십시오. 다운그레이드하지 마십시오.
- 알 수 없는 키 유형. 정책은 기본적으로 이를 거부합니다. 실제로 승인된 경우에만 키 유형을 명시적으로 매핑하십시오.
- 자체 테스트 재실행. 관리자 엔드포인트나 명령을 위한 온디맨드 재실행을 사용할 수 있으며, 이는 주기적 온디맨드 자체 테스트 의무를 충족합니다. 이는 복구 메커니즘이 아닙니다. 실패하는 재실행도 프로세스를 래치 상태로 만들며, 통과하는 재실행은 기존 래치를 해제하지 않습니다. 오류 상태에 있는 모듈을 복구하려면 프로세스 재시작이 필요합니다.
게시 경계
섹션 제목: “게시 경계”이 페이지는 외부에서 관찰 가능한 동작과 지원되는 공개 API 표면만 문서화합니다. 내부 네임스페이스 경로, 헬퍼 클래스, 메커니즘 테이블, 런북 파일명, 티켓 접두사는 범위에 포함되지 않습니다.
참고 자료
섹션 제목: “참고 자료”- 보안 — NextPDF Enterprise — Enterprise 보안 제어를 통합한 문서.
- HSM 서명 — NextPDF Enterprise — Public-Key Cryptography Standards #11(PKCS#11) 하드웨어 키 보관.
- 서명 — NextPDF Enterprise — PDF Advanced Electronic Signatures(PAdES) B-LT 및 B-LTA 장기 생산자.
- 보안 — NextPDF Core — Core 암호화 및 서명 표면.
- FIPS 모드 · KAT · 인증 암호화(AEAD) — 용어집 항목.