在 FIPS 模式下禁用 HTTPS 证书验证

Disable HTTPS Certificate Validation in FIPS mode

java 中有一个代码执行 HTTPS 调用,然后忽略传入的证书验证。为了做到这一点,自定义信任管理器被实现。 但现在我们需要切换到 FIPS 模式。在 fips 模式下,当 SSL 套接字使用自定义信任管理器时,会收到以下异常。

FIPS 模式:只能使用 SunJSSE TrustManagers

那么有没有办法在 FIPS 模式下绕过传入证书验证?

您基本上是在询问是否可以启用特定安全级别 (FIPS),同时禁用该级别所需的某些安全功能。否 - 此安全级别的重点是确保满足特定的安全要求,正确的证书验证是一项基本要求。

这种不允许非 SunJSSE 信任或密钥管理器的行为似乎特定于 Sun/Oracle JRE。不要认为这是 FIPS 合规性要求。显然,启用了 FIPS 的 openSSL 和 libcurl 没有这个限制。

我也因此面临问题。

我们的 Java 应用程序中发生了一些 HTTPS API 调用。这些 API 调用实际上是关于获取远程端的 CA 证书,向最终用户显示指纹和其他详细信息,并在用户接受时将此证书保存在信任库中。之后,后续工作流中的HTTPS调用,都会使用这个trust store。

因此,从我们的应用程序获取 CA 证书的 HTTPS 调用,我使用了“全信任”信任管理器,但显然这在 FIPS 模式下是不可接受的。

我同意 FIPS 需要更严格的安全性,因此禁用证书验证不是一个好主意,也不应理想地完成。但是像这样的特殊情况(可能我们想要执行更多验证,例如自定义主机名验证、证书吊销状态检查等),Sun JSSE 应该有一些规定来覆盖这种 FIPS 模式行为。

很可能,我们需要在我们的自定义 SSL 上下文中实施 SSLContextSpi 和挂钩。该实现看起来与下面的 SSLContextImpl 非常相似,但可能放宽了 FIPS 限制。 (不用说,这需要谨慎使用,特别是 FIPS。)

https://hg.openjdk.java.net/jdk8/jdk8/jdk/raw-file/687fd7c7986d/src/share/classes/sun/security/ssl/SSLContextImpl.java