gpt4 book ai didi

java - key 管理异常 : FIPS mode: only SunJSSE TrustManagers may be used

转载 作者:太空宇宙 更新时间:2023-11-03 13:54:58 24 4
gpt4 key购买 nike

我使用自定义 DummySocketFactoryDummyTrustMAnager 通过 TLS 连接到 smtp。虚拟套接字工厂:

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

最佳答案

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 作为加密软件 token (使用 NSS 3.1.1. 或更高版本),假设库位于/opt/nss/lib 目录及其 key 数据库文件(后缀为 .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的通信和密码操作,包括对称和非对称加密、签名生成和验证、消息摘要和消息认证码、 key 生成和 key 派生、随机数生成等。

关于java - key 管理异常 : FIPS mode: only SunJSSE TrustManagers may be used,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19535626/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com