我们如何在 Android 上的 HttpClient 4.4+ 中启用 SNI?

2023-11-30

我正在尝试制定在现代版本的 Android 上将 SNI 与主要 HTTP 堆栈结合使用的方法。这包括 Apache 的单独 HttpClient 库(not该版本嵌入到 Android 本身中,但 Android 已经死亡并消失了)。

最新版本的 HttpClient 似乎不支持开箱即用的 SNI。当我使用'cz.msebera.android:httpclient:4.4.1.1'神器,我得到:

javax.net.ssl.SSLPeerUnverifiedException: Host name '...' does not match the certificate subject provided by the peer (CN=...)
at cz.msebera.android.httpclient.conn.ssl.SSLConnectionSocketFactory.verifyHostname(SSLConnectionSocketFactory.java:466)
at cz.msebera.android.httpclient.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:395)

(主机名经过编辑...)

这个 HttpClient 问题有一些代码旨在解决这个问题。但具体如何使用尚不清楚。这个堆栈溢出答案对实施有一点帮助。然而,这又会崩溃并出现一个等效的异常:

javax.net.ssl.SSLPeerUnverifiedException: Host name '' does not match the certificate subject provided by the peer (CN=...)
at cz.msebera.android.httpclient.conn.ssl.SSLConnectionSocketFactory.verifyHostname(SSLConnectionSocketFactory.java:466)
at cz.msebera.android.httpclient.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:395)

这并不令我感到惊讶。所提出的解决方法(用空字符串替换真实主机名)让我觉得相当奇怪。

这个 Stack Overflow 问答基本上是说“使用Java 1.7”,这对于Android来说不是一个可行的选择。

那么,有没有人研究出在 Android 兼容的 HttpClient 4.4+ 环境中启用 SNI 的方法?


尝试使用这个版本SSLConnectionSocketFactory而不是 Marek Sebera 的 HttpClient 分支附带的那个。它包含这段 Andriod 特定的代码。上次我使用 HttpClient 4.3 的官方 Apache 端口测试 SNI,效果很好。

// Android specific code to enable SNI
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    if (Log.isLoggable(TAG, Log.DEBUG)) {
        Log.d(TAG, "Enabling SNI for " + target);
    }
    try {
        Method method = sslsock.getClass().getMethod("setHostname", String.class);
        method.invoke(sslsock, target);
    } catch (Exception ex) {
        if (Log.isLoggable(TAG, Log.DEBUG)) {
            Log.d(TAG, "SNI configuration failed", ex);
        }
    }
}
// End of Android specific code
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我们如何在 Android 上的 HttpClient 4.4+ 中启用 SNI? 的相关文章

随机推荐

  • javascript:如何将日期字符串 (YYYY-MM-DD) 增加 1 天

    我知道如何在 php 中使用 date 和 mktime 函数执行此操作 但不知道如何在 javascript 中完成相同的操作 function incr date date str magic here return next date
  • 如何从 OpenLayers.Control.DrawFeature 获取积分返回

  • Jquery CSS 和 JS 限制元素 [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我想将 Jquery 移动 CSS 和 JS 仅应用于某些有限的元素 而不应用于页面上的其他元素 知道我该怎么做吗 我有一些 Salesforce 标准客户门户 其中包含一个包含 Jq
  • 如何在 Perl 6 中向我的自定义类添加下标?

    我是 Perl 6 的新手 我的 Atom 编辑器中有以下代码 但我仍然不明白它是如何工作的 我复制了以下代码 作为docs raku org说了 不过好像不行 所以我将代码更改为 use v6 class HTTPHeader class
  • 无法返回 cellForRowAtIndexPath 中的单元格

    我试图在 tableView 中返回不同的单元格 通常在这种情况下 我会返回不同的单元格 然后在底部返回 nil 但在这种情况下 它会给我带来错误 我也尝试过返回一个空单元格 但也给了我错误 我尝试过的 return nil and var
  • 如何测试网络管道服务是否正在监听

    如何以编程方式测试以查看特定的网络管道服务是否正在运行和侦听 这样我就不会收到 没有端点正在侦听 异常 例如 如果我有这个代码 Uri baseAddress new Uri http localhost something var Ser
  • 在画布上绘图时的偏移

    有一个简单的绘图应用程序 问题出在坐标 redraw函数 它们必须是鼠标 但接近 2x 鼠标 代码中有什么问题
  • mysqli 使用 p: connect 选项打开多个新进程

    这是我第一次在这里提问 我搜索了 Google stackoverflow 等 寻求帮助解决我遇到的问题 我们目前使用 PHP 5 3 10 和 MySQL 5 0 95 以及 Apache 2 2 21 CentOS 我们正在开始从旧的
  • 云中的 Elastic Search 集群

    我有 2 个 Linux VM 均位于云提供商的同一数据中心 Elastic1 和 Elastic2 其中 Elastic 2 是 Elastic 1 的克隆 两者都有相同的 centos 版本 相同的集群名称和相同的 ES 版本 Elas
  • 在R中绘制椭圆/双曲线

    我想在R中画椭圆 双曲线 我该如何使用 ggplot2 来做到这一点 让我举个例子 x 2 3xy 4x 2y 2y 2 0 for x between 2 and 2 y between 2 and 2 构造数据字段 d lt trans
  • 提供者与Oracle客户端版本不兼容

    我正在尝试使用Oracle ODP NET 11g 11 1 0 6 20 即时客户端在我的 ASP net 项目中数据提供者但是当我运行 aspx 页面时 我得到一个 提供者与Oracle客户端版本不兼容 错误消息 任何帮助将不胜感激 我
  • 由于放弃的提交而导致 Git 合并挂起

    我有两个提交 提交 B 依赖于提交 A 提交 A 被放弃 现在我在合并 B 时遇到错误 它说已提交 由于 B 对 A 的依赖而合并待处理 我用谷歌搜索过但找不到确切的答案 我需要一步一步的解决方案 因为我是 git 的新手 并且很难理解如何
  • 将 Dagger 与 java 11 和 Maven 一起使用

    Google Dagger DIF 是否适用于 java 11 如果不是 鉴于不可能将项目更改为使用 java 8 那么替代方案是什么 是的 可以将 dagger 2 32 与 maven 和 java 11 一起使用 我遇到了编译过程和
  • SQL 格式时间对象从 24 小时到 12 点

    有没有办法在 SQL 中将时间对象转换为 12 小时格式 我不能使用日期时间 因为检索的数据不是特定于日期的 16 45 00 gt 下午 4 45 尝试使用这个 DECLARE aux NVARCHAR 8 16 45 00 SELECT
  • 可能的空引用返回c# linq

    我有这个 linq 查询 它抱怨警告消息 警告 CS8603 可能返回空引用 Code return await applicationDbContext Pies Include x gt x Portions AsSingleQuery
  • Secrets 模块如何在 Python 中生成完美的随机序列

    现在我对数学有了相当的了解 并且我知道可以使用特定的数学算法创建伪随机序列 我还知道在Python中有一个secrets显然可以产生随机数的模块 我尝试对其进行一些调整 但我仍然不明白它应该如何工作 我们来说一下这段代码 import se
  • 使用 lodash 重塑 JSON 并减少

    我想根据从 URL 下载的已解析 CSV 文件重塑 JSON 我使用 csvtojson 模块来解析 CSV 并创建需要重新整形的 JSON 下面是我的完整代码 const require lodash to handle datetime
  • 在 Tkinter 中使用按钮调用函数后返回值

    from Tkinter import from tkFileDialog import askopenfilename from PIL import Image def main filename askopenfilename fil
  • 查找与给定数字最接近的数字之和

    假设我有一个列表 1 2 3 4 5 6 7 我想找到最接近给定数字的数字之和 抱歉 这个解释很糟糕 但这里有一个例子 假设我有一个列表 1 2 3 4 5 6 7 我想找到最接近 10 的数字 那么该方法应该返回 6 和 4 或 7 和
  • 我们如何在 Android 上的 HttpClient 4.4+ 中启用 SNI?

    我正在尝试制定在现代版本的 Android 上将 SNI 与主要 HTTP 堆栈结合使用的方法 这包括 Apache 的单独 HttpClient 库 not该版本嵌入到 Android 本身中 但 Android 已经死亡并消失了 最新版