我目前有我的 HTTPS 网络服务器的自签名证书。
在我的 java 程序中有一个 SSLSocketFactory 将创建一个到 web 服务器的套接字。sun 的默认实现会阻止自签名证书。使用自己的 X509TrustManager 实现,我只能检查证书的日期是否有效。
是否有可能让默认实现检查有效性(日期和主机名,...),如果它未能显示让用户接受此证书的对话框?
到目前为止,我发现的每个代码都只禁用了 ssl 检查并接受了每个无效证书。
我目前有我的 HTTPS 网络服务器的自签名证书。
在我的 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 协议。