0

我使用自定义DummySocketFactoryDummyTrustMANager通过 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;
}
 ...

虚拟信任管理器:

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() && !(tm[i] instanceof X509TrustManagerImpl))表达式中发生异常。

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

4

2 回答 2

3

SunJSSE 可以配置为在符合 FIPS-140 的模式下运行,只要它使用 FIPS-140 认证的加密硬件或软件提供程序来实现 JSSE 所需的所有加密算法(例如网络安全服务 – NSS、Sun Cryptographic Accelerator 6000、nCipher , ETC)。

要启用 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 的通信和加密操作,包括对称和非对称加密、签名生成和验证、消息摘要和消息验证码、密钥生成和密钥派生、随机数生成等。

于 2013-10-23T08:32:00.983 回答
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/

于 2021-07-29T15:50:44.693 回答