使用SSLCertificateSocketFactory支持Android HTTPS SNI

 乐韵答题 发布于 2023-01-07 18:34

我正在尝试使用SSLCertificateSocketFactory.setHostname添加SNI支持,通过wireshark我看到客户端和启用SNI的服务器之间的通信,CLIENT HELLO进入服务器(设置了正确的主机名),Server响应Server Hello并将证书发送给客户端但是在那之后客户端没有发送证书和通信/握手停止,通过openssl命令openssl s_client -connect theclient -servername thehostname -cert thecertificate一切顺利,握手成功发生..

我正在使用套接字和socket.startHandshake我得到异常:IOException:javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚.

           final SSLCertificateSocketFactory sslSocketFactory = (SSLCertificateSocketFactory) SSLCertificateSocketFactory.getDefault(0);

            socket = (SSLSocket) sslSocketFactory.createSocket(InetAddress.getByName("theserver"), 443);


            socket.setEnabledProtocols(socket.getSupportedProtocols());

            String[] cipherArray = socket.getEnabledCipherSuites();
            for(int i = 0; i= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                sslSocketFactory.setHostname(socket, "thehostname");
            } else {
                try {
                    java.lang.reflect.Method setHostnameMethod = socket.getClass().getMethod("setHostname", String.class);
                    setHostnameMethod.invoke(socket, "thehostname");
                } catch (Exception e) {
                    Log.w("", "SNI not useable", e);
                }
            }
            socket.setSoTimeout(20000);
            socket.setUseClientMode(true);
            Log.i(getClass().toString(), "Connected.");
            socket.startHandshake();
            SSLSession session = socket.getSession();
            boolean secured = session.isValid();

这个IOexception SSLHANDSHAKEEXCEPTION在Android开发人员上的解决方案是https://developer.android.com/training/articles/security-ssl.html#CommonProblems:

"从InputStream中获取一个特定的CA,使用它来创建一个KeyStore,然后用于创建和初始化一个TrustManager.一个TrustManager是系统用来验证来自服务器的证书,并通过一个KeyStore创建一个.或更多CA-那些将是该TrustManager信任的唯一CA.

给定新的TrustManager,该示例初始化一个新的SSLContext,它提供了一个SSLSocketFactory,可用于覆盖HttpsURLConnection的默认SSLSocketFactory.这样连接将使用您的CA进行证书验证."

现在sslcontext返回SSLSOCKETFACTORY,我想使用SSLCertificateSocketFactory(用于sethostname方法)怎么办..我希望问题很清楚,如果不是让我知道或者随意让它更清楚

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有