Java:如何显示对话框让用户接受SSL证书。

5

我目前在我的HTTPS Web服务器上使用自签名证书。

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

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

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

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协议。


我有同样的想法,但在尝试获取和使用现有的信任管理器时遇到了许多问题(需要密钥库和更多实例进行初始化)。大多数SUN类是内部的、final的或者jdk不包含源代码。也许你有什么解决方案? - André
谢谢您的快速回复。我会在这个周末再次尝试。也许我的代码中有一点小错误 :S 下一个评论将包含我的结果。 - André
再次问候。我不知道之前做错了什么 :) 使用您上面的代码检索第一个默认信任管理器,获取它们的异常并在用户拒绝时抛出它们运作良好。谢谢。 - André

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接