【问题标题】:What is the alternative of SSLParameter.setServerNames in android sdk level 23android sdk 级别 23 中 SSLParameter.setServerNames 的替代方案是什么
【发布时间】:2016-07-31 10:07:33
【问题描述】:

我正在使用 SSLSocket 连接到服务器。我想使用 ssl SNI 扩展。我可以在 java 中使用SSLParameter.setServerNames。但它出现在 android 中直到 sdk 24 才可用。我在这里有什么选择?

【问题讨论】:

    标签: android ssl sni


    【解决方案1】:

    我遇到了同样的问题,通过使用反射解决了。 使用以下方式连接套接字:

    SSLSocketFactory sf = (SSLSocketFactory) SSLSocketFactory.getDefault();
    SSLSocket socket = (SSLSocket) sf.createSocket(uri.getHost(), 443);
    setSNIHost(sf, socket, uri.getHost());
    SSLSession s = socket.getSession();
    

    其中 setSNIHost 声明为:

    public void setSNIHost(final SSLSocketFactory factory, final SSLSocket socket, final String hostname) {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            Log.i(TAG, "Setting SNI via SSLParameters");
            SNIHostName sniHostName = new SNIHostName(hostname);
            SSLParameters sslParameters = socket.getSSLParameters();
            List<SNIServerName> sniHostNameList = new ArrayList<>(1);
            sniHostNameList.add(sniHostName);
            sslParameters.setServerNames(sniHostNameList);
            socket.setSSLParameters(sslParameters);
        } else if (factory instanceof android.net.SSLCertificateSocketFactory) {
            Log.i(TAG, "Setting SNI via SSLCertificateSocketFactory");
            ((android.net.SSLCertificateSocketFactory)factory).setHostname(socket, hostname);
        } else {
            Log.i(TAG, "Setting SNI via reflection");
            try {
                socket.getClass().getMethod("setHostname", String.class).invoke(socket, hostname);
            } catch (Throwable e) {
                Log.e(TAG, "Could not call SSLSocket#setHostname(String) method ", e);
            }
        }
    }
    

    我真的不记得我在哪里复制了反射代码,我只是添加了对 API 24 的支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 2021-11-13
      • 2018-12-01
      相关资源
      最近更新 更多