And*_*dré 5 java ssl certificate x509certificate
我目前有一个用于我的 HTTPS 网络服务器的自签名证书。
在我的 java 程序中,有一个 SSLSocketFactory 将创建一个连接到网络服务器的套接字。sun 的默认实现会阻止自签名证书。使用自己的 X509TrustManager 实现,我只能检查证书的日期是否有效。
是否有可能让默认实现检查有效性(日期和主机名,...),如果它无法显示对话框让用户接受此证书?
到目前为止,我发现的每个代码都只禁用了 ssl 检查并接受了每个无效的证书。
我实际上没有尝试过这个,但是为什么你不能实现自己的信任管理器,它首先委托默认信任管理器检查证书是否有效,如果无效,则询问用户是否仍然想要接受证书?
您可以使用空参数初始化大多数安全类以使用默认值。要获取默认信任管理器,您必须获取可用的信任管理器并选择 mgrs 数组中的第一个来实现该X509TrustManager接口。通常,数组无论如何都只包含一个元素。
TrustManagerFactory trustmanagerfactory =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustmanagerfactory.init((KeyStore)null);
TrustManager[] mgrs = trustmanagerfactory.getTrustManagers();
Run Code Online (Sandbox Code Playgroud)
使用自己的扩展包装默认信任管理器后,必须初始化 SSL 上下文并从中获取套接字工厂:
SSLContext sslContext=SSLContext.getInstance("SSL","SunJSSE");
sslContext.init(null, new TrustManager[] {myTm}, null);
SSLSocketFactory sf = sslContext.getSocketFactory();
Run Code Online (Sandbox Code Playgroud)
然后使用此套接字工厂创建新的客户端套接字或将其传递给HttpsURLConnection.setDefaultSSLSocketFactory您自己的信任管理器以在 URL 中使用 https 协议。