当前位置: 首页 > 面试题库 >

使用HttpsURLConnection时如何覆盖Android发送到服务器的密码列表?

澹台阳秋
2023-03-14
问题内容

在TLS协商期间,客户端将支持的密码列表发送到服务器,服务器选择一个,然后开始加密。当我HttpsURLConnection用于通信时,我想更改此由Android发送到服务器的密码列表。

我知道我可以setSSLSocketFactoryHttpsURLConnection对象上使用来设置它以使用SSLSocketFactory。当我想要更改由SSLSocket返回的trustmanager等时,此功能很有用SSLSocketFactory

我知道,通常可以使用一个SSLParameters对象来编辑此密码套件列表,并使用它们提供的方法将其传递给SSlsocketSSLEngine对象。

但是SSLSocketFactory似乎没有暴露这种方法!

我找不到改变我传递给SSLParameters的返回SSLSocket对象SSLSocketFactory方法HttpsURLConnection

该怎么办?

我猜想这不仅与Android有关,而且与Java有关。也许有一种面向对象的方法(例如,将其扩展SSLSocketFactory并提供给HttpsURLConnection?)


问题答案:

这段代码有点原始。请谨慎使用。

public class PreferredCipherSuiteSSLSocketFactory extends SSLSocketFactory {


private static final String PREFERRED_CIPHER_SUITE = "TLS_RSA_WITH_AES_128_CBC_SHA";

private final SSLSocketFactory delegate;

public PreferredCipherSuiteSSLSocketFactory(SSLSocketFactory delegate) {

    this.delegate = delegate;
}

@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) {

    String[] defaultCipherSuites = sslSocketFactory.getDefaultCipherSuites();

    ArrayList<String> suitesList = new ArrayList<String>(Arrays.asList(defaultCipherSuites));
    suitesList.remove(PREFERRED_CIPHER_SUITE);
    suitesList.add(0, PREFERRED_CIPHER_SUITE);

    return suitesList.toArray(new String[suitesList.size()]);
}

private static String[] setupPreferredSupportedCipherSuites(SSLSocketFactory sslSocketFactory) {

    String[] supportedCipherSuites = sslSocketFactory.getSupportedCipherSuites();

    ArrayList<String> suitesList = new ArrayList<String>(Arrays.asList(supportedCipherSuites));
    suitesList.remove(PREFERRED_CIPHER_SUITE);
    suitesList.add(0, PREFERRED_CIPHER_SUITE);

    return suitesList.toArray(new String[suitesList.size()]);
}
}

当您想使用它时。

            HttpsURLConnection connection = (HttpsURLConnection) (new URL(url))
                .openConnection();
        SSLContext context = SSLContext.getInstance("TLS");
        TrustManager tm[] = {new SSLPinningTrustManager()};
        context.init(null, tm, null);
        SSLSocketFactory preferredCipherSuiteSSLSocketFactory = new PreferredCipherSuiteSSLSocketFactory(context.getSocketFactory());
        connection.setSSLSocketFactory(preferredCipherSuiteSSLSocketFactory);
                    connection.connect();

谢谢。



 类似资料:
  • 在通常的场景中,连接字符串包含纯文本的密码,但这可以被Wireshark捕获,因此我想在一个连接字符串中使用加密的密码。我从Postgres文档中找到了以下摘录:

  • 问题内容: 我想使用Android将数据发送到我的php页面。我该怎么做? 问题答案: 您可以使用AndroidHttpClient进行GET或POST请求: 创建一个AndroidHttpClient来执行您的请求。 创建一个HttpGet或HttpPost请求。 使用setEntity和setHeader]方法填充请求。 对您的请求使用客户端上的execute方法之一。

  • 问题内容: 我想使用POST方法将JSONObject发送到服务器。我已经使用凌空库通过字符串参数来正常工作,但是如果我尝试使用json对象,则在调用json对象时显示错误,这是我的代码 我的错误表单服务器是: 如何解决这个问题呢。我要添加 标题,请检查我的代码是否正确。请给我一个解决这个问题的建议 问题答案: JsonObjectRequest中的第三个参数用于以jsonobject形式传递发布

  • 问题内容: 似乎有两种方法可以将数据发送到服务器。一种是用于获取像素数组及其8位颜色值。另一种方法是用于发送文件附件。此方法在此处演示。 我想建立一个人们可以保存其画布图纸的站点。哪种方法对我的用户而言更具可扩展性和更快性? 问题答案: 打开选项:使用fabric.js,您可以将fabric.js画布序列化为JSON。 它不仅提供了附加的编辑功能层,而且还允许您执行以下操作(更不用说以后可以编辑其

  • 我用这个代码发送后数据到服务器使用android。有人能给我任何想法或您的示例如何发送POST或GET json数据到服务器TOMCAT...!步骤提示: > 创建HttpClient 向给定URL发出POST请求 构建jsonObject 转换JSONObject到JSON到String 设置json为StringEntity 设置http帖子实体 设置一些头来通知服务器内容的类型 对给定URL

  • 我试图发送电子邮件使用gmail smtp使用javax.mail.下面是我的代码 代码工作正常当我在本地服务器上运行它时,但当我尝试在Elastic beanstek上运行它时(我的服务器在AWS EBS上运行),身份验证失败异常即将到来注意:我已打开从Google A/c设置访问不太安全的应用程序,但我仍然收到此错误 javax.mail.身份验证失败异常:534-5.7.14请通过您的网络浏