Android 7.0 : 'javax.net.ssl.SSLHandshakeException: Connection closed by peer

前端 未结 2 1657
礼貌的吻别
礼貌的吻别 2021-01-14 11:30

When I am trying to access a \'https\' web service from my app , it is giving a \'javax.net.ssl.SSLHandshakeException: Connection closed by peer\' error. Th

相关标签:
2条回答
  • 2021-01-14 12:19

    I had to use the extended SSLSocket class to include all Protocols and Cipher Suites in order to overcome this issue . The solution lies in the GetProtocolList() & GetCipherList()

    private static OkHttpClient.Builder enableAllProtocols(OkHttpClient.Builder client) {
        try {
            client.sslSocketFactory(new SSLSocketFactoryExtended(), provideX509TrustManager());
        } catch (Exception exc) {
            Log.e("OkHttpTLSCompat", "Error while setting Protocols", exc);
        }
        return client;
    }
    

    SSLSocketFactoryExtended Class file

    public class SSLSocketFactoryExtended extends SSLSocketFactory {
        private SSLContext mSSLContext;
        private String[] mCiphers;
        private String[] mProtocols;
    
        public SSLSocketFactoryExtended() throws NoSuchAlgorithmException, KeyManagementException {
            initSSLSocketFactoryEx(null,null,null);
        }
    
        public String[] getDefaultCipherSuites() {
            return mCiphers;
        }
    
        public String[] getSupportedCipherSuites() {
            return mCiphers;
        }
    
        public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
            SSLSocketFactory factory = mSSLContext.getSocketFactory();
            SSLSocket ss = (SSLSocket)factory.createSocket(s, host, port, autoClose);
    
            ss.setEnabledProtocols(mProtocols);
            ss.setEnabledCipherSuites(mCiphers);
    
            return ss;
        }
    
        public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
            SSLSocketFactory factory = mSSLContext.getSocketFactory();
            SSLSocket ss = (SSLSocket)factory.createSocket(address, port, localAddress, localPort);
    
            ss.setEnabledProtocols(mProtocols);
            ss.setEnabledCipherSuites(mCiphers);
    
            return ss;
        }
    
        @Override
        public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException {
            SSLSocketFactory factory = mSSLContext.getSocketFactory();
            SSLSocket ss = (SSLSocket)factory.createSocket(host, port, localHost, localPort);
    
            ss.setEnabledProtocols(mProtocols);
            ss.setEnabledCipherSuites(mCiphers);
    
            return ss;
        }
    
        @Override
        public Socket createSocket(InetAddress host, int port) throws IOException {
            SSLSocketFactory factory = mSSLContext.getSocketFactory();
            SSLSocket ss = (SSLSocket)factory.createSocket(host, port);
    
            ss.setEnabledProtocols(mProtocols);
            ss.setEnabledCipherSuites(mCiphers);
    
            return ss;
        }
    
        @Override
        public Socket createSocket(String host, int port) throws IOException {
            SSLSocketFactory factory = mSSLContext.getSocketFactory();
            SSLSocket ss = (SSLSocket)factory.createSocket(host, port);
    
            ss.setEnabledProtocols(mProtocols);
            ss.setEnabledCipherSuites(mCiphers);
    
            return ss;
        }
    
        private void initSSLSocketFactoryEx(KeyManager[] km, TrustManager[] tm, SecureRandom random) throws NoSuchAlgorithmException, KeyManagementException {
            mSSLContext = SSLContext.getInstance("TLS");
            mSSLContext.init(km, tm, random);
    
            mProtocols = GetProtocolList();
            mCiphers = GetCipherList();
        }
    
        protected String[] GetProtocolList() {
            String[] protocols = { "TLSv1", "TLSv1.1", "TLSv1.2", "TLSv1.3"};
            String[] availableProtocols = null;
    
            SSLSocket socket = null;
    
            try {
                SSLSocketFactory factory = mSSLContext.getSocketFactory();
                socket = (SSLSocket)factory.createSocket();
    
                availableProtocols = socket.getSupportedProtocols();
            } catch(Exception e) {
                return new String[]{ "TLSv1" };
            } finally {
                if(socket != null)
                    try {
                        socket.close();
                    } catch (IOException e) {
                    }
            }
    
            List<String> resultList = new ArrayList<String>();
            for(int i = 0; i < protocols.length; i++) {
                int idx = Arrays.binarySearch(availableProtocols, protocols[i]);
                if(idx >= 0)
                    resultList.add(protocols[i]);
            }
    
            return resultList.toArray(new String[0]);
        }
    
        protected String[] GetCipherList() {
            List<String> resultList = new ArrayList<String>();
            SSLSocketFactory factory = mSSLContext.getSocketFactory();
            for(String s : factory.getSupportedCipherSuites()){
                resultList.add(s);
            }
            return resultList.toArray(new String[resultList.size()]);
        }
    }
    
    0 讨论(0)
  • 2021-01-14 12:20

    try use this code, it work for me :

     private static void initializeSSLContext(Context mContext){
        try {
            SSLContext.getInstance("TLSv1.2");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        try {
            ProviderInstaller.installIfNeeded(mContext.getApplicationContext());
        } catch (GooglePlayServicesRepairableException e) {
            e.printStackTrace();
        } catch (GooglePlayServicesNotAvailableException e) {
            e.printStackTrace();
        }
    }
    

    and don't forget to usr google security library :

      compile 'com.google.android.gms:play-services-safetynet:11.6.2'
    
    0 讨论(0)
提交回复
热议问题