コンテンツにスキップ
getnextpdf.com

Enterprise エディション

FIPS 140-2/3 暗号ポリシーと自己テスト

NextPDF Enterprise は、署名操作または暗号化操作で選択できる暗号を Federal Information Processing Standards(FIPS)承認済みのセットに制限し、そのセット外のいかなる選択も拒否します。ランタイムガードは、操作を実行する前に各ハッシュ、署名アルゴリズム識別子、暗号化アルゴリズム、鍵強度を検証します。パワーオン自己テストバッテリはプロセス開始時に一度実行されます。いずれかの既知応答テストが失敗した場合、モジュールはエラー状態に入ります。このページでは、ポリシーが許可する内容、ガードが拒否する内容、自己テストがカバーする範囲、そして明示的な認証スタンスという動作面を説明します。

NextPDF Enterprise はコンプライアンスを支援します。認証された暗号モジュールではありません。非認証であるという明示的なスタンスは セキュリティとコンプライアンス を参照してください。

前提条件はフロントマターに記載されており、前提条件 でも再掲しています。

この機能は NextPDF Enterprisenextpdf/enterprise)に含まれ、Enterprise ティアのライセンスエンベロープで有効化されます。そのエンタイトルメントを持たないデプロイメントは、この機能のクラスを読み込みません。エディションを比較してライセンスを取得

NextPDF Core および NextPDF Pro は FIPS モードのプロファイルを提供しません。ガードと自己テストはプロセス内で実行されます。ポリシーチェックや自己テストがドキュメントの内容をホストの外へ送信することはありません。

この機能は、暗号ポリシー、ランタイムガード、パワーオン自己テストという 3 つの部分で構成されます。

暗号ポリシーは、暗号の選択を承認済みのセットに制限します。プリセットは 2 つあります。

  • 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 は 2048 ビット以上の RSA 鍵と 224 ビット以上の ECDSA 位数を許容します。strict プリセットの 2048/256 の下限は、これらの最小値以上を満たします。ポリシーは不明な鍵タイプをデフォルトで拒否し、認識されないタイプを暗黙に受け入れることはありません。

ランタイムガードはポリシーをラップし、ハッシュ、署名 OID、暗号化アルゴリズム、鍵強度に対する assert 形式のメソッドを公開します。許可されない選択に対しては、ポリシーと違反項目を示す型付きの違反を発生させ、操作を停止します。この経路はフェイルクローズです。ポリシーが自ら緩和されることはなく、より弱いアルゴリズムへ置き換えることもありません。RSASSA-PSS 署名の場合、生成ゲートはメッセージダイジェストを明示的に束縛します。すべての PSS バリアントは 1 つの署名 OID を共有し、ハッシュは OID ではなく PSS パラメータに存在します。OID 許可リストだけでは実効ダイジェストを証明できないため、ゲートはそのダイジェストが FIPS 承認済み(SHA-256/384/512)であることをアサートします。ダイジェストが不明または非承認である PSS トークン(例: SHA-1 PSS)は、署名者へのディスパッチより前にフェイルクローズで拒否されます(FIPS 186-5 §5.4(b))。

パワーオン自己テストは、プロセス開始時に既知応答テスト(KAT)バッテリを一度実行します。このバッテリは、承認済みのハッシュ、メッセージ認証、暗号化、認証付き暗号化、署名、乱数ビットの各関数をカバーします。ISO/IEC 19790:2025 §7.10.4.2 によれば、既知応答テストは算出された出力が既知の応答と等しくない場合に失敗します。いずれかが失敗した場合、モジュールはエラー状態に入り、暗号サービスを拒否します(ISO/IEC 19790:2025 §7.2.4.3)。エラー状態はプロセスに固着します。プロセス内のいずれかのブートガードがエラーを観測すると、プロセス全体がそのライフタイムの間フェイルクローズのままになります。新しいブートガードやポリシーを構築してもこれを解除することはできません。その後に成功した自己テストの再実行でも、ラッチされたエラーをクリアすることはできません。クリアできるのはプロセスの再起動(真のパワーサイクル)のみです(ISO/IEC 19790:2025 §7.10.2)。結果はプロセスのライフタイムの間キャッシュされます。管理エンドポイントやコマンド用にオンデマンドの再実行を実行できますが、これはエラー回復ではなく定期的な自己テスト義務のためのものです。

ポリシーは、認証付き暗号化の使用に対して鍵ごとに一意の初期化ベクトル(IV)を必要とします(NIST SP 800-38D §5.2.1)。

FIPS 検証は、特定の暗号モジュール境界に付随するものであり、それを呼び出すアプリケーションに付随するものではありません。そのため NextPDF は、ポリシーを適用して自己テストバッテリを実行しますが、すべてのプリミティブは利用者が構成した FIPS 検証済みプロバイダーに委譲します。つまり、検証済みモジュールであると主張するのではなく、承認済みの選択をアサートします。エラー状態が意図的にプロセスへ固着するのは、自己テストの不一致がモジュールをもはや信頼できないことを意味するからです。したがって、新しいガードや後続の成功した再実行がそれを暗黙にクリアしてはならず、真のプロセス再起動のみがそれを行います。これにより、その場で静かに回復可能にするのではなく、失敗を正直で監査可能な状態に保ちます。結果として、NextPDF が認証されている範囲を決して過大に述べることなく、コンプライアンスを支援する機能になります。

設計背景: 監査人に手渡せるコンプライアンス

  1. NextPDF Core と Enterprise パッケージをインストールし、有効な Enterprise ライセンスを維持してください。
  2. FIPS 互換の動作を主張するには、NextPDF を FIPS 検証済みの暗号プロバイダー(例: FIPS 検証済みの OpenSSL プロバイダー)または FIPS 検証済みのハードウェアセキュリティモジュール(HSM)に対して構成してください。NextPDF Enterprise は構造的なアセンブリ、ダイジェスト計算、ポリシー適用を行います。基盤となるプリミティブは、利用者が提供する検証済みの境界内で実行されます。
  3. プリセットを選択してください。FIPS 140-3 に整合させた適用には strict を、AES-128-CBC の相互運用性が必要な場合は standard を選びます。
  • プリセット — strict または standard を選択します。strict は AES-256-CBC のみを許可します。standard は AES-128-CBC も許可します。
  • ガード — 選択したポリシーでガードを構築します。ガードは、各暗号の選択をアサートする境界として使用します。
  • 自己テストの配線 — アプリケーションのブートストラップでブートガードを配線し、各ワーカープロセスが自身の自己テストサイクルを実行するようにします。各プロセスインスタンスは、それぞれ独自のパワーオン自己テストを実行します。
  1. アプリケーションのブートストラップで、ブートガードを通じてパワーオン自己テストを実行し、モジュールが動作可能であることをアサートします。動作可能でない場合は、プロセスを停止してください。
  2. strict または standard ポリシーでガードを構築します。
  3. 各暗号操作の前に、ハッシュ、署名 OID、暗号化アルゴリズム、鍵強度をガードを通じてアサートします。
  4. 型付きの違反をキャッチし、構造化されたメッセージをログに記録して操作を拒否します。より弱い選択にフォールバックしてはいけません。
examples/enterprise/fips-boot-and-guard.php
<?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());
}
examples/enterprise/fips-assert-choices.php
<?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;
}
}
}
  1. パワーオン自己テストを実行し、動作可能と報告されることを確認します。承認済みのすべてのアルゴリズムクラス(ハッシュ、メッセージ認証、暗号化、認証付き暗号化、署名、乱数ビット)が実行されることを確認します。
  2. 承認済みの選択(例: SHA-256、RSA 2048)をアサートして合格することを確認し、許可されない選択(例: SHA-1、RSA 1024)をアサートして型付きの違反が発生することを確認します。
  3. 意図的に壊したハッシュまたは乱数ソースを自己テストに注入し、モジュールがエラー状態に入ってサービスを拒否することを確認します。
  4. 不明な鍵タイプが受け入れられず、デフォルトで拒否されることを確認します。
  • フェイルクローズ。 暗号の選択が許可されない場合、ガードは型付きの違反を発生させて操作を停止します。ポリシーが自ら緩和されることはなく、より弱いアルゴリズムへ置き換えることもありません。
  • 自己テストは不一致時に拒否します。 既知応答テストの失敗は、モジュールをプロセスに固着するエラー状態にします。プロセス全体がフェイルクローズのままになります。新しいブートガードやポリシーではこれを回復できず、成功した再実行でもラッチを解除できません。クリアできるのはプロセスの再起動のみです(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 検証済みの暗号プロバイダー(例: FIPS 検証済みの OpenSSL プロバイダー)または FIPS 検証済みのハードウェアセキュリティモジュール(HSM)で構成された場合のみです。FIPS モードのポリシーはコンプライアンスを支援するものであり、認証でも法的意見でもありません。規制上の義務については、ご自身のコンプライアンス担当者および法務アドバイザーにご相談ください。

  • ブート時の自己テスト失敗。 ブートガードはモジュールエラー状態の例外を発生させます。プロセスを停止してください。検証されていない暗号経路で続行してはいけません。
  • ポリシー違反。 ガードは、ポリシーと違反項目を示す型付きの違反を発生させます。操作を拒否してください。ダウングレードしてはいけません。
  • 不明な鍵タイプ。 ポリシーはデフォルトでこれを拒否します。その鍵タイプが本当に承認済みである場合にのみ、明示的にマッピングしてください。
  • 自己テストの再実行。 管理エンドポイントやコマンド用にオンデマンドの再実行が利用でき、定期的なオンデマンド自己テスト義務を満たします。これは回復メカニズムではありません。失敗した再実行もプロセスをラッチし、成功した再実行は既存のラッチを解除しません。エラー状態のモジュールを回復するには、プロセスの再起動が必要です。

このページは、外部から観測可能な動作とサポート対象の公開 API サーフェスのみを記載します。内部の名前空間パス、ヘルパークラス、メカニズムの表、ランブックのファイル名、チケットの接頭辞は対象外です。