FIPS模式:只能使用SunJSSE TrustManagers

时间:2017-04-13 16:12:27

标签: java cryptography jsse fips

我发现如果我打开fips模式,JRE只允许在创建SSLContext进行SSL握手时使用SunJSSE TrustManagers和KeyManagers。 我google sun.security.ssl.SSLContextImpl的源代码,发现以下代码:

在chooseTrustManager(TrustManager [] tm)函数中:

if (tm[i] instanceof X509TrustManager) {
   if (SunJSSE.isFIPS() && !(tm[i] instanceof X509TrustManagerImpl)) {
      throw new KeyManagementException
      ("FIPS mode: only SunJSSE TrustManagers may be used");
   }
}

在chooseKeyManager(KeyManager [] kms)函数中:

if ((km instanceof X509KeyManagerImpl) || (km instanceof SunX509KeyManagerImpl)) {
    return (X509ExtendedKeyManager)km;
} else {
    // throw exception, we don't want to silently use the
    // dummy keymanager without telling the user.
    throw new KeyManagementException
        ("FIPS mode: only SunJSSE KeyManagers may be used");
}

如上面的代码所示,trustmanger必须是X509TrustManagerImpl类的实例,并且此类是final,因此无法扩展。

但我想在进行SSL握手时对证书主题进行额外检查,因此我使用自定义信任管理器扩展X509TrustManager类,以便在checkServerTrusted()和checkClientTrusted()函数中进行额外检查。 但它会导致异常" FIPS模式:只能使用SunJSSE TrustManagers"当打开fips模式时​​。

虽然我知道强迫用户使用SunJSSE TrustManagers是针对FIPS模式的要求,但我很好奇是否还有其他方法可以满足我的要求,如果我不能使用自定义的trustmanagerr或keymanger?

0 个答案:

没有答案