【问题标题】:SSLSocketFactory in javajava中的SSLSocketFactory
【发布时间】:2012-04-12 20:58:23
【问题描述】:

SSLSocketFactory类在java中使用HttpsURLConnection时起什么作用? java 文档没有多大帮助。

是否有任何方法可以将密钥库和信任库与 sslsocketfactory 对象绑定,使其指向密钥库和信任库?

否则连接如何知道密钥库和信任库的位置(我不想使用 java System Properties)?

【问题讨论】:

    标签: java ssl https


    【解决方案1】:

    它是通过 SSLContext 完成的。您初始化一个,然后使用它的套接字工厂来创建 HttpsConnection 实例。

    这是我如何在我的应用程序中管理它的粗略示例:

    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(myKeyManagerFactory.getKeyManagers(), myTrustManagerArray, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    

    之后,您对 https 站点的 openConnection() 调用将使用您在此处初始化的 sslsocketfactory。

    TrustManager 在您的 ssl 上下文中使用的代码将信任所有证书:

    TrustManager[] myTrustManagerArray = new TrustManager[]{new TrustEveryoneManager()};
    
    class TrustEveryoneManager implements X509TrustManager {
        public void checkClientTrusted(X509Certificate[] arg0, String arg1){}
        public void checkServerTrusted(X509Certificate[] arg0, String arg1){}
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    }
    

    来自 Bruno 的更新:当心,信任任何证书,无论多么方便,都会使连接容易受到 MITM 攻击

    【讨论】:

    • 如果将 setDefaultSSLSocketFactory() 替换为 setSSLSocketFacory(),您的代码将有效。 setDefaultSSLSocketFactory() 引发以下异常。 " javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX 路径构建失败: sun.security.provider.certpath.SunCertPathBuilderExce ption: 无法找到请求目标的有效证书路径"
    • 它适用于我的 DefaultSSLSocketFactory,但很高兴知道未来 8)
    • 我认为它无法为它检查的证书构建适当的证书链。很可能您应该将要连接的站点的根证书导入您的密钥库。
    • 您应该指出,信任任何证书,无论多么方便,都会使连接容易受到 MITM 攻击。
    • (我只是指出这一点,否则人们倾向于复制/粘贴而不考虑它的作用。我更喜欢使用我自己的测试 CA 进行测试,它更现实并且不太可能留下不安全的代码在生产代码中。)
    猜你喜欢
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 2019-04-11
    • 2016-05-18
    • 1970-01-01
    相关资源
    最近更新 更多