我发现如果我打开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?