我使用自定义 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 ?
答案 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 中的任何东西。
-Djava.security.disableSystemPropertiesFile=true
(奖金) 如果你想从服务器上卸载 FIPS,请按照这个指南(我没有测试过):
https://www.bggofurther.com/2021/02/disable-fips-mode-on-centos-7/