Реализация TLS-SSL в Android - javax.net.ssl.SSLHandshakeException: рукопожатие не удалось - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь реализовать SSL с TLS v1.2 в Android. Код, который я написал, выглядит следующим образом:

try {
     if (mSocket == null || !mSocket.isBound()
                            || mSocket.isClosed()) {
     KeyStore keyStore = KeyStore.getInstance("PKCS12");
     InputStream inputStream = mContext.getAssets().open("keystore.pfx");
     try {
          keyStore.load(inputStream, mContext.getString(R.string.pw).toCharArray());
          } catch (CertificateException e) {
            e.printStackTrace();
          } catch (NoSuchAlgorithmException e) {
          e.printStackTrace();
          } finally {
                     if (inputStream != null) {
                     inputStream.close();
                     }
          }


          KeyStore trustStore = KeyStore.getInstance("PKCS12");
          InputStream inputStreamts = mContext.getAssets().open("truststore.pfx");
          try {
               trustStore.load(inputStreamts, mContext.getString(R.string.ts_pw).toCharArray());
              } catch (CertificateException e) {
              e.printStackTrace();
              } catch (NoSuchAlgorithmException e) {
              e.printStackTrace();
              } finally {
              if (inputStreamts != null) {
              inputStreamts.close();
              }
              }

           TrustManagerFactory tmf = TrustManagerFactory
                                .getInstance(TrustManagerFactory.getDefaultAlgorithm());
           tmf.init(trustStore);
           KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
           kmf.init(keyStore, mContext.getString(R.string.pw).toCharArray());
           SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
           sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
           SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
           mSocket = (SSLSocket) factory.createSocket(businessIp, businessPort);
           mSocket.setEnabledProtocols(new String[]{"TLSv1.2"});
                 mSocket.setEnabledCipherSuites(sslContext.getServerSocketFactory().getSupportedCipherSuites());
          }
          mSocket.setUseClientMode(true);

          StringBuilder inputLineBuilder = new StringBuilder();
          if (mSocket != null) {
          try {
               //printSocketInfo(mSocket);
               mSocket.startHandshake();
               OutputStream os = mSocket.getOutputStream();
               os.write(f_RequestData);
               PrintWriter out = new PrintWriter(
                                    new BufferedWriter(
                                            new OutputStreamWriter(os)));

               out.flush();
               if (out.checkError())
               System.out.println("SSLSocketClient:  java.io.PrintWriter error");    
               BufferedReader in = new BufferedReader(
                                    new InputStreamReader(
                                            mSocket.getInputStream()));
               String response;
               while ((response = in.readLine()) != null)
                     inputLineBuilder.append(response);
               in.close();
               out.close();
               mSocket.close();
               m_Response = inputLineBuilder.toString();
            }catch(Exception e){e.printstacktrace();}
            }
                } catch (UnknownHostException e) {
                    e.printstacktrace();
                } catch (SocketTimeoutException e) {
                    e.printStackTrace();
                } catch (SocketException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (UnrecoverableKeyException e) {
                    e.printStackTrace();
                } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
                } catch (KeyStoreException e) {
                    e.printStackTrace();
                } catch (KeyManagementException e) {
                    e.printStackTrace();
                }
            }

Сокет успешно создан, но при выполнении mSocket.startHandshake () я получаю следующее исключение:

2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: javax.net.ssl.SSLHandshakeException: рукопожатие не удалось

2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: at com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake (ConscryptFileDescriptorSocket.java:276)

2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: at com.example.networkmanager.ConnectionManager $ 1.run (ConnectionManager.java:135)

2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: at java.lang.Thread.run (Thread.java:764)

2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: вызвано: javax.net.ssl.SSLProtocolException: SSL рукопожатие прервано: ssl = 0x724c726080: сбой в библиотеке SSL, обычно ошибка протокола

2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: Ошибка: 10000410: SSL Подпрограммы: OPENSSL_internal: SSLV3_ALERT_HANDSHAKE_FAILURE (external / boringssl / src / ssl / tls_record.cc: 579 0x7242eb8540: 0x00000001)

2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: Ошибка: 1000009a: SSL Подпрограммы: OPENSSL_internal: HANDSHAKE_FAILURE_ON_CLIENT_HELLO (Внешний / boringssl / SRC / SSL / handshake_client.cc: 893 0x724ebf70d7: 0x00000000)

2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake (собственный метод)

2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: at com.android.org.conscrypt.SslWrapper.doHandshake (SslWrapper.java:374)

2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: at com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake (ConscryptFileDescriptorSocket.java:217)

2019-01-25 16: 56: 37,627 4905-4991 / com.example W / System.err: ... 2 более

При попытке распечатать информацию о сокете. Следующая информация, которую я могу видеть:

 Need client authentication = false
 Cipher suite = SSL_NULL_WITH_NULL_NULL
 Protocol = NONE
 Peer Host = null
 Peer Port = -1
 Is Valid = false

Наряду со следующим исключением при попытке получить принцип равноправия:

javax.net.ssl.SSLPeerUnverifiedException: нет сертификата однорангового узла на com.android.org.conscrypt.SSLNullSession.getPeerPrincipal (SSLNullSession.java:122) в com.neml.direct.qr.networkmanager.ConnectionManager.printSocketInfo (ConnectionManager.java:246) в com.neml.direct.qr.networkmanager.ConnectionManager $ 1.run (ConnectionManager.java:134) at java.lang.Thread.run (Thread.java:764)

Я искал эту проблему в нескольких сообщениях и блогах stackoverflow. следующие вещи, которые я уже проверил:

  1. KeyStore & TrustStore загружен правильно и не является нулевым.
  2. Проверен порядок цепочки сертификатов. Это правильно.

Я не могу понять, чего мне не хватает, что еще нужно сделать, чтобы успешно начать рукопожатие. Пожалуйста помоги. Любая помощь будет оценена.

...