KeyManagementException:FIPS模式:只能使用SunJSSE TrustManagers

时间:2013-10-23 07:37:36

标签: java ssl smtp jsse

我使用自定义 DummySocketFactory DummyTrustMAnager 通过TLS连接到smtp。 DummySocketFactory:

package XMailMessenger;

public class DummySSLSocketFactory extends SSLSocketFactory {
private SSLSocketFactory factory;

public DummySSLSocketFactory() {
try {


    SSLContext sslcontext = SSLContext.getInstance("TLS");
    //Security.removeProvider("SunJSSE");
    sslcontext.init(null,
             new TrustManager[] { new DummyTrustManager()},
            null );
    factory = (SSLSocketFactory)sslcontext.getSocketFactory();

} catch(Exception ex) {
    System.out.println(ex.toString());
}
}

public static SocketFactory getDefault() {
    SocketFactory a = new DummySSLSocketFactory();
    if ( a == null ) { System.out.println("1"); }
    return a;
}
 ...

DummyTrustManager:

public class DummyTrustManager implements X509TrustManager{

public void checkClientTrusted(X509Certificate[] cert, String authType) {
// everything is trusted


}

public void checkServerTrusted(X509Certificate[] cert, String authType) {
// everything is trusted
}

public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
    //return null;
}
}

在发送电子邮件时,我收到了主题中的异常,此例外来自 DummySSLSocketFactory 中的 sslcontext.init 。我调试它并注意到,在代码中:

    private X509TrustManager chooseTrustManager(TrustManager[] tm)
        throws KeyManagementException {
    // We only use the first instance of X509TrustManager passed to us.
    for (int i = 0; tm != null && i < tm.length; i++) {
        if (tm[i] instanceof X509TrustManager) {
            if (SunJSSE.isFIPS() &&
                    !(tm[i] instanceof X509TrustManagerImpl)) {
                throw new KeyManagementException
                    ("FIPS mode: only SunJSSE TrustManagers may be used");
            }

            if (tm[i] instanceof X509ExtendedTrustManager) {
                return (X509TrustManager)tm[i];
            } else {
                return new AbstractTrustManagerWrapper(
                                    (X509TrustManager)tm[i]);
            }
        }
    }

    // nothing found, return a dummy X509TrustManager.
    return DummyX509TrustManager.INSTANCE;
}
if中出现

异常(SunJSSE.isFIPS()&amp;&amp;                         !(tm [i] instanceof X509TrustManagerImpl))表达式。

我认为tm [i]包含我的 DummyTrustManager ,它不能从X509TrustManagerImpl扩展,所以我的问题是:如何在SunJSSE中禁用Fips

2 个答案:

答案 0 :(得分:2)

SunJSSE可以配置为在符合FIPS-140标准的模式下运行,只要它使用经过FIPS-140认证的加密硬件或软件提供商来实现JSSE所需的所有加密算法(例如网络安全服务 - NSS,Sun加密加速器) 6000,nCipher等。)

要启用FIPS模式,请编辑文件$ {java.home} /lib/security/java.security并修改列出com.sun.net.ssl.internal.ssl.Provider的行并关联该名称FIPS-140加密提供程序(例如SunPKCS11-NSS)。提供程序的名称是一个字符串,用于将前缀SunPKCS11-与其配置文件中指定的PKCS#11提供程序的名称连接起来。

  

security.provider.4 = com.sun.net.ssl.internal.ssl.Provider   SunPKCS11-NSS

如果使用NSS作为加密软件令牌(使用NSS 3.1.1。或更高版本),假设库位于/ opt / nss / lib目录及其关键数据库文件(带后缀.db)下)在/ opt / nss / fipsdb目录下,代表NSS的示例配置如下:

                       # Use NSS as a FIPS-140 compliant cryptographic token 
                       # SunPKCS11-NSS
                      name = NSS
                      nssLibraryDirectory = /opt/nss/lib
                      nssSecmodDirectory = /opt/nss/fipsdb
                      nssModule = fips

在FIPS模式下,SunJSSE将执行基于SSL / TLS 1.0的通信和加密操作,包括对称和非对称加密,签名生成和验证,消息摘要和消息验证代码,密钥生成和密钥派生,随机数生成等。 / p>

答案 1 :(得分:0)

对于那些需要在第三方服务器上安装 tomcat webapp 感到非常头疼的人,我浪费了 1 个小时试图绕过这个该死的东西......

我就是这样解决的,没有触及 webapp 中的任何东西。

  1. 添加这个java参数:

-Djava.security.disableSystemPropertiesFile=true

来源: https://access.redhat.com/documentation/en-us/openjdk/8/pdf/configuring_openjdk_8_on_rhel_with_fips/OpenJDK-8-Configuring_OpenJDK_8_on_RHEL_with_FIPS-en-US.pdf

  1. 此外,如果应用程序需要连接到 Windows Server,您可能还想在那里禁用 FIPS:
  • 在控制面板中,点击管理工具 -> 本地安全策略。
  • 在安全设置 -> 本地策略 -> 安全选项中。
  • 在右窗格中的策略下,双击系统加密:使用符合 FIPS 的算法进行加密、散列和签名,然后单击禁用。
  • 重启服务器

(奖金) 如果你想从服务器上卸载 FIPS,请按照这个指南(我没有测试过):

https://www.bggofurther.com/2021/02/disable-fips-mode-on-centos-7/