【问题标题】:Getting SSLHandshakeException when trying to connect to https://maps.googleapis.com on android尝试连接到 Android 上的 https://maps.googleapis.com 时出现 SSLHandshakeException
【发布时间】:2016-07-12 23:14:03
【问题描述】:

我想从 google places api 获取数据,但我得到了 SSLHandshakeException。我可以在浏览器中运行相同的 URL 并获得结果。

但是在设备上测试,android 5.0.2 给出了错误。我的应用的 minSDK 版本是 16,TargetSDK 版本是 23,在 Android Studio 1.5 上开发。 代码是:

HttpsURLConnection urlConnection = null;
Uri builtUri = Uri.parse(PLACE_BASE_URL).buildUpon()
                    .appendQueryParameter(LOCATION, location)
                    .appendQueryParameter(RADIUS, radius)
                    .appendQueryParameter(TYPE_PARAM, type)
                    .appendQueryParameter(SENSOR, Boolean.toString(true))
                    .appendQueryParameter(API_KEY, "AIzadfdajl_XXXXX-your_key")       
                    .build();

URL url = new URL(builtUri.toString());

urlConnection = (HttpsURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();

“urlConnection.connect()”行给出 javax.net.ssl.SSLHandshakeException 错误。完整错误如下:

    javax.net.ssl.SSLHandshakeException: Handshake failed
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:374)
at com.android.okhttp.Connection.upgradeToTls(Connection.java:201)
at com.android.okhttp.Connection.connect(Connection.java:155)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:106)
at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:89)
at com.android.okhttp.internal.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:25)
at info.placequest.android.GetPlaces.GetPlacesTask.doInBackground(GetPlacesTask.java:91)
at info.placequest.android.GetPlaces.GetPlacesTask.doInBackground(GetPlacesTask.java:26)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x5585123b00: Failure in SSL library, usually a protocol error
error:1407743E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert inappropriate fallback (external/openssl/ssl/s23_clnt.c:765 0x7fa8990ca0:0x00000000)
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:302)
... 16 more

【问题讨论】:

    标签: java android android-studio google-maps-api-3


    【解决方案1】:

    我没有使用“HttpsURLConnection”,而是使用了netcipher。这里是使用: 在您的 Build.gradle 中,依赖项块,

    implementation 'info.guardianproject.netcipher:netcipher:2.1.0' 
    

    然后在 .java 文件中访问 URL 如下:

    urlConnection = NetCipher.getHttpsURLConnection(requestUrl);
    urlConnection.setRequestProperty("Content-Type", "application/json");
    urlConnection.setRequestProperty("Accept", "application/json");
    urlConnection.setRequestMethod("GET");
    int statusCode = urlConnection.getResponseCode();
    

    接下来可以检查statusCode是否为200,然后将输入流读入String:

        if (statusCode == 200) {
            InputStream inputStream = urlConnection.getInputStream();
        }
    

    SSLHandshakeException 不会出现,并且代码有效。 PS:抱歉回复晚了!

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 1970-01-01
      • 2015-06-05
      • 2015-12-11
      • 2014-10-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 2015-05-22
      相关资源
      最近更新 更多