支持多种TLS协议的HttpClient

2023-12-29

我们正在编写一个必须使用 HTTPS 与一些服务器通信的应用程序。 它需要与 AWS(使用 AWS 库)以及我们使用 TLS 1.2 的一些内部服务进行通信。

我首先将 HttpClient 更改为使用 TLS 1.2 SSLContext:

public static SchemeRegistry buildSchemeRegistry() throws Exception {
    final SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
    sslContext.init(createKeyManager(), createTrustManager(), new SecureRandom());
    final SchemeRegistry schemeRegistry = new SchemeRegistry();
    schemeRegistry.register(new Scheme("https", 443, new SSLSocketFactory(sslContext)));
    return schemeRegistry;
}

并将这个SchemeRegistry注入到DefaultHttpClient对象中(通过spring),但是这样做我从AWS收到错误,所以我假设(我可能是错的)AWS不支持TLS 1.2(如果我只是使用普通的 DefaultHttpClient):

AmazonServiceException: Status Code: 403, AWS Service: AmazonSimpleDB, AWS Request ID: 5d91d65f-7158-91b6-431d-56e1c76a844c, AWS Error Code: InvalidClientTokenId, AWS Error Message: The AWS Access Key Id you provided does not exist in our records.

如果我尝试在 spring 中定义两个 HttpClient,一个使用 TLS 1.2,另一个是默认的,我会收到以下错误,我认为这意味着 Spring 不喜欢实例化和自动装配两个 HttpClient 对象:

SEVERE: Servlet /my-refsvc threw load() exception
java.lang.NullPointerException
at com.company.project.refsvc.base.HttpsClientFactory.<clinit>(BentoHttpsClientFactory.java:25)
...
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1031)
at 
...
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)

我在java中很少使用HTTPS,所以请好心人给我一些建议吗? 1)我如何让Spring允许两个HttpClient对象,一个连接到AWS stuff beans,另一个连接到其他bean以访问TLS1.2服务 2)或者是否可以更改一个 HttpClient 对象以能够尝试 TLS1.2(通过 SSLContext、SchemeRegistry 或其他方式),如果失败则尝试 TLS1.1 或 1.0? 3)如果两者都可能,那么“更好”的做法是什么?


TLS 有一个内置机制来协商使用哪个版本的协议。从RFC 5246(附录 E) https://www.rfc-editor.org/rfc/rfc5246#appendix-E:

TLS 版本 1.0、1.1 和 1.2 以及 SSL 3.0 非常相似,并且 使用兼容的 ClientHello 消息;因此,支持他们所有人 相对容易。同样,服务器可以轻松处理客户端 只要 ClientHello 就尝试使用未来版本的 TLS 格式保持兼容,客户端支持最高 服务器中可用的协议版本。

希望与此类旧服务器协商的 TLS 1.2 客户端 将发送一个正常的 TLS 1.2 ClientHello,包含 { 3, 3 } (TLS 1.2) 在ClientHello.client_version中。如果服务器不支持此版本,它将使用包含以下内容的 ServerHello 进行响应 旧版本号。如果客户同意使用此版本, 谈判将根据谈判内容酌情进行 协议。

另外,更改版本号SSLContext.getInstance(...)仅更改启用的协议默认情况下。设置实际协议版本是通过SSLSocket.setEnabledProtocols(...) http://docs.oracle.com/javase/7/docs/api/javax/net/ssl/SSLSocket.html#setEnabledProtocols%28java.lang.String%5B%5D%29 (see 这个问题 https://stackoverflow.com/a/11505994/372643)。我不确定您正在使用的其余库,但它可能在某处设置了启用的协议。

有以下几种可能性:

  • 你在做什么createKeyManager()与默认行为不同。如果服务使用客户端证书身份验证,则错误的配置肯定会导致 403 错误。

  • (我猜可能性较小,但在没有看到你的情况下很难说createKeyManager() and createTrustManager())。也许您使用的服务器与 TLS 1.2 和版本协商机制不兼容。里面有这样的评论sun.security.ssl.SSLContextImpl:

    SSL/TLS 协议指定向前兼容性和版本 回滚攻击保护,但是,许多 SSL/TLS 服务器 供应商没有正确实施这些方面,并且当前的一些 SSL/TLS 服务器可能拒绝与 TLS 1.1 或更高版本的客户端通信。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

支持多种TLS协议的HttpClient 的相关文章

随机推荐

  • 为什么SmtpClient.SendAsync只能调用一次?

    我正在尝试使用 SmtpClient 在 NET 中编写通知服务 出于完全合法的非垃圾邮件目的 最初我只是循环遍历每条消息并发送它 但是这很慢 我想提高速度 因此 我改用 SendAsync 但现在在第二次调用时出现以下错误 An asyn
  • 计算 itertools.product() 的第 n 个结果

    我正在尝试计算 itertools product 的第 n 个结果 test list product 01 repeat 3 print test desired output test 0 print desired output 所
  • 如何使用 id 删除嵌套的 JSON 对象

    在我的应用程序中 我创建了一个基于 JSON 的 JavaScript 对象 类似于以下内容 name root id 112 children name child one id 231 children name grand child
  • Python 在不需要时更改文件权限

    知道为什么下面的 Python 脚本在运行后将文件夹权限更改为只读吗 它运行一次并删除文件夹中的所有文件 但当它再次运行时 会出现 Windows 错误 5 访问被拒绝 因为脚本将文件夹的权限更改为只读 我看不出它的作用或如何避免它 谢谢
  • 如何获得 Go 中的终端大小?

    如何在 Go 中获取终端大小 在 C 语言中 它看起来像这样 struct ttysize ts ioctl 0 TIOCGWINSZ ts 但是如何在 Go 中访问 TIOCGWINSZ cgo编译器目前无法处理c函数中的变量参数和c头文
  • PyTorch Cuda 与 anaconda 不可用

    我正在使用 anaconda 来调节我的环境 对于一个项目 我必须使用 GPU 进行网络训练 我在我的项目中使用 pytorch 并且正在尝试让 CUDA 工作 我安装了cudatoolkit numba cudnn 不过 当我尝试这个命令
  • 如何使用 write() 或 fwrite() 将数据写入终端(stdout)?

    我正在尝试加快我的 C 程序的速度 以便更快地输出数据 目前我正在使用printf 向外界提供一些数据 它是连续的数据流 因此我无法使用 return data 我该如何使用write or fwrite 将数据提供给console而不是文
  • Laravel Eloquent - 随时加密/解密数据

    我可以用Crypt加密 解密我的数据 我想加密数据库中的一些信息 例如姓名 电子邮件 电话号码等 假设我希望对所有内容进行加密 我希望能够在后台自行执行此操作 我可以通过覆盖create and save功能 For instance th
  • 如何使用 Ruby 下载图片?

    我想使用 Ruby 下载这张图片 我怎么做 http farm1 static flickr com 92 218926700 ecedc5fef7 o jpg 我使用的是 Mac 操作系统 require open uri open yo
  • 不想在绘图轴上使用科学记数法

    我经常在 R 中使用以下函数绘制各种散点图plot命令 有时两个 有时仅其中一个绘图轴都用科学记数法标记 我不明白 R 何时决定切换到科学记数法 令人惊讶的是 它经常打印出任何理智的人在标记绘图时都不会用科学计数法书写的数字 例如它将 5
  • 如何共享我的 C/C++ 项目并隐藏部分源代码?

    我想将我的用 C C Linux 环境 gcc g 编译器 编写的项目作为共享库 静态库共享 而不实际共享源代码 这样其他用户就可以在不真正了解我的源代码的情况下使用我的项目 谁能告诉我如何将其共享为 so a 格式 假设 我的项目如下所示
  • 是否可以有一个远程sqlite数据库

    可以在服务器上远程存储 sqlite 数据库吗 我正在构建一个 iphone 应用程序 所有教程似乎都将 sqlite 数据库存储在 iphone 本身上 这是不可取的 因为您很快就会遇到并发问题 在这种情况下 我会使用传统的 RDMS 例
  • 有条件地从两个类中的任何一个继承[重复]

    这个问题在这里已经有答案了 可能的重复 在编译时动态生成结构 https stackoverflow com questions 11376149 generating structures dynamically at compile t
  • “记住我”身份验证功能是否总是意味着“不安全”网站?

    我正在考虑实施经典 记住我 复选框在我的网络应用程序上 允许经过身份验证的用户在返回访问我的网站后被 记住 Gmail http www gmail com Facebook http www facebook com其他人也有这种功能 但
  • Eigen Matrix 与 Numpy Array 乘法性能

    I read 在这个问题中 https stackoverflow com questions 10366054 c performance in eigen librar that eigen具有非常好的性能 但是 我尝试比较eigen
  • 类型化数据集的缺点是什么

    我来自一个喜欢构建自己的世界 而不是依赖他人构建的库和框架 逃离这个世界后 我发现了在 Visual Studio 中使用类型化数据集等工具的乐趣和轻松 那么除了失去灵活性之外 你还失去了什么 是否存在性能因素 忽略 procs 与动态 s
  • MVC 控制器操作参数为空

    我有控制器名称 District 和操作名称 Incharges 但我希望 URL 是这样的 带有一些参数的操作名称 www example com district incharges aaa www example com distri
  • Javascript无符号短到有符号短

    我有以下代码 var v 0xFF 0xFF alert v 0 lt lt 8 v 1 并警告 65535 最大空头值 如何将此字节数组视为有符号短整型 并获取该数组的有符号值 假设高位为符号 var sign v 0 1 lt lt 7
  • 如何自定义 JQPlot 周围的黑色边框

    如何在 JQPlot 中自定义图表周围的黑色边框 我广泛搜索了 CSS 文件 但没有找到任何内容 UPDATE 如果您不明白我的意思 请看这张图片 http img339 imageshack us img339 5796 jqplot p
  • 支持多种TLS协议的HttpClient

    我们正在编写一个必须使用 HTTPS 与一些服务器通信的应用程序 它需要与 AWS 使用 AWS 库 以及我们使用 TLS 1 2 的一些内部服务进行通信 我首先将 HttpClient 更改为使用 TLS 1 2 SSLContext p