如何为 HTTPS 调用指定出站证书别名?

2024-03-19

我正在调用需要客户端证书身份验证的 Web 服务。

如果我指定一个包含单个证书(服务期望的客户端证书)的 Java 密钥库,那么一切都会正常工作。但是,如果我使用包含多个证书的密钥库,那么我似乎无法指定客户端应选择哪个证书,客户端似乎会选择第一个可用的证书(按字母顺序排列)。

我尝试了以下属性,但没有达到预期结果:

System.setProperty("com.sun.enterprise.security.httpsOutboundKeyAlias", "my-client-certificate alias");

如何指定应使用哪个客户端证书别名?


的链接Jakub https://stackoverflow.com/users/155708/jakub提供在他的回应中 https://stackoverflow.com/a/5292768/1121673引导您找到答案,但我想在这里发布一个更简单的回复,因为我们在这个问题上挣扎了很长一段时间,然后才最终得到了一些有用的东西。

我们遇到的情况是,有多个证书可供使用,并且我们需要使用具有特定别名的证书来执行连接。我们通过创建自己的 KeyManager 实现来做到这一点,该实现将其大部分功能传递给默认的 X509KeyManager,但具有在执行连接时准确选择要使用的正确别名的功能。

首先我们创建的密钥管理器:

public class FilteredKeyManager implements X509KeyManager {

private final X509KeyManager originatingKeyManager;
private final X509Certificate[] x509Certificates;

public FilteredKeyManager(X509KeyManager originatingKeyManager, X509Certificate[] x509Certificates) {
    this.originatingKeyManager = originatingKeyManager;
    this.x509Certificates = x509Certificates;
}

public X509Certificate[] getCertificateChain(String alias) {
    return x509Certificates;
}

public String[] getClientAliases(String keyType, Principal[] issuers) {
    return new String[] {"DesiredClientCertAlias"};
}

实现所需的所有其他方法都是传递给originatingKeyManager.

然后,当我们实际设置上下文时:

SSLContext context = SSLContext.getInstance("TLSv1");
context.init(new KeyManager[] { new FilteredKeyManager((X509KeyManager)originalKeyManagers[0], desiredCertsForConnection) },
    trustManagerFactory.getTrustManagers(), new SecureRandom());

希望这能够清楚地表明这一点,并且对任何试图解决此问题的其他人都有效。

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

如何为 HTTPS 调用指定出站证书别名? 的相关文章

随机推荐

  • 图片可以有多个标签吗?

    例如 当我将新图像推送到存储库时 我希望它有两个标签0 2 and latest 这将允许始终通过使用拉取最新的图像版本latest标签和特定版本使用0 2例如标签 用docker可以吗 有什么解决方法吗 我看到的唯一解决方案是进行两次单独
  • React.js 中的悬停按钮

    我想问如何制作一个按钮 但是当鼠标位于按钮上 悬停 时 新按钮显示在前一个按钮上方 并且它在react js中 thx 这是我的代码的方式 var Category React createClass displayName Categor
  • Apple 关联文件在开发中获取,但在 TestFlight 和 App Store 中未获取

    通用链接在开发中工作得很好 但是一旦我对应用程序进行签名并将其部署到 TestFlight 和 App Store 似乎未获取 apple app site association 因此该应用程序未注册以打开通用链接 1 well know
  • 如何在 Angular 6 中调用多个 API 并订阅?

    在我的应用程序中 调用所有POST请求我已经使用了service 当我得到一个specific code 例如 401 我从服务器调用 API 来获取新令牌 在收到另一个令牌之前 如果有任何其他 API 调用 我会将所有这些请求存储在一个数
  • 元素的 jQuery 标签名称

    我尝试在 jQuery 中获取元素标签名称 我有以下 html div class section h1 New Revision nbsp img alt Lock closed class edit src assets lock cl
  • 从网络提供商处获取准确的当前位置

    我使用以下代码从应用程序中的网络提供商获取当前位置 LocationManager mgr LocationManager getSystemService LOCATION SERVICE boolean network enabled
  • 在 vue 组件上提交表单时如何获取单选按钮的值?

    我有两个组件 我的第一个组件是这样的
  • Chronicle 与 Chronicle-queue 包

    我刚刚开始使用历史记录队列 但是我对使用哪个 API 来读取 写入队列有点困惑 具体来说编年史队列 5 https www javadoc io doc net openhft chronicle queue 5 17 17 vs 编年史
  • 如何解释 EL 表达式中方括号 ([]) 运算符的用法

    当我阅读时春天宠物诊所 https github com SpringSource spring petclinic 示例应用程序 我发现他们总是把add and modify功能集成到单个 JSP 文件中 并且它们使用 owner new
  • 在 C# 中将 LDAP AccountExpires 转换为 DateTime

    我想将 LDAP AccountExpires 中的 18 位数字字符串转换为正常日期时间格式 129508380000000000 gt gt 2011年5月26日 我通过使用以下链接获得了上述转换 http www chrisnowel
  • Admob 插页式广告显示为黑色,并带有新的广告单元 ID

    我创建了一个应用程序 并且正在使用 admob 插页式广告 由于我已为该应用程序创建了新的插页式广告单元 ID 但广告显示为黑色并带有关闭按钮 但如果我使用旧的应用程序 广告单元 ID 广告将会显示 我不知道为什么会出现这个问题 谢谢 对于
  • 泛型地狱:hamcrest 匹配器作为方法参数

    因此 让我们有一个字符串列表和一个函数 该函数采用 Hamcrest 匹配器并返回matches 提供的匹配器的方法 public boolean matchIt final Matcher
  • 如何在 Notepad++ 中多行“在文件中替换...”

    如果有免费的源代码编辑器记事本 http notepad plus sourceforge net uk about php具有 在文件中查找 功能 即无需在编辑器中打开文件 它是否也具有 在文件中替换 功能 Notepad 是基于Note
  • 如何从 PhantomJS 或 grover 跳过代码执行

    接下来的问题是 我的应用程序中有 JavaScript 代码 我想跳过 隐藏 PhantomJS 和 grover 检查 执行中的一些代码 So 如何跳过 隐藏 PhantomJS 或 grover 的代码执行 注意 当我编写 JavaSc
  • 无法定义使用动态的类或成员,因为编译器需要类型

    我在 Asp Net 3 5 应用程序中使用 Facebook SDK C 库 当我尝试编译下面的代码时 请给我错误 据我所知 动态类型在 4 0 框架中使用 那么无论如何要重写它才能使其工作吗 我有一个对 System Core 3 5
  • 单值上下文中的多个值

    由于 Go 中的错误处理 我经常会得到多个值函数 到目前为止 我管理此问题的方式非常混乱 我正在寻找最佳实践来编写更清晰的代码 假设我有以下功能 type Item struct Value int Name string func Get
  • awk gzip 输出到多个文件

    我可以像这样 gzip awk 输出 echo col1 col2 awk print 1 gzip gt out 但是是否也可以将两个 awk 输出文件流通过管道传输到 gzip 这不起作用 echo col1 col2 awk prin
  • 有没有办法获取Bitmap的存储大小?

    在我的应用程序中 我正在下载一些图像 我想知道是否有任何方法可以获得我下载的位图的大小 这是一个简单的问题 但我似乎无法通过谷歌找到解决方案 这是下载代码 Bitmap b BitmapFactory decodeStream InputS
  • Python 中的肥皂调用

    我试着打电话给肥皂服务公司 我的调用成功 但返回空值 下面我附上了我的肥皂请求和响应架构 它接受一维数组作为输入并返回该数组 请求架构
  • 如何为 HTTPS 调用指定出站证书别名?

    我正在调用需要客户端证书身份验证的 Web 服务 如果我指定一个包含单个证书 服务期望的客户端证书 的 Java 密钥库 那么一切都会正常工作 但是 如果我使用包含多个证书的密钥库 那么我似乎无法指定客户端应选择哪个证书 客户端似乎会选择第