【问题标题】:Java: How to show a dialog to let the user accept SSL certificatesJava:如何显示让用户接受 SSL 证书的对话框
【发布时间】:2010-12-11 06:31:49
【问题描述】:

我目前有一个用于我的 HTTPS 网络服务器的自签名证书。

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

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

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

【问题讨论】:

    标签: java ssl certificate x509certificate


    【解决方案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 类是内部的、最终的或 jdk 不包含源代码。也许你有什么解决办法?
    • 感谢您的快速回复。这个周末我会再试一次。也许我的代码有一点错误:S 下一条评论将包含我的结果。
    • 你好。我现在不知道,我之前做错了什么:) 使用上面的代码检索第一个默认信任管理器,获取它们的异常并在用户拒绝时抛出它们,它工作正常。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 2012-06-29
    • 2016-08-19
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多