跳转到内容

FIPS 140-2/3 加密策略与自检

NextPDF Enterprise 将签名或加密操作可使用的加密选择限制在 Federal Information Processing Standards(FIPS)批准集合内,并拒绝集合以外的任何选择。运行时防护机制会在操作执行前断言每一个哈希、签名算法标识符、加密算法与密钥强度。上电自检会在进程启动时运行一次;若任何已知答案测试失败,就会使模块进入错误状态。本页聚焦行为层面:说明策略允许什么、防护机制拒绝什么、自检涵盖什么,以及明确的认证立场。

NextPDF Enterprise 是一项合规辅助工具,并非经认证的加密模块。其不具认证的立场在 安全性与合规 中说明。

先决条件列在 front matter 中,并在 先决条件 中重述。

FIPS 模式的加密策略配置文件、运行时防护机制和上电自检防护机制随 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,至少 2048 位的 RSA 密钥和阶数至少为 224 位的 ECDSA,是签名生成可接受的最低要求;strict 预设配置的 2048/256 下限等于或高于这些要求。未知的密钥类型默认一律拒绝——策略不会无声接受无法识别的类型。

运行时防护机制封装该策略,并针对哈希、签名 OID、加密算法与密钥强度提供断言式(assert)方法。不被允许的选择会引发一个带类型的违规(typed violation),指出所用策略和违规项目,并停止该操作。该路径采用故障关闭(fail-closed):策略绝不会自我放宽,也绝不会改用较弱算法。对于 RSASSA-PSS 签名,生成关口会明确绑定消息摘要:由于每一种 PSS 变体都共用同一个签名 OID——哈希位于 PSS 参数中,而非 OID——仅凭 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)。该错误状态对进程具有粘滞性(process-sticky):一旦进程中的任何启动防护机制检测到错误,整个进程在其生命周期内都会维持故障关闭。构造全新的启动防护机制或策略无法清除此状态,后续即使有一次通过的自检重新运行,也不会清除已锁存的错误——根据 ISO/IEC 19790:2025 §7.10.2,唯有重新启动进程(真正的电源循环)才能清除。结果会在进程生命周期内缓存;管理端点或命令可触发按需重新运行,但其目的在于满足定期自检义务,而非错误恢复。

根据 NIST SP 800-38D §5.2.1,在此策略下使用已认证加密时,每把密钥都必须使用唯一的初始化向量(IV)。

  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)。

本页标记为 export_control_class: legal-review-required,因为它涉及加密策略。每一份规范性来源均以改写方式呈现;不复制任何规范原文。在设定 publish 标志之前,必须取得法务签核。

NextPDF Enterprise 并非通过 FIPS 验证的加密模块,且不作任何 FIPS 认证主张。 唯有在配置为搭配通过 FIPS 验证的加密提供者——例如通过 FIPS 验证的 OpenSSL 提供者——或通过 FIPS 验证的 HSM 时,它才会以 FIPS 兼容模式运行。FIPS 模式策略有助于合规;它不是认证,也不是法律意见。关于你的法规义务,请咨询你自己的合规与法律顾问。

  • 启动时自检失败。 启动防护机制会引发模块错误状态异常。停止该进程;不要沿用未经验证的加密路径继续执行。
  • 策略违规。 防护机制会引发带类型的违规,指出所用策略和违规项目。拒绝该操作;不要降级。
  • 未知的密钥类型。 策略默认一律拒绝。如果该密钥类型确实已获批准,请显式映射它。
  • 自检重新运行。 管理端点或命令可按需重新运行自检,以满足定期按需自检义务。它并非恢复机制:失败的重新运行同样会锁存该进程;通过的重新运行也不会解除既有锁存。要使处于错误状态的模块恢复,必须重新启动进程。

NextPDF Core 提供软件签名者与加密功能,但不含 FIPS 模式配置文件。NextPDF Enterprise 增加 FIPS 模式加密策略配置文件、运行时防护机制与上电自检防护机制,使部署能够将加密选择限制在批准集合内,并在自检不匹配时故障关闭。将它与 HSM 签名 搭配使用,以便在通过 FIPS 验证的设备内运行密码学原语。比较各版本