Java 中的 SSLSocketFactory,LDAP 网络连接
SSLSocketFactory in Java, LDAP network connection
我的问题类似于:SSLSocketFactory in java
我需要设置自定义 SSLSocketFactory...除了我 没有 有 https 连接(它是 LDAPS),所以不能使用:
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
...设置 SSLSocketFactory。我初始化了一个 SSLContext 对象,但是当我建立 LDAP 连接时,默认的 SSLContext 被自动调用,因为我的自定义对象没有设置:
dirContext = new InitialDirContext(env); // <-- reverts to default ssl context
下面第 3 行是否有非 HTTPS 等效方法:
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(myKeyManagerFactory.getKeyManagers(), myTrustManagerArray, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
是的,有。
env.put("java.naming.ldap.factory.socket", UnsecuredSSLSocketFactory.class.getName());
UnsecuredSSLSocketFactory.java:
public class UnsecuredSSLSocketFactory extends SSLSocketFactory
{
private SSLSocketFactory socketFactory;
public UnsecuredSSLSocketFactory()
{
try
{
var sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{new X509TrustManager()
{
@Override
public void checkClientTrusted(X509Certificate[] xcs, String string){}
@Override
public void checkServerTrusted(X509Certificate[] xcs, String string){}
@Override
public X509Certificate[] getAcceptedIssuers()
{
return null;
}
}}, new SecureRandom());
socketFactory = sslContext.getSocketFactory();
}
catch(Exception e)
{
throw new RuntimeException(e);
}
}
@SuppressWarnings("unused")
public static SocketFactory getDefault()
{
return new UnsecuredSSLSocketFactory();
}
@Override
public String[] getDefaultCipherSuites()
{
return socketFactory.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites()
{
return socketFactory.getSupportedCipherSuites();
}
@Override
public Socket createSocket(Socket socket, String string, int i, boolean bln) throws IOException
{
return socketFactory.createSocket(socket, string, i, bln);
}
@Override
public Socket createSocket(String string, int i) throws IOException
{
return socketFactory.createSocket(string, i);
}
@Override
public Socket createSocket(String string, int i, InetAddress ia, int i1) throws IOException
{
return socketFactory.createSocket(string, i, ia, i1);
}
@Override
public Socket createSocket(InetAddress ia, int i) throws IOException
{
return socketFactory.createSocket(ia, i);
}
@Override
public Socket createSocket(InetAddress ia, int i, InetAddress ia1, int i1) throws IOException
{
return socketFactory.createSocket(ia, i, ia1, i1);
}
@Override
public Socket createSocket() throws IOException
{
return socketFactory.createSocket();
}
}
我的问题类似于:SSLSocketFactory in java
我需要设置自定义 SSLSocketFactory...除了我 没有 有 https 连接(它是 LDAPS),所以不能使用:
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
...设置 SSLSocketFactory。我初始化了一个 SSLContext 对象,但是当我建立 LDAP 连接时,默认的 SSLContext 被自动调用,因为我的自定义对象没有设置:
dirContext = new InitialDirContext(env); // <-- reverts to default ssl context
下面第 3 行是否有非 HTTPS 等效方法:
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(myKeyManagerFactory.getKeyManagers(), myTrustManagerArray, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
是的,有。
env.put("java.naming.ldap.factory.socket", UnsecuredSSLSocketFactory.class.getName());
UnsecuredSSLSocketFactory.java:
public class UnsecuredSSLSocketFactory extends SSLSocketFactory
{
private SSLSocketFactory socketFactory;
public UnsecuredSSLSocketFactory()
{
try
{
var sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{new X509TrustManager()
{
@Override
public void checkClientTrusted(X509Certificate[] xcs, String string){}
@Override
public void checkServerTrusted(X509Certificate[] xcs, String string){}
@Override
public X509Certificate[] getAcceptedIssuers()
{
return null;
}
}}, new SecureRandom());
socketFactory = sslContext.getSocketFactory();
}
catch(Exception e)
{
throw new RuntimeException(e);
}
}
@SuppressWarnings("unused")
public static SocketFactory getDefault()
{
return new UnsecuredSSLSocketFactory();
}
@Override
public String[] getDefaultCipherSuites()
{
return socketFactory.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites()
{
return socketFactory.getSupportedCipherSuites();
}
@Override
public Socket createSocket(Socket socket, String string, int i, boolean bln) throws IOException
{
return socketFactory.createSocket(socket, string, i, bln);
}
@Override
public Socket createSocket(String string, int i) throws IOException
{
return socketFactory.createSocket(string, i);
}
@Override
public Socket createSocket(String string, int i, InetAddress ia, int i1) throws IOException
{
return socketFactory.createSocket(string, i, ia, i1);
}
@Override
public Socket createSocket(InetAddress ia, int i) throws IOException
{
return socketFactory.createSocket(ia, i);
}
@Override
public Socket createSocket(InetAddress ia, int i, InetAddress ia1, int i1) throws IOException
{
return socketFactory.createSocket(ia, i, ia1, i1);
}
@Override
public Socket createSocket() throws IOException
{
return socketFactory.createSocket();
}
}