我目前正在为我的HTTPS网络服务器提供自签名证书。

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

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

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

有帮助吗?

解决方案

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


您可以使用null参数初始化大多数安全类以使用默认值。要获取默认信任管理器,您必须获取可用的信任管理器,并选择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协议。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top