java - 用自己的实现和信任管理器替换默认的 SSLContext

标签 java ssl java-8

基于 Jcs ( HttpUnit WebConversation SSL Issues ) 的回答,我尝试用我自己的信任管理器替换 SSLContext.getDefault()

SSLContext ssl = SSLContext.getDefault();
ssl.init(null, new X509TrustManager[]{new AnyTrustManager()}, null);
ssl.setDefault(ssl);

AnyTrustManager():

import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;

public class AnyTrustManager implements X509TrustManager
{
  X509Certificate[] client = null;
  X509Certificate[] server = null;

  public void checkClientTrusted(X509Certificate[] chain, String authType)
  {
    client = chain;
  }

  public void checkServerTrusted(X509Certificate[] chain, String authType)
  {
    server = chain;
  }

  public X509Certificate[] getAcceptedIssuers()
  {
    return new X509Certificate[0];
  }
}

我需要这样做,因为第 3 方 .jar 仅使用 SSLContext 默认值,这会给我带来一些问题,因此在此操作期间,我必须将默认值更改为其他内容,稍后再将其更改回来。

不幸的是,这会抛出一个 java.security.KeyManagementException: Default SSLContext is initialized automatically 异常。

如何让它在 Java 8 上运行?

最佳答案

“默认”SSLContext 是不可变的。因此不可能有 TrustManager 实例。相反,你应该更换

SSLContext ssl = SSLContext.getDefault();

(例如)

SSLContext ssl = SSLContext.getInstance("TLSv1");

关于java - 用自己的实现和信任管理器替换默认的 SSLContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35488846/

相关文章:

Java 8 闭包和类型识别

Spring 启动 : Enable HTTPS for embedded tomcat

ssl - Kubernetes Nginx 入口尝试获取错误的 SSL 证书

java - java中奇怪的ClassCastException

java - 在 Java 8 中,如何从 InputStream 转换为字节数组,并一路用 zip 压缩流?

java - Android - 有关系统 UI 的问题

java - 接受一系列数字? for循环

java - 在 weblogic 服务器启动时抑制密码提示

MongoDB 自签名 SSL 连接 : SSL peer certificate validation failed

java - 缺少 JDK,需要运行某些 NetBeans 模块