我使用以下代码来信任所有证书,并且代码在容器化环境中运行,我收到异常,因为访问被拒绝("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 来构建可用于 URL 连接的套接字工厂,不建议更改默认的套接字工厂。
从SSLContext
:
设置默认
抛出:
SecurityException
- 如果存在安全管理器并且其checkPermission
方法不允许SSLPermission("setDefaultSSLContext")
默认情况下不授予此权限,因为它被认为是不安全的。从SSLPermission
:
恶意代码可以设置一个上下文来监视连接的打开或传输的纯文本数据。
更改默认 SSLContext 的推荐方法是通过 JVM 启动选项。但是,您正在尝试有效地禁用所有信任,这也是不安全的,并且不受系统属性的支持。
如果确实确定要执行此操作,则需要向应用程序授予必要的权限。例如,这将通过策略文件:
grant codeBase "file:/home/ajay/myunsafecode" {
permission javax.net.ssl.SSLPermission "setDefaultSSLContext";
};
或者,只是不要更改默认SSLContext
并直接使用不安全的。
(JDK 11 的所有链接)