android - 响应为 204(无内容)时的 SSLHandshakeException

标签 android ssl

所以,我有一些看起来像这样的代码:

try {
    URL url = new URL(url_raw);
    HttpURLConnection connection = (HttpURLConnection)url.openConnection();
    /*snip*/
    connection.connect();
    int response_code = connection.getResponseCode(); <-- Error here
/*snip*/
  • 当 url 返回没有内容的 204 时,我会抛出异常。
  • 当 url 返回 204 但仍然有内容时,我会抛出异常。
  • 当 url 返回任何包含内容的非 204 代码时,我没问题。 (例如,带有“成功”消息的 200)。

错误日志在这里:

W/System.err﹕ javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x5f5d07c0: Failure in SSL library, usually a protocol error
W/System.err﹕ error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:744 0x5d908d74:0x00000000)
W/System.err﹕ at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:449)
W/System.err﹕ at com.android.okhttp.Connection.upgradeToTls(Connection.java:146)
W/System.err﹕ at com.android.okhttp.Connection.connect(Connection.java:107)
W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294)
W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:503)
W/System.err﹕ at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:136)

我可以通过从不返回 204 来解决这个问题,但这似乎太过分了 =/

最佳答案

W/System.err﹕ at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:449)
W/System.err﹕ at com.android.okhttp.Connection.upgradeToTls(Connection.java:146)
W/System.err﹕ at com.android.okhttp.Connection.connect(Connection.java:107)

根据此跟踪,它在初始 TLS 握手中失败。 HTTPS 连接的 TLS 握手必须在发送 HTTP 请求和读取 HTTP 响应之前完成。由于它已经在 TLS 握手中失败,因此在收到状态代码之前,问题不可能与状态代码本身相关。

相反,您需要查看服务器端的实现错误,而不是客户端。我的猜测是服务器坏了,在 204 的情况下没有进行任何 TLS 握手,但鉴于没有提供有关此服务器的信息,这只是一个大胆的猜测。

关于android - 响应为 204(无内容)时的 SSLHandshakeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36316803/

相关文章:

android - 如何将白色设置为 google+ 登录按钮?

android - 如何将子字符串作为链接并单击该链接打开本地 webview 而不是 web 浏览器

android - AlarmManager 在多个设备中不起作用

node.js - 带有 node.js 服务器的预共享 key (TLS-PSK-WITH-AES-256-CBC-SHA)

android - Kotlin 协程和 SecurityException

android - 支持Android开发的Eclipse以外的IDE

java - CHECK_NRPE : Error - Could not complete SSL handshake (web)

javascript - 使用 sc-server 代理 HTTPS 请求

ssl - Dropwizard SSL 服务继续返回错误 - 服务器中止 SSL 握手

azure - SSL证书安装在哪里