为什么java在SSL握手期间不发送客户端证书?

2024-01-17

我正在尝试连接到安全的网络服务。

尽管我的密钥库和信任库已正确设置,但握手失败。

经过几天的沮丧,无休止的谷歌搜索和询问周围的每个人,我发现唯一的问题是java选择在握手期间不将客户端证书发送到服务器。

具体来说:

  1. 服务器请求客户端证书 (CN=RootCA) - 即“给我一个由根 CA 签名的证书”
  2. Java查看了密钥库,只找到了由“SubCA”签名的客户端证书,而该证书又由“RootCA”颁发。它没有费心去调查信任库......好吧,我想
  3. 遗憾的是,当我尝试将“SubCA”证书添加到密钥库时,这根本没有帮助。我确实检查了证书是否已加载到密钥库中。它们确实如此,但 KeyManager 会忽略除客户端证书之外的所有证书。
  4. 上述所有情况都会导致 java 决定它没有任何满足服务器请求的证书并且不发送任何内容...tadaaa 握手失败:-(

我的问题:

  1. 我是否有可能以“破坏证书链”或其他方式将“SubCA”证书添加到密钥库中,以便 KeyManager 仅加载客户端证书并忽略其余部分? (Chrome 和 openssl 设法解决了这个问题,那么为什么 java 不能呢? - 请注意,“SubCA”证书始终作为受信任的颁发机构单独呈现,因此 Chrome 显然在握手期间正确地将其与客户端证书一起打包)
  2. 这是服务器端的正式“配置问题”吗?服务器是第三方的。我希望服务器请求由“SubCA”机构签名的证书,因为这是他们向我们提供的。我怀疑这在 Chrome 和 openssl 中有效的事实是因为它们“限制较少”,而 java 只是“按章办事”并失败了。

我确实设法为此制定了一种肮脏的解决方法,但我对此不太满意,所以如果有人能为我澄清这个问题,我会很高兴。


您可能已将中间 CA 证书导入到密钥库中,但未将其与拥有客户端证书及其私钥的条目关联。你应该能够看到这个使用keytool -v -list -keystore store.jks。如果每个别名条目仅获得一个证书,则它们不会在一起。

您需要将证书及其链一起导入到包含您的私钥的密钥库别名中。

要找出哪个密钥库别名具有私钥,请使用keytool -list -keystore store.jks(我假设这里是 JKS 商店类型)。这会告诉你这样的事情:

Your keystore contains 1 entry

myalias, Feb 15, 2012, PrivateKeyEntry, 
Certificate fingerprint (MD5): xxxxxxxx

这里,别名是myalias。如果你使用-v除此之外,你应该看到Alias Name: myalias.

如果您还没有单独拥有它,请从密钥库导出您的客户端证书:

keytool -exportcert -rfc -file clientcert.pem -keystore store.jks -alias myalias

这应该会给你一个 PEM 文件。

使用文本编辑器(或cat),准备文件(我们称之为bundle.pem)与该客户端证书和中间 CA 证书(如果需要,可能还有根 CA 证书本身),以便客户端证书位于开头,其颁发者证书位于下方。

这应该看起来像:

-----BEGIN CERTIFICATE-----
MIICajCCAdOgAwIBAgIBAjANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJVSzEa
....
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICkjCCAfugAwIBAgIJAKm5bDEMxZd7MA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNV
....
-----END CERTIFICATE-----

现在,将此捆绑包重新导入到您的私钥所在的别名中:

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

为什么java在SSL握手期间不发送客户端证书? 的相关文章

随机推荐

  • 是否有可以包含资源的受支持文件类型列表?

    我正在寻找可以包含资源并可以通过以下方式加载的文件类型列表LoadLibrary http msdn microsoft com en us library windows desktop ms684175 28v vs 85 29 asp
  • python内置列表的__init__方法下面的初始化过程是什么

    我的问题是init列表类的方法调用其他方法 例如append或insert 来实现其功能 like class test list def init self values super init def append self value
  • 具有 Circe 实现的通用 json 解码器特征 [重复]

    这个问题在这里已经有答案了 我有一个用于将 json 解码器注入为项目组件依赖项的特征 trait JsonDecoder def apply T s String Option T 当我尝试用它来实现它时Circe https circe
  • 从 Xerces 获取架构数据类型

    我在 Xerces C 中使用 SAX2 并且希望在处理元素时获取 XML 架构数据 以便了解架构中定义的类型 我怎样才能做到这一点 好吧 我知道该怎么做了 关于该主题的可用文档很少 显然 我需要将 XMLReaderFactory cre
  • Rust - 调用内部值方法的枚举方法

    我有一个如下的枚举 enum Foo A X B Y C Z 其中 X Y 和 Z 是实现该方法的结构体bar 我希望能够定义一个方法bar on the Fooenum 以便调用其内部值对应的方法 现在我有这个 impl Foo pub
  • 在 extjs 中扩展电子邮件验证

    我在 ExtJs 6 0 1 250 版本中内置了以下用户注册表单 我有一个接受电子邮件字段 co com直到四个字 我需要处理最近的事情tlds并想要覆盖电子邮件验证逻辑 我尝试过validator并应用正则表达式但是regexText不
  • 更改 TableView 上 UISearchBars 的宽度

    我需要在我的 tableView 中创建两个 UISearchBar 我希望它们在桌子顶部的宽度相等 并排 我创建了两个 UISearchBar 出口 并为它们创建了属性和分配 我发现很难将它们都放置 我的意思是适合 视图中 我只看到一个搜
  • 如何跳过“按回车键启动合并解析工具”并自动打开mergetool

    Git 要求按返回按钮一一打开每个冲突文件的合并工具 gt git mergetool Normal merge conflict for local modified file remote modified file Hit retur
  • Linux下无root权限如何获取CPU序列号

    在没有root权限的Linux Ubuntu 下如何获取CPU序列号 我尝试了 cpuid 命令 它无需 root 权限即可工作 但似乎返回全零 我相信是因为需要在 BIOS 中更改某些内容 您能否建议我另一种从程序中检索 CPU 序列号的
  • 如何向 Google 表单添加登录信息以供用户填写

    我一直在网上阅读和观看许多教程 但我找不到可以最初使用单个输入文本加载某种对话框或登录页面的内容 这样我就可以使用应用程序脚本对其进行处理 onFormOpen 不会在完成表单的用户上触发 在我的 onSubmitForm 函数中 我有以下
  • 处理 Pylab 导入错误未定义符号

    我已经成功安装并从我的主目录调用 matplotlib myname sysimm51 python Python 2 7 6 default Nov 11 2013 13 13 15 GCC 4 4 7 20120313 Red Hat
  • 如何在 libcurl 中禁用 Expect 100 continue

    我正在使用 CURLOPT POST 发送 https 消息 在运行过程中 我的应用程序停留在 期望 100 继续 完成等待 100 继续 From 乔治的日志 当curl发送100 继续时 https gms tf when curl s
  • 如何在 Swift 中将字符串(数字)转换为 Int 数组

    我想知道如何在 Swift 中将 String 转换为 Int 数组 在Java中我总是这样做 String myString 123456789 int myArray new int myString lenght for int i
  • 无法在 Google Chrome 中获取 JSON 文件? [复制]

    这个问题在这里已经有答案了 可能的重复 在 Chrome 中使用本地文件的 jQuery getJSON 问题 https stackoverflow com questions 2541949 problems with jquery g
  • webgl 中的多个对象

    我正在尝试将一些对象渲染到画布上 但我在理解哪些内容不起作用时遇到了一些困难 我目前正在构建两个对象 它们代表我想要渲染的两个网格 如果我创建一个网格 代码可以正常工作 所以我认为问题在于 当我构建两个或更多网格时 数据会被搞砸 这是网格数
  • 对于 FragmentStatePagerAdapter 创建的 Fragment,Fragment getView() 始终返回 null

    我读了很多关于片段的文章 发现其他人在检索片段视图时遇到问题 因为总是返回 null 但没有答案解决我的问题 我想做的是创建一个图片库 我有一个包含图像视图的片段 为了显示片段 我使用 android support v4 view Vie
  • 具有多个源的 Optaplanner 影子变量

    Optaplanner 允许影子变量拥有多个源 sources 但只有一个variableListsnerClass 在我的实现中 我有一个带有影子变量的规划实体 应该能够由两个列表器更改 但这似乎不受支持 还是我错了 有没有办法让两个监听
  • Java 9中外部模块A和B将包some.package导出到模块C

    当我使用外部库运行应用程序时 我得到以下信息 Error occurred during initialization of boot layer java lang module ResolutionException Modules m
  • 在 JavaScript 中使用正则表达式删除下划线

    就像标题所说 我想用正则表达式删除字符串中的下划线 这就是我所拥有的 function palindrome str str str toLowerCase replace a zA Z g s g 0 9 g if str split r
  • 为什么java在SSL握手期间不发送客户端证书?

    我正在尝试连接到安全的网络服务 尽管我的密钥库和信任库已正确设置 但握手失败 经过几天的沮丧 无休止的谷歌搜索和询问周围的每个人 我发现唯一的问题是java选择在握手期间不将客户端证书发送到服务器 具体来说 服务器请求客户端证书 CN Ro