问题描述
我正在使用下面的代码来信任所有证书,并且代码在容器化环境中运行,由于访问被拒绝(“ javax.net.ssl.SSLPermission”“ setDefaultSSLContext”)和运行在同一代码上的代码而出现异常正常的tomcat服务器工作正常
URL destinationURL = null;
SSLContext context = null;
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
//return new X509Certificate[1];
return null;
}
@Override
public void checkServerTrusted(X509Certificate[] chain,String authType) throws CertificateException {
//DO
}
@Override
public void checkClientTrusted(X509Certificate[] chain,String authType) throws CertificateException {
//DO
}
}
};
try {
context = SSLContext.getInstance("SSL");
context.init(null,trustAllCerts,null);
SSLContext.setDefault(context);
//proxy details here
destinationURL = new URL('url');
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname,SSLSession session) {
return true;
}
});
} catch (Exception e) {
e.printStackTrace();
}
解决方法
来自SSLContext
:
setDefault
抛出:
SecurityException
-如果安全管理器存在并且其checkPermission
方法不允许SSLPermission("setDefaultSSLContext")
默认情况下不授予此权限,因为它被认为是不安全的。来自SSLPermission
:
恶意代码可以设置一个上下文来监视连接的打开或所传输的明文数据。
建议的更改默认SSLContext的方法是通过JVM启动选项。但是,您正在尝试有效地禁用所有信任,这也是不安全的,系统属性也不支持。
如果您确实确定要执行此操作,则需要为您的应用程序授予必要的权限。例如通过policy file:
grant codeBase "file:/home/ajay/myunsafecode" {
permission javax.net.ssl.SSLPermission "setDefaultSSLContext";
};
或者,只是不要更改默认的SSLContext
并直接使用不安全的密码。
(JDK 11的所有链接)
,您可以使用指定的SSLContext来构建可用于URL连接的socketfactory,不建议更改默认值。