SSL:400 未发送所需的证书

2023-12-25

代码和输入

我正在尝试建立 SSL 连接,但我得到了400 No required SSL certificate was sent来自服务器的响应。我正在以标准方式执行此操作,例如所描述的here https://stackoverflow.com/a/24007536;我运行 Java 8。

我的代码示例是:

    OkHttpClient client     = new OkHttpClient();
    KeyStore keyStoreClient = getClientKeyStore();
    KeyStore keyStoreServer = getServerKeyStore();
    String algorithm        = ALGO_DEFAULT;//this is defined as "PKIX"

    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(algorithm);
    keyManagerFactory.init(keyStoreClient, PASSWORD_SERVER.toCharArray());

    SSLContext sslContext = SSLContext.getInstance("TLS");

    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(algorithm);
    trustManagerFactory.init(keyStoreServer);

    sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());

    client.setSslSocketFactory(sslContext.getSocketFactory());
    client.setConnectTimeout(32, TimeUnit.SECONDS); // connect timeout
    client.setReadTimeout(32, TimeUnit.SECONDS);    // socket timeout

    return client;

这是我用来发送 GET 请求的代码:

public String get(String url) throws IOException
{
    String callUrl  = URL_LIVE.concat(url);
    Request request = new Request.Builder()
            .url(callUrl)
            .build();
    Response response = this.client.newCall(request).execute();
    return response.body().string();
}

我启用了:

System.setProperty("javax.net.debug", "ssl");

因此,要查看调试消息 - 但那里没有错误/警告/警报,唯一的事情是最后:

main, called close()
main, called closeInternal(true)
main, SEND TLSv1.2 ALERT:  warning, description = close_notify
main, WRITE: TLSv1.2 Alert, length = 26
main, called closeSocket(true)

这是我唯一可以视为“异常”的东西(但我怀疑它是)。

I tried:

  • 禁用/启用不同的协议。例如,强迫TLSv1 / TLSv1.1对于套接字没有成功。为了尝试,我将我的 ssl 工厂包装到另一个工厂中,该工厂禁用/启用某些协议。
  • 禁用SSLv2Hello- 但这并没有改变图片。
  • Install 甲骨文政策 http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html因为之前有关于一些跳过算法的通知,并且此安装“解决”了该问题,但总体结果仍然相同。
  • Setting System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true");- 蹩脚,但除了日志中的消息之外也没有改变任何东西Allow unsafe renegotiation: true(显然是“假”)
  • Using KeyManagerFactory.getDefaultAlgorithm() as algorithm for KeyManagerFactory.getInstance()称呼。这引发了异常Get Key failed: Given final block not properly padded据我所知,这是因为使用了错误的算法(阅读this https://stackoverflow.com/a/8053459/2637490)。我的默认算法是:SunX509
  • 将证书直接添加到我的机器上keytool -importcert -file /path/to/certificate -keystore keystore.jks -alias "Alias"然后在我的程序中使用它System.setProperty("javax.net.ssl.trustStore","/path/to/keystore.jks");设置密码:System.setProperty("javax.net.ssl.trustStorePassword","mypassword");(我设置密码keytool之后确认可信证书yes); see this https://stackoverflow.com/a/4326346/2637490 and this https://stackoverflow.com/a/5871352/2637490帖子。没有出现任何错误 - 但问题仍然存在。
  • 将证书添加到全局密钥库(位于JAVA_PATH/jre/lib/security/cacerts) with: keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias Alias -file /path/to/certificate (see this https://stackoverflow.com/a/27928213/2637490);看起来导入操作成功,但图片没有改变

调试中还注意到:ssl: KeyMgr: choosing key: 1 (verified: OK)- 不确定它是否相关,因为我不是 SSL 专家。

不幸的是我看不到服务器端日志,所以我无法观察全貌。

Question

出现此 400 错误的原因是什么?我该如何进一步进行(调试/尝试其他方法)?任何提示将不胜感激。


您的服务器正在请求客户端证书。您需要在客户端计算机上安装证书(由受信任的机构签名),并让您的程序知道它。

通常,您的服务器具有由组织的 IT 安全部门或某个全球信任的 CA 签名的证书(密钥用途设置为“TLS 服务器身份验证”)。您应该从同一来源获取“TLS 客户端身份验证”证书。

如果您在 Wireshark 中捕获 TLS 握手,您将看到 ServerHello 消息,后跟“客户端证书请求”,您用长度为 0 的“客户端证书”消息回复该消息。您的服务器选择拒绝此消息。

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

SSL:400 未发送所需的证书 的相关文章

  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • 经典 asp 中的 WinHttp TLS 连接

    我正在尝试将付款数据发送到 SagePay 由于他们关闭了 SSL 因此需要使用 TLS 发送数据 我的代码如下 set httpRequest Server CreateObject WinHttp WinHttprequest 5 1
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • 使用 luasocket smtp 和 ssl 发送电子邮件

    我一直在尝试使用帖子中描述的代码发送电子邮件 lua使用gmail账户发送邮件 https stackoverflow com questions 11070623 lua send mail with gmail account 代码由米
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 为什么 appcmd.exe 解锁配置在 Azure 模拟器上不起作用?

    我最近升级到 Azure 2 1 SDK 现在我的部分功能遇到了问题web config在计算模拟器上运行时处于 Web 角色中 我的web config包含这个
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem

随机推荐

  • GitHub 上的审阅者和受让人之间有什么区别?

    当我创建拉取请求时 我可以看到两个选项审稿人 and 受让人 它们之间有什么区别 我认为这是来自 github 最新版本的任何一个 审阅者和受让人是组织谁正在处理拉取请求和问题的工具 他们不授予任何额外的权限 审核者是您特别要求审核您的拉取
  • 在Python中创建包含整数的类列表对象的最快方法

    在Python中制作包含整数 浮点 非常简单的数据类型 的类似列表的对象的最快方法是什么 类似列表 是什么意思 这意味着我想要一个支持列表的两个 非常 基本操作的对象 获取某个索引中的对象 1 并更改其值 2 在发布此内容之前我遇到了哪些帖
  • 循环内的 Promise

    在下面的代码中 我有一个无限循环 我不知道为什么会发生 我最好的猜测是因为里面的函数是async循环不会等待它 因此循环永远不会停止 解决这个问题的最佳方法是什么 var generateToken function userId retu
  • Spring/Hibernate 添加一个在关闭 EntityManagerFactory 之前运行的关闭钩子

    当我关闭服务器时 我有一些工作正在填充下载和填充数据 我希望这些工作可以优雅地完成 我尝试添加 Runtime getRuntime addShutDownHook 但这似乎在 Entitymanager 已经关闭之后运行 因为在运行之前异
  • 计算某个日期之前一个月的行数

    我想在我的数据框中添加一列 该列将计算每个日期之前一个月每个公园的行数 我的数据框如下所示 gt Reaction per park per day 3 Park Date Type 1 2 Coy season AC code Year
  • Paging 3 库使用 LoadType.APPEND 递归调用加载方法

    我正在尝试显示来自图标查找器 API https developer iconfinder com reference getting started with your api 1 好像是ItemKeyedDataSource对我来说 我
  • MVC3 - Ajax 操作链接 - OnBegin、onComplete

    使用 MVC3 C 和 Razor 视图引擎 我有一个带有 Ajax 操作链接的表单 在选项中 我尝试指定 OnBegin 和 OnComplete javascript 函数调用 在这个问题中 我取出了功能的核心部分 并简单地添加了警报
  • 如何让 Maven 将 jar 包含在我的 Eclipse 引用库中?

    我正在尝试采用现有的 Eclipse 项目并添加 pom xml 以便我可以使用 Maven 进行自动构建 在项目中 我的引用库中有一个 jar 文件 该文件不在 Maven 存储库中 我需要做什么才能让 Maven 识别 jar 文件 我
  • 使用 ocaml 图形保存图像

    我想将ocaml图形生成的图片保存在文件中 png或jpeg 谢谢 我假设你正在谈论Graphicsocaml 中的模块 您应该注意到Graphics模块不适用于创建和处理图像 你当然可以打电话Graphics dump image如果你已
  • Postgres pg_try_advisory_lock 阻止所有记录

    我在用着pg try advisory lock 在 Postgres 中 接下来的两个查询锁定了多个记录table1 1 SELECT a id FROM table1 a JOIN table2 b ON a table1 id b i
  • 什么时候不应该使用 CSS 精灵?

    我想知道什么时候不应该使用 CSS 精灵 CSS 精灵效果很好 但是在某些情况下它们会带来很多麻烦吗 和所有事物一样 它有有用的时候 也有有害的时候 许多开发人员喜欢使用 CSS sprite 因为它可以节省请求时间 浏览器发出一个请求 下
  • 在 64 位应用程序中使用为 32 位编写的汇编代码

    我可以使用以下链接中为 x86 64 计算机上的 64 位程序为 32 位 x86 编写的 Serpent 加密的汇编例程吗 也就是说 无需为其启动单独的 32 位进程 如果没有 是否有人有一个可以在 32 位和 64 位上运行的 Serp
  • 如何查找路线的所有端点(Apache Camel,Java)

    我在 Camel 上下文中有几条路线和许多端点 因此需要获取一条路由创建的所有端点 CamelContext context new DefaultCamelContext RouteBuilder route1 new RouteBuil
  • C# 进程在处置时挂起

    我正在从 C 调用命令行进程 该进程从某个远程服务器进行更新 当它可以找到远程服务器并从中获取数据时 工作正常 如果未连接到网络也可以正常工作 但是 当远程服务器无法访问时 外部进程将无限期地尝试获取数据 并且没有命令行选项来指定超时 所以
  • 如何从目标获取包含目录以在 add_custom_target 中使用?

    我正在建模依赖关系target link libraries 正如在this https pabloariasal github io 2018 02 19 its time to do cmake right 博客文章 target li
  • 如何使用Mercurial进行文本文档的版本控制?

    这不完全是一个编程问题 但我认为它比在TeX组 https tex stackexchange com 我想使用版本控制来跟踪文本文件的更改 用于创建LaTeX输出 由于我不是程序员 所以我对版本控制系统还没有更深入的经验 我想用Mercu
  • 数据表服务器端人口

    我花了几个小时试图找到如何使用来自后端的 json 填充数据表 这是我的代码
  • ValueError:预期目标大小 (128, 44),得到 torch.Size([128, 100]),LSTM Pytorch

    我想建立一个模型 根据前面的字符预测下一个字符 我已将文本拼接成长度 100 的整数序列 使用数据集和数据加载器 我的输入和目标变量的维度是 inputs dimension batch size sequence length In my
  • 如何从两个 URL 解析两个 XML 文件(Swift)

    我有两个 XML URL 第一个 URL 显示SongName on the Table第二个 URL 是SongPath 当我点击SongName在桌子上它转到SongPath在第二个网址中 这是table https i stack i
  • SSL:400 未发送所需的证书

    代码和输入 我正在尝试建立 SSL 连接 但我得到了400 No required SSL certificate was sent来自服务器的响应 我正在以标准方式执行此操作 例如所描述的here https stackoverflow