我目前在我的HTTPS Web服务器上使用自签名证书。
在我的Java程序中,有一个SSLSocketFactory,它将创建到Web服务器的套接字。 sun的默认实现会阻止自签名证书。通过自己实现X509TrustManager,我只能检查证书日期是否有效。
是否有可能让默认实现检查有效性(日期和主机名等),如果失败,则显示对话框让用户接受此证书?
到目前为止,我找到的每个代码都只禁用了SSL检查并接受了每个无效的证书。
我目前在我的HTTPS Web服务器上使用自签名证书。
在我的Java程序中,有一个SSLSocketFactory,它将创建到Web服务器的套接字。 sun的默认实现会阻止自签名证书。通过自己实现X509TrustManager,我只能检查证书日期是否有效。
是否有可能让默认实现检查有效性(日期和主机名等),如果失败,则显示对话框让用户接受此证书?
到目前为止,我找到的每个代码都只禁用了SSL检查并接受了每个无效的证书。
我实际上还没有尝试过这个,但是为什么你不能实现自己的信任管理器呢?首先委托默认的信任管理器来检查证书是否有效,如果无效,则询问用户是否仍然想要接受该证书?
您可以使用空参数初始化大多数安全类以使用默认值。要获取默认信任管理器,必须获取可用的信任管理器并选择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协议。