OKhttp:SSLProtocolException:SSL 握手终止

2024-01-03

我试图找出为什么有时会出现此错误

javax.net.ssl.SSLProtocolException:SSL 握手终止: ssl=0x60d46c90:SSL 库失败,通常是协议错误 错误:1409443E:SSL 例程:SSL3_READ_BYTES:tlsv1 警报不适当 回退(外部/openssl/ssl/s3_pkt.c:1256 0x60d57f40:0x00000003)

发出此请求的代码:

private <T> void send(final String url, final Map<String, String> args, 
    final RequestCallback<T> callback, final Parser<T> pParser, 
    final Context pContext, final HTTP_METHOD method, 
    final Map<String, String> headers, final BODY_TYPE bodyType) {

    final Request.Builder builder = getBuilder(url);
    populateHeaders(builder, headers);
    final RequestBody body = getBody(args, bodyType);

    if(method==HTTP_METHOD.POST) {
        builder.post(body);
    } else if(method==HTTP_METHOD.GET) {
        builder.get();
    } else if(method==HTTP_METHOD.PUT) {
        builder.put(body);
    } else if(method==HTTP_METHOD.PATCH) {
        builder.patch(body);
    } else {
        throw new RuntimeException("Please specify correct method name!");
    }

    Request request = builder.build();
    debugRequest(request, whoCalledThisMethod());
    call = client.newCall(request);
    call.enqueue(new StandardRequestCallback(pContext, callback, pParser));
}

我发现,如果我的应用程序收到此异常,强制关闭它,然后重新启动它,可以成功完成请求...但是,不久之后,它再次失败并出现此 SSL 异常。

可能出什么问题了?


UPDATE

我制作了一个非常小的测试应用程序,它使用 okHttp 食谱页面中的代码https://github.com/square/okhttp/wiki/Recipes https://github.com/square/okhttp/wiki/Recipes我已经重现了 SSL 握手异常!

06-27 13:59:08.068 30006-32692/a.b.ssltestapp W/System.err: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake terminated: ssl=0x60068d10: Failure in SSL library, usually a protocol error
06-27 13:59:08.068 30006-32692/a.b.ssltestapp W/System.err: error:1409443E:SSL routines:SSL3_READ_BYTES:tlsv1 alert inappropriate fallback (external/openssl/ssl/s3_pkt.c:1256 0x6006e6b0:0x00000003)
06-27 13:59:08.078 30006-32692/a.b.ssltestapp W/System.err:     at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:568)
06-27 13:59:08.078 30006-32692/a.b.ssltestapp W/System.err:     at okhttp3.internal.io.RealConnection.connectTls(RealConnection.java:188)
06-27 13:59:08.078 30006-32692/a.b.ssltestapp W/System.err:     at okhttp3.internal.io.RealConnection.connectSocket(RealConnection.java:145)
06-27 13:59:08.078 30006-32692/a.b.ssltestapp W/System.err:     at okhttp3.internal.io.RealConnection.connect(RealConnection.java:108)
06-27 13:59:08.078 30006-32692/a.b.ssltestapp W/System.err:     at okhttp3.internal.http.StreamAllocation.findConnection(StreamAllocation.java:188)
06-27 13:59:08.088 30006-32692/a.b.ssltestapp W/System.err:     at okhttp3.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:127)
06-27 13:59:08.088 30006-32692/a.b.ssltestapp W/System.err:     at okhttp3.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
06-27 13:59:08.088 30006-32692/a.b.ssltestapp W/System.err:     at okhttp3.internal.http.HttpEngine.connect(HttpEngine.java:289)
06-27 13:59:08.088 30006-32692/a.b.ssltestapp W/System.err:     at okhttp3.internal.http.HttpEngine.sendRequest(HttpEngine.java:241)
06-27 13:59:08.088 30006-32692/a.b.ssltestapp W/System.err:     at okhttp3.RealCall.getResponse(RealCall.java:240)
06-27 13:59:08.088 30006-32692/a.b.ssltestapp W/System.err:     at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:198)
06-27 13:59:08.088 30006-32692/a.b.ssltestapp W/System.err:     at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:160)
06-27 13:59:08.098 30006-32692/a.b.ssltestapp W/System.err:     at okhttp3.RealCall.access$100(RealCall.java:30)
06-27 13:59:08.098 30006-32692/a.b.ssltestapp W/System.err:     at okhttp3.RealCall$AsyncCall.execute(RealCall.java:127)
06-27 13:59:08.098 30006-32692/a.b.ssltestapp W/System.err:     at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:33)
06-27 13:59:08.098 30006-32692/a.b.ssltestapp W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
06-27 13:59:08.098 30006-32692/a.b.ssltestapp W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
06-27 13:59:08.098 30006-32692/a.b.ssltestapp W/System.err:     at java.lang.Thread.run(Thread.java:841)
06-27 13:59:08.098 30006-32692/a.b.ssltestapp W/System.err:     Suppressed: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake terminated: ssl=0x60068d10: Failure in SSL library, usually a protocol error
06-27 13:59:08.098 30006-32692/a.b.ssltestapp W/System.err: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure (external/openssl/ssl/s3_pkt.c:1256 0x5ff9aa20:0x00000003)
06-27 13:59:08.108 30006-32692/a.b.ssltestapp W/System.err:         ... 18 more
06-27 13:59:08.108 30006-32692/a.b.ssltestapp W/System.err:     Caused by: javax.net.ssl.SSLProtocolException: SSL handshake terminated: ssl=0x60068d10: Failure in SSL library, usually a protocol error
06-27 13:59:08.108 30006-32692/a.b.ssltestapp W/System.err: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure (external/openssl/ssl/s3_pkt.c:1256 0x5ff9aa20:0x00000003)
06-27 13:59:08.118 30006-32692/a.b.ssltestapp W/System.err:     at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
06-27 13:59:08.118 30006-32692/a.b.ssltestapp W/System.err:     at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:486)
06-27 13:59:08.118 30006-32692/a.b.ssltestapp W/System.err:         ... 17 more
06-27 13:59:08.118 30006-32692/a.b.ssltestapp W/System.err: Caused by: javax.net.ssl.SSLProtocolException: SSL handshake terminated: ssl=0x60068d10: Failure in SSL library, usually a protocol error
06-27 13:59:08.118 30006-32692/a.b.ssltestapp W/System.err: error:1409443E:SSL routines:SSL3_READ_BYTES:tlsv1 alert inappropriate fallback (external/openssl/ssl/s3_pkt.c:1256 0x6006e6b0:0x00000003)
06-27 13:59:08.118 30006-32692/a.b.ssltestapp W/System.err:     at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
06-27 13:59:08.118 30006-32692/a.b.ssltestapp W/System.err:     at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:486)
06-27 13:59:08.118 30006-32692/a.b.ssltestapp W/System.err:     ... 17 more

这不是一个解决方案,但提供了一些网络调试,以防与上述问题相关。

如果是上面问题 1940 中提到的网络接口问题,那么您可以通过实现 Dns 接口以及 socketFactory 来解决该问题。它could你会得到两条 DNS 记录,一条对你有效,另一条对你无效,并且在重新启动后它会发生变化。

https://github.com/yschimke/oksocial/blob/master/src/main/java/com/baulsupp/oksocial/network/DnsSelector.java https://github.com/yschimke/oksocial/blob/master/src/main/java/com/baulsupp/oksocial/network/DnsSelector.java

https://github.com/yschimke/oksocial/blob/master/src/main/java/com/baulsupp/oksocial/network/InterfaceSocketFactory.java https://github.com/yschimke/oksocial/blob/master/src/main/java/com/baulsupp/oksocial/network/InterfaceSocketFactory.java

尝试通过添加调试查看结果来确认

Dns.SYSTEM.lookup(hostname)

NetworkInterface.getByInetAddress(address)

NetworkInterface.getNetworkInterfaces()


UPDATE

Callback.OnFailure 中的代码用于调试此问题:

@Override
public void onFailure(final Call call, final IOException e) {
    if (call.isCanceled()) {
        SLog.w(TAG, "onFailure: Canceled");
        return;
    }

    if(e instanceof SSLException){

        try {
            Log.d(getClass().getSimpleName(), "Checking DNS hosts ... ");
            List<InetAddress> list = Dns.SYSTEM.lookup(call.request().url().host());
            Log.d(getClass().getSimpleName(), "Number of Entries: "+list.size());
            for (InetAddress address : list) {
                Log.d(getClass().getSimpleName(), address.toString());
            }
            Log.d(getClass().getSimpleName(), "End of Checking DNS hosts");

        } catch (UnknownHostException e1) {
            e1.printStackTrace();
        }


        try {
            Log.d(getClass().getSimpleName(), "Checking Network Interfaces ... ");
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            ArrayList<NetworkInterface> list = Collections.list(interfaces);
            Log.d(getClass().getSimpleName(), "Number of Entries: "+list.size());
            for(NetworkInterface netintface : list) {
                Log.d(getClass().getSimpleName(), netintface.toString());
                List<InterfaceAddress> listaddresses = netintface.getInterfaceAddresses();
                Log.d(getClass().getSimpleName(), "   Number of Interface Addresses: "+listaddresses.size());
                for (InterfaceAddress infcaddress : listaddresses) {
                    Log.d(getClass().getSimpleName(), "   > InterfaceAddress : "+infcaddress.toString());
                }
            }
            Log.d(getClass().getSimpleName(), "End of Checking Network Interfaces");
        } catch (SocketException e1) {
            e1.printStackTrace();
        }


    }
}

从上面的代码调试输出

06-21 11:43:19.495 12890-12890/com.app.stg D/[StandardRequest]: ->
                                                                   ------------- Request -------------
                                                                   ********** METHOD sendRequest() **********
                                                                   GET
                                                                   -----------------------------------
06-21 11:43:24.330 12890-21401/com.app.stg D/StandardRequestCallback: Checking DNS hosts ... 
06-21 11:43:24.450 12890-21401/com.app.stg D/StandardRequestCallback: Number of Entries: 8
06-21 11:43:24.450 12890-21401/com.app.stg D/StandardRequestCallback: arc.stg.issa.sainsburys.co.uk/52.85.69.145
06-21 11:43:24.450 12890-21401/com.app.stg D/StandardRequestCallback: arc.stg.issa.sainsburys.co.uk/52.85.69.20
06-21 11:43:24.450 12890-21401/com.app.stg D/StandardRequestCallback: arc.stg.issa.sainsburys.co.uk/52.85.69.185
06-21 11:43:24.450 12890-21401/com.app.stg D/StandardRequestCallback: arc.stg.issa.sainsburys.co.uk/52.85.69.84
06-21 11:43:24.450 12890-21401/com.app.stg D/StandardRequestCallback: arc.stg.issa.sainsburys.co.uk/52.85.69.249
06-21 11:43:24.450 12890-21401/com.app.stg D/StandardRequestCallback: arc.stg.issa.sainsburys.co.uk/52.85.69.52
06-21 11:43:24.450 12890-21401/com.app.stg D/StandardRequestCallback: arc.stg.issa.sainsburys.co.uk/52.85.69.159
06-21 11:43:24.450 12890-21401/com.app.stg D/StandardRequestCallback: arc.stg.issa.sainsburys.co.uk/52.85.69.246
06-21 11:43:24.460 12890-21401/com.app.stg D/StandardRequestCallback: End of Checking DNS hosts
06-21 11:43:24.460 12890-21401/com.app.stg D/StandardRequestCallback: Checking Network Interfaces ... 
06-21 11:43:24.480 12890-21401/com.app.stg D/StandardRequestCallback: Number of Entries: 4
06-21 11:43:24.480 12890-21401/com.app.stg D/StandardRequestCallback: [lo][1][/::1%1%1][/127.0.0.1]
06-21 11:43:24.480 12890-21401/com.app.stg D/StandardRequestCallback:    Number of Interface Addresses: 2
06-21 11:43:24.480 12890-21401/com.app.stg D/StandardRequestCallback:    > InterfaceAddress : /::1%1%1/128 [null]
06-21 11:43:24.480 12890-21401/com.app.stg D/StandardRequestCallback:    > InterfaceAddress : /127.0.0.1/8 [null]
06-21 11:43:24.480 12890-21401/com.app.stg D/StandardRequestCallback: [sit0][2]
06-21 11:43:24.480 12890-21401/com.app.stg D/StandardRequestCallback:    Number of Interface Addresses: 0
06-21 11:43:24.480 12890-21401/com.app.stg D/StandardRequestCallback: [wlan0][4][/fe80::4283:deff:fe94:b0ff%wlan0%4][/172.24.90.253]
06-21 11:43:24.480 12890-21401/com.app.stg D/StandardRequestCallback:    Number of Interface Addresses: 2
06-21 11:43:24.480 12890-21401/com.app.stg D/StandardRequestCallback:    > InterfaceAddress : /fe80::4283:deff:fe94:b0ff%wlan0%4/64 [null]
06-21 11:43:24.480 12890-21401/com.app.stg D/StandardRequestCallback:    > InterfaceAddress : /172.24.90.253/19 [/172.24.95.255]
06-21 11:43:24.480 12890-21401/com.app.stg D/StandardRequestCallback: [ip6tnl0][3]
06-21 11:43:24.480 12890-21401/com.app.stg D/StandardRequestCallback:    Number of Interface Addresses: 0
06-21 11:43:24.480 12890-21401/com.app.stg D/StandardRequestCallback: End of Checking Network Interfaces
06-21 11:43:24.480 12890-12890/com.app.stg D/JS-[LauncherActivity]: ErrorReport{type='SSLHandshakeException'}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OKhttp:SSLProtocolException:SSL 握手终止 的相关文章

随机推荐

  • 在 Flex/Actionscript 中连接线(拖动时)

    我有一个 mx Canvas 元素 其中包含多个 mx Panel 元素 我希望能够绘制一条连接两个这样的 mx Panel 的线 以便当一个或两个 mx Panel 被拖动时 该线继续连接两个 mx Panel 这似乎是一件微不足道的事情
  • 如何在不使用 CPAN.pm 的情况下安装 Perl 模块?

    是否可以 如果您下载源代码并阅读README文件 这可能会告诉你你应该做什么 perl Makefile PL make make test make install or perl Build PL Build Build test Bu
  • pandas_profiling 主要方法在 Windows 10 上无法正常工作...构造函数有效,但方法无效

    使用 df profile report 安装后立即失败 导入 pandas profiling 该包已正确安装 因为我可以通过导入并使用构造函数 ProfileReport df 在 Jupyter 中生成报告 但是 语法 df prof
  • ASP.NET MVC 5 中的自定义错误页面

    我想将自定义错误页面添加到我的项目中 我发现这篇关于我的问题的文章 http benfoster io blog aspnet mvc custom error pages我尝试去实现它 So i add 404 cshtml 404 ht
  • 在 R-Markdown 中的网格上显示多个图文

    谈话结束后here https stackoverflow com questions 30509866 for loop over dygraph does not work in r 有没有办法在网格中组织输出的dygraphs 连续显
  • 编辑 XAML 时 Visual Studio 2010 随机崩溃

    在 WPF 应用程序中编辑 XAML 时 Visual Studio 2010 RTM 会随机崩溃 我正在完全更新的 Win 7 上运行它 安装的扩展 插件是 雷夏珀 电源命令 崩溃日志是 错误应用程序名称 devenv exe 版本 10
  • 将函数应用于 pandas 数据框的每一行以创建两个新列

    我有一个熊猫数据框 st包含多列
  • 动态调整 iframe 的高度

    我有一个 iframe 其中包含网站的一些内容 我希望 iframe 调整为 src 内容高度的 100 有点 js 菜鸟 这就是我正在处理的内容
  • 整个应用程序的浮动视图

    我需要对我的所有应用程序有一个浮动视图 我可以使用 Window service 但我不需要我的视图位于应用程序之外 仅在我的应用程序内 我也不希望用户看到 在其他应用程序上绘图 权限 我还能怎样做呢 我不得不做类似的事情 就我而言 我希望
  • 如何检查 Postgres 中是否存在 json 键?

    假设我有一个如下所示的 json some json key a nested key a key b nested key b 注意key a and key b是映射到字典的可选键 可能存在也可能不存在 我有一个函数可以检查外键是否存在
  • 如何使用Homebrew的Ruby包而不是MacOS自带的Ruby包?

    如何从使用 MacOS 附带的 Ruby 版本切换到使用 Homebrew 下载的最新版本的 Ruby 我的 MacOS 版本似乎有ruby 2 3 7p456 2018 03 28 revision 63024 universal x86
  • 在两行以上使用上标时修复图例标题 - R ggplot2

    我正在绘制我的研究区域的地图 但在编辑图例标题时遇到问题 我需要它是 预计 40 年休耕期的水果生产率 水果 ha 1 用四行写成 我可以使用 bquote 将 1 绘制为上标 但它创建了一个我无法提供的额外空间想办法把它去掉 只有当标题被
  • DispatchQueue 同步并发

    好吧 我已经经历了大量的问题和答案 并且我知道对其的理解 但是当我尝试一些代码时 我得到的结果并不支持这些理论 到目前为止我所理解的 同步 一旦块内的所有任务都被执行 控制就会返回 异步 控制将在块被击中后立即返回 这是看起来不错的部分 现
  • Node.js 和 AngularJS 中的 CORS

    我的应用程序存在 CORS 问题 我的堆栈是 Node js快车4 http expressjs com 和 AngularJS 使用矩形 https github com mgonto restangular 我已经尝试过一些事情 例如
  • Java EE 应用服务器 Hello World

    我对独立 Java 应用程序开发相当满意 但很快就会使用 Java EE 应用程序服务器开发一个项目 有谁知道让 hello world 类型的应用程序在应用程序服务器中工作的简单操作教程 我 也许天真地 假设不同框架之间的总体方法是相似的
  • 如何使用 javascript 或 jquery 使图像或按钮在鼠标悬停时发光?

    我想在将鼠标悬停在按钮或图像上时添加发光效果 如何使用 javascript jquery 或 CSS 执行此操作 这是我希望它看起来的示例http www flashuser net flash menus tutorial flash
  • SimpleXML 不断返回 CDATA 元素上的内容

    这是另一个 CDATA 返回内容的问题 我看过很多答案 但即使我尝试了所有答案 我仍然只得到内容 更详细地说 我有一个 xml 文件 里面包含许多 NewsItem
  • 使用 C# 表单应用程序静默安装 SQL Server

    我有一个用 C 开发的 Windows 应用程序 我需要将其安装在仅安装操作系统和 Net Framework 的 PC 上 现在我必须提供一个选项 以便使用此 Windows 应用程序在该 PC 上安装 SQL Server 2008 R
  • 如何在.NET / Sql Server 中在用户当地时间发送电子邮件?

    我正在编写一个程序 需要每小时整点发送一封电子邮件 但时间是用户本地的 假设我有 2 个位于不同时区的用户 约翰在纽约 弗雷德在洛杉矶 服务器在芝加哥 如果我想在本地下午 6 点向每个用户发送电子邮件 我必须在服务器时间下午 7 点向 Jo
  • OKhttp:SSLProtocolException:SSL 握手终止

    我试图找出为什么有时会出现此错误 javax net ssl SSLProtocolException SSL 握手终止 ssl 0x60d46c90 SSL 库失败 通常是协议错误 错误 1409443E SSL 例程 SSL3 READ