SSL на Android странная проблема - PullRequest
5 голосов
/ 12 мая 2010

Я пытаюсь загрузить файл на какой-либо URL, используя ssl. Я использую этот код, чтобы установить доверительный менеджер -

public static void trustAll () {
    TrustManage[] trustEverythingTrustManager = new TrustManager[] {
        new X509TrustManager() {

            public void checkClientTrusted(X509Certificate[] chain,
            String authType) throws CertificateException {
            // TODO Auto-generated method stub
            }

            public void checkServerTrusted(X509Certificate[] chain,
            String authType) throws CertificateException {
            // TODO Auto-generated method stub

            }

            public X509Certificate[] getAcceptedIssuers() {
            // TODO Auto-generated method stub
            return null;
            }

        }
    };

    SSLContext sc;
    try {
        sc = SSLContext.getInstance("TLS");
        sc.init(null, trustEverythingTrustManager, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
    }
}

и этот, чтобы установить верификатор имени хоста -

public static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {

    public boolean verify(String hostname, SSLSession session) {
        return true;
    }
};

тогда я открываю соединение вот так -

URL url = new URL("some_url");
HttpURLConnection connection = null;
// check if this is https or just http
if (url.getProtocol().toLowerCase().equals("https")) {
    trustAll();
    HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
    https.setHostnameVerifier(DO_NOT_VERIFY);
    connection = https;
} else {
    connection = (HttpURLConnection) url.openConnection();
}

После получения соединения я использую его для загрузки данных. Я использую http все в порядке, но когда я пытаюсь https, я получаю следующее исключение -

Ошибка записи: ошибка ввода-вывода во время системного вызова, сломанный канал java.io.IOException: Ошибка записи: ошибка ввода-вывода во время системного вызова, сломанный канал в org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.nativewrite (собственный метод) в org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.access $ 600 (OpenSSLSocketImpl.java:55) в org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl $ SSLOutputStream.write (OpenSSLSocketImpl.java:565) в java.io.OutputStream.write (OutputStream.java:82) в org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection $ HttpOutputStream.write (HttpURLConnection.java:652) at java.io.DataOutputStream.write (DataOutputStream.java:101)

Странно то, что я не получаю исключения все время. Когда я пытаюсь загрузить небольшие файлы (200 КБ), это работает ОК. или это происходит очень редко, но когда я пытаюсь загрузить более крупные (более 1 МБ), я получаю исключение почти каждый раз.

Есть идеи?

1 Ответ

3 голосов
/ 07 сентября 2010

ребята из андроида сообщили, что это ошибка в андроид sdk http://code.google.com/p/android/issues/detail?id=8625.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...