Java中的SSLSocketFactory


问题内容

SSLSocketFactoryJava类在使用时起什么作用HttpsURLConnection?Java文档没有太大帮助。

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

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


问题答案:

它通过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攻击