Java jsoup和密码套件SSL
在建立SSL连接时,我可以选择jsoup使用的密码吗? 我有Java7和jsoup的最新版本,但当jsoup进行SSL连接时,它永远不会使用web服务器支持的最佳密码进行连接。我能强迫你选择吗 编辑 现在,当连接到https时,jsoup只对ECDHE使用密码 我能强迫你选择吗Java jsoup和密码套件SSL,java,ssl,jsoup,Java,Ssl,Jsoup,在建立SSL连接时,我可以选择jsoup使用的密码吗? 我有Java7和jsoup的最新版本,但当jsoup进行SSL连接时,它永远不会使用web服务器支持的最佳密码进行连接。我能强迫你选择吗 编辑 现在,当连接到https时,jsoup只对ECDHE使用密码 我能强迫你选择吗 不可以。SSL服务器选择密码套件,而不是客户端。除非您对启用的密码套件进行了更改,否则您应该从Java支持的几十个密码套件中选择任何密码套件。是的,我可以强制选择。当我仅使用我的密码设置启用的密码套件时,服务器(如果支持
不可以。SSL服务器选择密码套件,而不是客户端。除非您对启用的密码套件进行了更改,否则您应该从Java支持的几十个密码套件中选择任何密码套件。是的,我可以强制选择。当我仅使用我的密码设置启用的密码套件时,服务器(如果支持)将选择它。我开发了一个简单的classIf,并且仅当服务器支持该套件时。服务器仍然选择。这不是个好主意。
import java.util.ArrayList;
import java.util.Arrays;
import java.net.Socket;
import java.net.UnknownHostException;
import java.net.InetAddress;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.HttpsURLConnection;
import java.io.IOException;
public class PreferredCipherSuiteSSLSocketFactory extends SSLSocketFactory
{
private final SSLSocketFactory delegate;
public PreferredCipherSuiteSSLSocketFactory(SSLSocketFactory delegate)
{
this.delegate = delegate;
}
public PreferredCipherSuiteSSLSocketFactory()
{
this.delegate = HttpsURLConnection.getDefaultSSLSocketFactory();
}
@Override
public String[] getDefaultCipherSuites()
{
return setupPreferredDefaultCipherSuites(this.delegate);
}
@Override
public String[] getSupportedCipherSuites()
{
return setupPreferredSupportedCipherSuites(this.delegate);
}
@Override
public Socket createSocket(String arg0, int arg1) throws IOException, UnknownHostException
{
Socket socket = this.delegate.createSocket(arg0, arg1);
String[] cipherSuites = setupPreferredDefaultCipherSuites(delegate);
((SSLSocket)socket).setEnabledCipherSuites(cipherSuites);
return socket;
}
@Override
public Socket createSocket(InetAddress arg0, int arg1) throws IOException
{
Socket socket = this.delegate.createSocket(arg0, arg1);
String[] cipherSuites = setupPreferredDefaultCipherSuites(delegate);
((SSLSocket)socket).setEnabledCipherSuites(cipherSuites);
return socket;
}
@Override
public Socket createSocket(Socket arg0, String arg1, int arg2, boolean arg3) throws IOException
{
Socket socket = this.delegate.createSocket(arg0, arg1, arg2, arg3);
String[] cipherSuites = setupPreferredDefaultCipherSuites(delegate);
((SSLSocket)socket).setEnabledCipherSuites(cipherSuites);
return socket;
}
@Override
public Socket createSocket(String arg0, int arg1, InetAddress arg2, int arg3) throws IOException, UnknownHostException
{
Socket socket = this.delegate.createSocket(arg0, arg1, arg2, arg3);
String[] cipherSuites = setupPreferredDefaultCipherSuites(delegate);
((SSLSocket)socket).setEnabledCipherSuites(cipherSuites);
return socket;
}
@Override
public Socket createSocket(InetAddress arg0, int arg1, InetAddress arg2, int arg3) throws IOException
{
Socket socket = this.delegate.createSocket(arg0, arg1, arg2, arg3);
String[] cipherSuites = setupPreferredDefaultCipherSuites(delegate);
((SSLSocket)socket).setEnabledCipherSuites(cipherSuites);
return socket;
}
private static String[] setupPreferredDefaultCipherSuites(SSLSocketFactory sslSocketFactory)
{
ArrayList<String> suitesList = new ArrayList<String>(Arrays.asList(sslSocketFactory.getSupportedCipherSuites()));
ArrayList<String> newList = new ArrayList<String>();
for(String s : suitesList)
{
if(s.indexOf("ECDHE")!=-1)
newList.add(s);
}
return newList.toArray(new String[newList.size()]);
}
private static String[] setupPreferredSupportedCipherSuites(SSLSocketFactory sslSocketFactory)
{
ArrayList<String> suitesList = new ArrayList<String>(Arrays.asList(sslSocketFactory.getSupportedCipherSuites()));
ArrayList<String> newList = new ArrayList<String>();
for(String s : suitesList)
{
if(s.indexOf("ECDHE")!=-1)
newList.add(s);
}
return newList.toArray(new String[newList.size()]);
}
}
PreferredCipherSuiteSSLSocketFactory objPrefCipher = new PreferredCipherSuiteSSLSocketFactory();
HttpsURLConnection.setDefaultSSLSocketFactory(objPrefCipher);