Android SSL HttpGet (няма сертыфіката партнёра) памылка АБО (Сувязь спынена аднарангавыя) Памылка

Я спрабую зрабіць просты HttpGet чытаць вэб-старонкі. Я гэта працуе на прашыўцы і працаваць на Android праз HTTP, але не па пратаколе HTTPS.

The url is an internal network IP and custom port, so I can read with http like this using a path of http://ipaddress:port/MyPage.html

HttpClient httpclient = new DefaultHttpClient(httpParameters);
                    HttpResponse response;
        String responseString = null;
        try {
           //Try connection
            HttpGet get = new HttpGet(params[0].path);
            get.addHeader("Authorization",
                    "Basic "
                            + Base64.encodeBytes(new String(params[0].username + ":" + params[0].password)
                                    .getBytes()));
        response = httpclient.execute(get);
        StatusLine statusLine = response.getStatusLine();
        if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            response.getEntity().writeTo(out);
            out.close();
            responseString = out.toString();
        } else {
           //Closes the connection.
            response.getEntity().getContent().close();
            throw new IOException(statusLine.getReasonPhrase());
        }
    } catch (ClientProtocolException e) {
        Log.e(TAG, "ClientProtocolException");
        this.e = e;
    } catch (IOException e) {
        Log.e(TAG, "IOException");
        this.e = e;
    }
    return responseString;

When I try using https, I get the No peer certificate error. So I have tried using this code: HttpClient httpclient = new DefaultHttpClient(httpParameters);

private HttpClient createHttpClient() {
        try {
            KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
            trustStore.load(null, null);

            SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
            sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

            HttpParams params = new BasicHttpParams();
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
            HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
            HttpProtocolParams.setUseExpectContinue(params, true);

            SchemeRegistry schReg = new SchemeRegistry();
            schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
            schReg.register(new Scheme("https", sf, 8080));
            ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);

            return new DefaultHttpClient(conMgr, params);

        } catch (Exception e) {
            return new DefaultHttpClient();
        }
    }

але гэта дае мне Сувязь спынена аднарангавыя памылка.

Што я не так раблю? Я магу спакойна ігнараваць сертыфікат, так як гэта ўнутраная сетка з самоподписывающимся CERT, аднак я не маю ніякага кантролю над верціць і карыстальнікамі майго прыкладання можа мець розныя сертыфікаты, так што я сапраўды патрэбен прыняць аўто ці абыйсці яго.

дзякуй

EDIT ------------------------------

Пасля спробы My-Name-Is адказ ніжэй: Я стварыў клас CustomX509TrustManager як гэта было прапанавана, а затым стварыць карыстацкі HttpClient выкарыстоўваць яго як гэта:

private HttpClient sslClient(HttpClient client) {
        try {
            CustomX509TrustManager tm = new CustomX509TrustManager();
            SSLContext ctx = SSLContext.getInstance("TLS");
            ctx.init(null, new TrustManager[] { tm }, null);
            SSLSocketFactory ssf = new MySSLSocketFactory(ctx);
            ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
            ClientConnectionManager ccm = client.getConnectionManager();
            SchemeRegistry sr = ccm.getSchemeRegistry();
            sr.register(new Scheme("https", ssf, 8080));
            return new DefaultHttpClient(ccm, client.getParams());
        } catch (Exception ex) {
            return null;
        }
    }

І, нарэшце, выкарыстоўваць гэты HttpClient, як гэта:

private class httpGETTask extends AsyncTask {
private Exception e = null;

@Override
protected String doInBackground(GetParams... params) {
   //Set connection parameters
    HttpParams httpParameters = new BasicHttpParams();
    int timeoutConnection = 15000;
    HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
    int timeoutSocket = 15000;
    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

    Log.v(TAG, params[0].path);
    HttpClient httpclient = new DefaultHttpClient(httpParameters);
    httpclient = sslClient(httpclient);

    HttpResponse response;
    String responseString = null;
    try {
       //Try connection
        HttpGet get = new HttpGet(params[0].path);
        get.addHeader("Authorization",
                "Basic "
                        + Base64.encodeBytes(new String(params[0].username + ":" + params[0].password)
                                .getBytes()));

        response = httpclient.execute(get);
        StatusLine statusLine = response.getStatusLine();
        if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            response.getEntity().writeTo(out);
            out.close();
            responseString = out.toString();
        } else {
           //Closes the connection.
            response.getEntity().getContent().close();
            throw new IOException(statusLine.getReasonPhrase());
        }
    } catch (ClientProtocolException e) {
        Log.e(TAG, "ClientProtocolException");
        this.e = e;
    } catch (IOException e) {
        Log.e(TAG, "IOException");
        this.e = e;
    }
    return responseString;

Які ўвайшоў шлях у фармаце https://IP-адрас: 8080/page.html Але я атрымліваю Сувязь спынена Peer памылка:

<�Р> 05-24 08: 20: 32,500: Е/ConnectionHelper (1129): 05-24 IOException   08: 20: 32,550:/ConnectionHelper (1129) E: Змест Выключэнне загрузкі   05-24 08: 20: 32,550: Е/ConnectionHelper (1129):   javax.net.ssl.SSLException: Сувязь спынена аднарангавыя 05-24   08: 20: 32,550: Е/ConnectionHelper (1129): у   org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake (Native   Метад) 05-24 08: 20: 32,550: Е/ConnectionHelper (1129): у   org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake (OpenSSLSocketImpl.java:410)   05-24 08: 20: 32,550: Е/ConnectionHelper (1129): у   org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl $ SSLInputStream. (OpenSSLSocketImpl.java:643)   05-24 08: 20: 32,550: Е/ConnectionHelper (1129): у   org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.getInputStream (OpenSSLSocketImpl.java:614)   05-24 08: 20: 32,550: Е/ConnectionHelper (1129): у   org.apache.http.impl.io.SocketInputBuffer. (SocketInputBuffer.java:70)   05-24 08: 20: 32,550: Е/ConnectionHelper (1129): у   org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer (SocketHttpClientConnection.java:83)   05-24 08: 20: 32,550: Е/ConnectionHelper (1129): у   org.apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer (DefaultClientConnection.java:170)   05-24 08: 20: 32,550: Е/ConnectionHelper (1129): у   org.apache.http.impl.SocketHttpClientConnection.bind (SocketHttpClientConnection.java:106)   05-24 08: 20: 32,550: Е/ConnectionHelper (1129): у   org.apache.http.impl.conn.DefaultClientConnection.openCompleted (DefaultClientConnection.java:129)   05-24 08: 20: 32,550: Е/ConnectionHelper (1129): у   org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection (DefaultClientConnectionOperator.java:172)   05-24 08: 20: 32,550: Е/ConnectionHelper (1129): у   org.apache.http.impl.conn.AbstractPoolEntry.open (AbstractPoolEntry.java:164)   05-24 08: 20: 32,550: Е/ConnectionHelper (1129): у   org.apache.http.impl.conn.AbstractPooledConnAdapter.open (AbstractPooledConnAdapter.java:119)   05-24 08: 20: 32,550: Е/ConnectionHelper (1129): у   org.apache.http.impl.client.DefaultRequestDirector.execute (DefaultRequestDirector.java:360)   05-24 08: 20: 32,550: Е/ConnectionHelper (1129): у   org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java:555)   05-24 08: 20: 32,550: Е/ConnectionHelper (1129): у   org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java:487)   05-24 08: 20: 32,550: Е/ConnectionHelper (1129): у   org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java:465)   05-24 08: 20: 32,550: Е/ConnectionHelper (1129): у   com.d_apps.my_app.connection_helpers.ConnectionHelper $ httpGETTask.doInBackground (ConnectionHelper.java:114)
28

7 адказы

Наступная крыніца павінен вырашыць вашу праблему.

import android.app.Activity;
import android.widget.EditText;
import android.os.Bundle;
import org.apache.http.HttpResponse;
import org.apache.http.Header
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity {

    private EditText text;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (EditText) findViewById(R.id.editText1);
        connect();
    }

    private void connect(){
        try {
            DataLoader dl = new DataLoader();
            String url = "https://IpAddress";
            HttpResponse response = dl.secureLoadData(url); 

            StringBuilder sb = new StringBuilder();
            sb.append("HEADERS:\n\n");

            Header[] headers = response.getAllHeaders();
            for (int i = 0; i < headers.length; i++) {
                Header h = headers[i];
                sb.append(h.getName()).append(":\t").append(h.getValue()).append("\n");
            }

            InputStream is = response.getEntity().getContent();
            StringBuilder out = new StringBuilder();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            for (String line = br.readLine(); line != null; line = br.readLine())
                out.append(line);
            br.close();

            sb.append("\n\nCONTENT:\n\n").append(out.toString()); 

            Log.i("response", sb.toString());
            text.setText(sb.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}


import android.app.Application;
import android.content.Context;
import java.io.InputStream;
public class MeaApplication extends Application {

    private static Context context;

    @Override
    public void onCreate() {
        super.onCreate();
        MeaApplication.context = getApplicationContext();
    }

    public static Context getAppContext() {
        return MeaApplication.context;
    }

    public static InputStream loadCertAsInputStream() {
        return MeaApplication.context.getResources().openRawResource(
                R.raw.meacert);
    }

}


import org.apache.http.conn.ssl.SSLSocketFactory;
import javax.net.ssl.SSLContext;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.UnrecoverableKeyException;
import javax.net.ssl.TrustManager;
import java.net.Socket;
import java.io.IOException;
import java.net.UnknownHostException;
/**
 * Taken from: http://janis.peisenieks.lv/en/76/english-making-an-ssl-connection-via-android/
 *
 */
public class CustomSSLSocketFactory extends SSLSocketFactory {
    SSLContext sslContext = SSLContext.getInstance("TLS");

    public CustomSSLSocketFactory(KeyStore truststore)
            throws NoSuchAlgorithmException, KeyManagementException,
            KeyStoreException, UnrecoverableKeyException {
        super(truststore);

        TrustManager tm = new CustomX509TrustManager();

        sslContext.init(null, new TrustManager[] { tm }, null);
    }

    public CustomSSLSocketFactory(SSLContext context)
            throws KeyManagementException, NoSuchAlgorithmException,
            KeyStoreException, UnrecoverableKeyException {
        super(null);
        sslContext = context;
    }

    @Override
    public Socket createSocket(Socket socket, String host, int port,
            boolean autoClose) throws IOException, UnknownHostException {
        return sslContext.getSocketFactory().createSocket(socket, host, port,
                autoClose);
    }

    @Override
    public Socket createSocket() throws IOException {
        return sslContext.getSocketFactory().createSocket();
    }
}


import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.io.IOException;
import java.io.InputStream;
import java.security.cert.CertificateFactory;
public class CustomX509TrustManager implements X509TrustManager {

    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
    }

    @Override
    public void checkServerTrusted(java.security.cert.X509Certificate[] certs,
            String authType) throws CertificateException {

       //Here you can verify the servers certificate. (e.g. against one which is stored on mobile device)

       //InputStream inStream = null;
       //try {
       //inStream = MeaApplication.loadCertAsInputStream();
       //CertificateFactory cf = CertificateFactory.getInstance("X.509");
       //X509Certificate ca = (X509Certificate)
       //cf.generateCertificate(inStream);
       //inStream.close();
        //
       //for (X509Certificate cert : certs) {
       //// Verifing by public key
       //cert.verify(ca.getPublicKey());
       //}
       //} catch (Exception e) {
       //throw new IllegalArgumentException("Untrusted Certificate!");
       //} finally {
       //try {
       //inStream.close();
       //} catch (IOException e) {
       //e.printStackTrace();
       //}
       //}
    }

    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }

}


import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.KeyManagementException;
import java.net.URISyntaxException;
import java.security.KeyStoreException;
import java.security.UnrecoverableKeyException;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import java.security.SecureRandom;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.client.methods.HttpGet;
public class DataLoader {

    public HttpResponse secureLoadData(String url)
            throws ClientProtocolException, IOException,
            NoSuchAlgorithmException, KeyManagementException,
            URISyntaxException, KeyStoreException, UnrecoverableKeyException {
        SSLContext ctx = SSLContext.getInstance("TLS");
        ctx.init(null, new TrustManager[] { new CustomX509TrustManager() },
                new SecureRandom());

        HttpClient client = new DefaultHttpClient();

        SSLSocketFactory ssf = new CustomSSLSocketFactory(ctx);
        ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
        ClientConnectionManager ccm = client.getConnectionManager();
        SchemeRegistry sr = ccm.getSchemeRegistry();
        sr.register(new Scheme("https", ssf, 443));
        DefaultHttpClient sslClient = new DefaultHttpClient(ccm,
                client.getParams());

        HttpGet get = new HttpGet(new URI(url));
        HttpResponse response = sslClient.execute(get);

        return response;
    }

}
55
дададзена
@ My-Name-Is, таму што я пачатковец на гэтым маглі б вы паказаць мне, як гэта зрабіць? Я спрабаваў шмат на аснове рашэння, якое я адправіў у маім папярэднім адказе, але ён не працуе.
дададзена аўтар gts13, крыніца
Наколькі я зразумеў, гэта выдатнае рашэнне, не давярае усе сертыфікаты і адпавядае 4 рашэння ў гэтай тэме stackoverflow.com/questions/2642777/… Я мае рацыю?
дададзена аўтар gts13, крыніца
Я атрымліваю паведамленне пра памылку: "<�б> SSLPeerUnverifiedException: Няма роўны сертыфікат "!
дададзена аўтар Igor Ganapolsky, крыніца
Неабходны Ці сертыфікат для гэтага? Я ўжо ведаю увесь код, але здаецца, што я нешта адсутнічае, таму што я/м па-ранейшаму сутыкаецца з той жа памылкі: `javax.net.ssl.SSLException: Сувязь спынена пэром ў com.android.org.conscrypt.NativeCrypto.SSL_do_handshake (Nati & ZWNJ; ве метаду) `
дададзена аўтар SweetWisher ツ, крыніца
Чалавек Калі б я мог даць вам +100 я бы дзякуй за дапамогу!
дададзена аўтар JPM, крыніца
@John Гэта рашэнне не выкарыстоўвае падзенне назад KeyStore , але вы можаце адаптаваць свой SSLSocketFactory , каб падтрымліваць гэтую функцыю. Soluton вышэй выкарыстоўвае карыстацкі X509TrustManager які вызначае прыкладанне, ці дазволена на імя канкрэтнага сервера, на аснове адкрытага ключа сертыфіката. Заказная рэалізацыя checkServerTrusted , які кантралюе гэты behavour закаментаваўшы, так як ён не можа быць карысным для іншых асяроддзяў.
дададзена аўтар My-Name-Is, крыніца
@zeeshan Я не загружаць любы сертыфікат на мясцовым узроўні [..] я адкрыццё сябе якія-небудзь уразлівасці Не, вы не ўводзіць якія-небудзь уразлівасцяў. Гэта проста дазваляе additionlly праверыць атрыманую Certificat ўнутры мабільнага прыкладання. <�Код> cert.verify (ca.getPublicKey ()); Я дадаў гэты кавалак крыніцы толькі каб паказаць адну магчымасць, як рэалізаваць checkServerTrusted метад. Для большасці прыкладанняў няма неабходнасці рабіць гэтую праверку.
дададзена аўтар My-Name-Is, крыніца
дададзена аўтар My-Name-Is, крыніца
@SweetWisher Не, вы не павінны трымаць серверы сертыфікат, які захоўваецца на мабільным прыладзе, пакуль вы не хочаце, каб праверыць яго, як гэта робіцца ў checkServerTrusted метад. Праверку частка закаментаваўшы, таму гэтая праверка проста па жаданні.
дададзена аўтар My-Name-Is, крыніца
@ Benoffi7 Даданне імпарту зрабілі :) Я зноў не кампілюецца праект, так як я здабываў асноўныя часткі з больш прасунутых праекта, некаторы час таму. На жаль, я не змог знайсці гэты зменены праект, так што калі ёсць якія-небудзь імпарт адсутнічае, калі ласка, дайце мне ведаць гэта.
дададзена аўтар My-Name-Is, крыніца
@IgorGanapolsky, адбываецца ваша паведамленне пра памылку для розных памылак. Без далейшых падрабязнасцяў гэта адгадаць, дзе рэальная праблема заключаецца.
дададзена аўтар My-Name-Is, крыніца
@ Benoffi7 Вядома. На дадзены момант у мяне няма зыходнага кода пад рукой. Тым не менш, я дадам імпарту сёння.
дададзена аўтар My-Name-Is, крыніца
Зразумеў. Дзякуй за гэта ўдакладненне. Калі маё прыкладанне стане вядомым (LifeLog24), я буду глядзець на дадаўшы гэтую дадатковую праверку таксама :)
дададзена аўтар zeeshan, крыніца
Правёўшы больш чым за адзін дзень, спрабуючы ўсё, нарэшце, гэты код працуе для мяне. Толькі змяніць я зрабіў было змяніць яго трохі, каб выкарыстоўваць з маёй POST, так як я не выкарыстоўваю GET для SSL. Іншая розніца ў мяне ёсць, што я не ёсць клас, які пашырае дадатак, і я не загружаць любы сертыфікат на мясцовым узроўні. Але ўсё-ткі, яна выдатна працуе. Я задаюся пытаннем, не загружаючы свой сертыфікат на мясцовым узроўні, я сябе адкрыццё любых уразлівасцяў, ці я ўсё яшчэ добра? Ці я ў асноўным у абыход аўтэнтыфікацыі, не ведаючы яго? Я не з'яўляюся экспертам у SSL, але гэта, здаецца, працуе плаўна, без якіх-небудзь памылак.
дададзена аўтар zeeshan, крыніца
Вы можаце паставіць імпарт? дзякуй!
дададзена аўтар benoffi7, крыніца
Прывітанне як вы дадасце Лічыльнікі пры выкарыстанні HttpPost?
дададзена аўтар user1410081, крыніца
Вы пампуеце .......
дададзена аўтар BinaryShrub, крыніца

Калі вы выкарыстоўваеце "Не давераны» (распрацоўшчык) сертыфікат, то ніжэй рашэнне. Мы павінны давяраць усе сертыфікаты, і ніжэй ёсць спосаб зрабіць гэта. Для давераных сертыфікатаў ён працуе без дадання функцыянальнасці ніжэй, мы проста неабходна змяніць HTTP на HTTPS і ён будзе працаваць.

Вось рашэнне для ня даверанай сертыфіката.

У HttpClient чынам, вы павінны стварыць карыстацкі клас ад org.apache.http.conn.ssl.SSLSocketFactory, а не адной самай org.apache.http.conn.ssl.SSLSocketFactory

Прыкладам можа служыць як ...

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.http.conn.ssl.SSLSocketFactory;
public class MySSLSocketFactory extends SSLSocketFactory {
    SSLContext sslContext = SSLContext.getInstance("TLS");

    public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
        super(truststore);

        TrustManager tm = new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };

        sslContext.init(null, new TrustManager[] { tm }, null);
    }

    @Override
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
        return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
    }

    @Override
    public Socket createSocket() throws IOException {
        return sslContext.getSocketFactory().createSocket();
    }
}

і выкарыстоўваць гэты клас пры стварэнні асобніка HttpClient.

public HttpClient getNewHttpClient() {
    try {
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        trustStore.load(null, null);

        SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
        sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        registry.register(new Scheme("https", sf, 443));

        ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

        return new DefaultHttpClient(ccm, params);
    } catch (Exception e) {
        return new DefaultHttpClient();
    }
}
14
дададзена
@IgorGanapolsky зрабіў і вырашыць выключэнне? Я атрымліваю тое ж самае.
дададзена аўтар techroid, крыніца

Праверце дату вашага прылады. Магчыма, вы змянілі яго на іншы год. Я ўвесь час атрымліваю гэтую праблему, калі дзеці выкарыстоўваюць свой тэлефон.

7
дададзена
Гэта на самай справе вырашыць маю праблему! Добра зроблена :-)
дададзена аўтар EZDsIt, крыніца
+1 Гэта, здаецца, самы распаўсюджаны выпадак, калі вы атрымліваеце паведамленне пра памылку Νο сертыфікат роўны .
дададзена аўтар Angelo, крыніца

Калі ў вас ёсць доступ да сервера з даверанай сертыфікатам значна лепш solutionis правільна наладзіць SSL, таму што АНДРОІД з'яўляецца больш абмежаваным, што iOS і настольны браўзэр адносна праверкі SSL

Гэта рашэнне не патрабуе якіх-небудзь змяненняў у вашым АНДРОІД прыкладання, так што гэта больш чыстае.

Вось прыклад канфігурацыі SSL для Apache (дадаць яго да вызначэння VirtualHost напрыклад,/і г.д./apache2/сайты з падтрымкай)

SSLEngine on
SSLCertificateFile    YOUR_CERT_PATH
SSLCACertificateFile  CA_ROOT_CERT_PATH
SSLCertificateKeyFile KEY_PATH

Я меў тую ж памылку, і калі я дадаў каранёвай сертыфікат CA, памылка пайшла і АНДРОІД не скардзяцца больш. Забяспечыць правільныя шляхі для гэтых файлаў, перазапусціце Apache і праверце зноў.

Ніякія файлы для каранёвага сертыфіката CA можа ўтрымліваць як корань і прамежкавы сертыфікат

Вы можаце праверыць канфігурацыю SSL з гэтага сайта і пераканайцеся, што ў выніку пад <�эм > сертыфікацыя Дарожкі , што сервер пасылае ўсе неабходныя сертыфікаты.

3
дададзена

Я быў першапачаткова выкарыстоўваючы HttpsURLConnection , але ён не працуе пастаянна, таму я вырашыў пайсці з HttpClient . Ён працуе ў цяперашні час.

2
дададзена

Пры пошуку гэтага выключэння, усе вы атрымаеце парады па рэалізацыі «вырашыць усе сертыфікаты».

Javadoc для SSLPeerUnverifiedException абвяшчае:

<�Р> Калі роўная была не ў стане ідэнтыфікаваць сябе (напрыклад, няма сертыфіката, канкрэтны метад шыфравання не выкарыстоўваюцца не падтрымлівае аўтэнтыфікацыю, ці не аднарангавыя аўтэнтыфікацыі не была створана падчас SSL квитирования) гэта выключэнне. </Р>

Такім чынам, памылка можа быць, што сувязь настолькі пластовага/нестабільная і прашу прыняць смешнае колькасць часу. У нашым мабільным дадатку мы часам адчуваем шмат у сувязі/Socket-Timeouts ў спалучэнні з гэтым SSLPeerUnverifiedException. Некаторыя запыты дастукацца, але ўзяць 60-е + - падлучэнне да сеткі проста адстой за межы ўсіх сродкаў у гэтых выпадках.

Проста брут гэта з «вырашыць усе сертыфікаты» не рэкамендуецца ў такіх выпадках - хутчэй рэалізаваць правільную стратэгію паўтору.

1
дададзена

Дазволіць Provider бяспекі Android, абнаўленне пры запуску прыкладання.

Па змаўчанні Provider перад тым 5.0+ не адключае SSLv3. Пры ўмове, у вас ёсць доступ да Google Play паслугі адносна проста залатаць Provider бяспекі Android, з вашага прыкладання.

  private void updateAndroidSecurityProvider(Activity callingActivity) {
    try {
        ProviderInstaller.installIfNeeded(this);
    } catch (GooglePlayServicesRepairableException e) {
     //Thrown when Google Play Services is not installed, up-to-date, or  enabled
       //Show dialog to allow users to install, update, or otherwise    enable Google Play services.
       GooglePlayServicesUtil.getErrorDialog(e.getConnectionStatusCode(), callingActivity, 0);
    } catch (GooglePlayServicesNotAvailableException e) {
        Log.e("SecurityException", "Google Play Services not available.");
    }
}

Source: Patching the Security Provider with ProviderInstaller Provider

1
дададзена
Што вы маеце на ўвазе installIfNeeded (гэта) ? Што такое гэта ?
дададзена аўтар Igor Ganapolsky, крыніца
@nani добра зроблена. Дзякуй, што падзяліліся гэтым з супольнасцю. Гэта наўрад ці я б зразумеў гэта своечасова.
дададзена аўтар tronious, крыніца
Гэта працуе для мяне, калі я назваў гэты метад ад асноўнай дзейнасці. Дзякуй чувак ...
дададзена аўтар Mideesh Punathil, крыніца