Поддержка Android HTTPS SNI с использованием SSLCertificateSocketFactory

Я пытаюсь добавить поддержку SNI, используя SSLCertificateSocketFactory.setHostname, с помощью wireshark я вижу связь между клиентом и сервером, поддерживающим SNI, ПРИВЕТ КЛИЕНТА отправляется на сервер (с правильным заданным именем хоста), Сервер отвечает 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<cipherArray.length; i++) {
                Log.e("","Available Cipher:"+cipherArray[i]);
            }
            if (Build.VERSION.SDK_INT >= 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 для разработчиков Androidhttps://developer.android.com/training/articles/security-ssl.html#CommonProblems :

«Возьмите определенный CA из InputStream, используйте его для создания хранилища ключей, который затем используется для создания и инициализации TrustManager. TrustManager - это то, что система использует для проверки сертификатов с сервера и - путем создания одного из хранилища ключей с одним или более CA - это будут единственные CA, которым доверяет этот TrustManager.

Учитывая новый TrustManager, пример инициализирует новый SSLContext, который предоставляет SSLSocketFactory, который можно использовать для переопределения стандартного SSLSocketFactory из HttpsURLConnection. Таким образом, соединение будет использовать ваши CA для проверки сертификата. "

Теперь sslcontext возвращает SSLSOCKETFACTORY, я хочу использовать SSLCertificateSocketFactory (для метода sethostname). Что делать .. Надеюсь, вопрос ясен, если нет, дайте мне знать или не стесняйтесь, чтобы сделать более понятным

Ответы на вопрос(1)

Ваш ответ на вопрос