5

我目前有我的 HTTPS 网络服务器的自签名证书。

在我的 java 程序中有一个 SSLSocketFactory 将创建一个到 web 服务器的套接字。sun 的默认实现会阻止自签名证书。使用自己的 X509TrustManager 实现,我只能检查证书的日期是否有效。

是否有可能让默认实现检查有效性(日期和主机名,...),如果它未能显示让用户接受此证书的对话框?

到目前为止,我发现的每个代码都只禁用了 ssl 检查并接受了每个无效证书。

4

1 回答 1

1

我实际上并没有尝试过,但是为什么您不能实现自己的信任管理器,它首先委托给默认信任管理器来检查证书是否有效,如果不是,则询问用户是否仍要接受证书?


您可以使用空参数初始化大多数安全类以使用默认值。要获取默认信任管理器,您必须获取可用的信任管理器并选择 mgrs 数组中的第一个来实现X509TrustManager接口。通常,无论如何,数组只会包含一个元素。

TrustManagerFactory trustmanagerfactory = 
     TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustmanagerfactory.init((KeyStore)null);
TrustManager[] mgrs = trustmanagerfactory.getTrustManagers();

在你用你自己的扩展包装了默认的信任管理器之后,你必须初始化一个 SSL 上下文并从中获取一个套接字工厂:

SSLContext sslContext=SSLContext.getInstance("SSL","SunJSSE");
sslContext.init(null, new TrustManager[] {myTm}, null);
SSLSocketFactory sf = sslContext.getSocketFactory();

然后使用此套接字工厂创建新的客户端套接字或将其传递HttpsURLConnection.setDefaultSSLSocketFactory给在您自己的信任管理器中使用 URL 中的 https 协议。

于 2009-10-29T15:53:19.113 回答