tls 使用java生成

在大多数企业环境中,应用程序之间的连接中使用某种形式的安全通信(例如TLS或SSL)。 在某些环境中, 相互(双向)身份验证也是一项非功能性要求。 有时将其称为双向SSL或双向TLS身份验证。 因此,除了提供证书的服务器外,它还请求客户端发送其证书,以便随后可以使用它来验证调用方。

我当前客户的一个合作伙伴正在开发一种服务器,该服务器可以通过MQTT接收数据,并且由于数据非常敏感,因此客户决定应使用相互TLS身份验证来保护数据。 此外,客户要求将该服务器收集的聚合数据发布到其他下游服务时,还必须使用双向TLS身份验证来完成。 该服务器需要向其调用方提供服务器证书,以便他们可以验证主机名和身份,但是,当在SSL握手期间被请求这样做时,它还必须向下游服务器提供具有有效用户ID的客户端证书。

最初的想法是使用用于配置密钥库的标准JVM系统属性来实现此目的:“-Djavax.net.ssl.keyStore =…”,即将客户端和服务器证书都放入单个密钥库中。 但是,我们很快意识到这是行不通的,并且跟踪SSL调试日志表明,无论是在传入SSL握手期间还是传出SSL握手期间,服务器都提供了错误的证书。 在传入握手期间,它应出示其服务器证书。 在外发握手期间,应出示其客户证书。

注释了以下日志摘录,并显示了这些问题:

  • 出示给呼叫者的证书错误
  • 向下游提交了错误的证书

经过进一步调查,很明显该问题与JVM中的默认密钥管理器实现有关。 的
SunX509KeyManagerImpl类用于选择JVM在握手期间应提供的证书,并且对于客户机证书和服务器证书选择,代码仅采用它找到的第一个证书:

String[] aliases = getXYZAliases(keyTypes[i], issuers);if ((aliases != null) && (aliases.length > 0)) {return aliases[0];  <========== NEEDS TO BE MORE SELECTIVE}

第一行中的方法返回的别名仅匹配密钥类型(例如DSA)和可选的颁发者。 因此,在密钥库包含两个或多个证书的情况下,选择性不够。 此外,列表的顺序基于对HashMap条目集的迭代,因此顺序不是说字母顺序的,而是确定性的和恒定的。 因此,在搜索服务器证书时,该算法可能会返回客户端证书。 但是,如果该部分起作用,则当服务器进行下游连接并需要出示其客户端证书时,该算法将失败,因为将再次出示第一个证书,即服务器证书。 因此,由于不可能创建并发的传入和传出双向SSL连接,因此我向Oracle提交了一个错误(内部审查ID 9052786在20180225上报告给Oracle)。

一种解决方案是使用两个密钥库,每个证书存储一个, 如此处所示 。

JVM的一个可能补丁是通过使用
“扩展密钥用法”证书扩展。 基本上,可以增强上述代码,以额外检查扩展的密钥用法并在选择别名时做出更明智的决定,例如:

String[] aliases = getXYZAliases(keyTypes[i], issuers);
if ((aliases != null) && (aliases.length > 0)) {String alias = selectAliasBasedOnExtendedKeyUsage(aliases, "1.3.6.1.5.5.7.3.2");  //TODO replace with constantif (alias != null) return alias;//default as implemented in openjdkreturn aliases[0];
}

选择别名的方法如下:

private String selectAliasBasedOnExtendedKeyUsage(String[] aliases, String targetExtendedKeyUsage) {for(String alias : aliases){//assume cert in index 0 is the lowest one in the chain, and check its EKUX509Certificate certificate = this.credentialsMap.get(alias).certificates[0];List ekus = certificate.getExtendedKeyUsage();for (String eku : ekus) {if(eku.equals(targetExtendedKeyUsage)){return alias;}}}return null;
}

更多详细信息,包括完整运行的示例和单元测试, 请参见此处 。

翻译自: https://www.javacodegeeks.com/2018/03/java-problem-with-mutual-tls-authentication-when-using-incoming-and-outgoing-connections-simultaneously.html

tls 使用java生成

tls 使用java生成_同时使用传入和传出连接时,相互TLS身份验证存在Java问题相关推荐

  1. 同时使用传入和传出连接时,相互TLS身份验证存在Java问题

    在大多数企业环境中,在应用程序之间的连接中使用某种形式的安全通信(例如TLS或SSL). 在某些环境中, 相互(双向)身份验证也是一项非功能性要求. 有时将其称为双向SSL或双向TLS身份验证. 因此 ...

  2. java取消 验证_使用Spring Security Java配置时禁用基本身份验证

    我正在尝试使用Spring Security Java配置保护Web应用程序的安全. 这是配置的样子: @Configuration @EnableWebMvcSecurity public clas ...

  3. 如何使用Java和XML Config在Spring Security中启用HTTP基本身份验证

    在上一篇文章中,我向您展示了如何在Java应用程序中启用Spring安全性 ,今天我们将讨论如何使用Spring Security 在Java Web应用程序中启用Basic HTTP身份验证 . 如 ...

  4. aws 短信验证_在AWS Kubernetes上进行抛光的rshiny身份验证

    aws 短信验证 If you're looking for a hassle free way to add authentication to your RShiny Apps you shoul ...

  5. java 远程登陆windows_使用Windows身份验证,JAVA连接到远程MSSQL

    我需要连接到远程ms sql.I有连接的Windows服务器登录信息 . 并且该登录用户可以连接到MSSQL服务器 . (我的意思是我可以通过Windows身份验证与该用户连接到MSSQL服务器) 我 ...

  6. 交叉验证选择最佳参数_如何为您的公司选择最佳的身份验证即服务提供商

    交叉验证选择最佳参数 by Jeff Okawa 通过Jeff Okawa 如何为您的公司选择最佳的身份验证即服务提供商 (How to choose the best Authentication ...

  7. ntlm java_Web应用程序中的NTLM身份验证(java)

    我正在使用以下过滤器在我的Web应用程序中启用NTLM身份验证. 我得到Windows浏览器身份验证提示.运行正常.除了以下事实外- 我无法确定身份验证是成功还是失败! * 两种情况均无错误. *在每 ...

  8. go java性能_服务端I/O性能大比拼:Node、PHP、Java和Go

    理解应用程序的输入/输出(I/O)模型,意味着其在计划处理负载与残酷的实际使用场景之间的差异.若应用程序比较小,也没有服务于很高的负载,也许它影响甚微.但随着应用程序的负载逐渐上涨,采用错误的I/O模 ...

  9. node和java性能_服务端I/O性能大比拼:Node、PHP、Java和Go(二)

    服务端I/O性能大比拼:Node.PHP.Java和Go(二) 服务端I/O性能大比拼:Node.PHP.Java和Go(二) ### 多线程的方式:Java 所以就在你买了你的第一个域名的时候,Ja ...

最新文章

  1. 图表添加特定横轴数据_Excel图表学习61: 编写一个给多个数据系列添加趋势线的加载宏...
  2. android获取wifi连接状态,获取android设备wifi连接状态
  3. 【AC Saber】双指针
  4. 7.4.6 核PCA
  5. 在Python中以二进制格式输入数字
  6. 会议容易中吗_在装配式建筑中重要又容易被忽视的部分,你中招了吗?
  7. linux php错误日志在哪里,宝塔的php错误日志在哪
  8. matlab神经网络不常见问题
  9. 剑指 Offer 09. 用两个栈实现队列(day 03)
  10. 手机的移动网络怎么开_都连接WiFi了,还要开移动网络吗?
  11. java 日期转中文_java年月日转中文
  12. BSD协议和FreeBSD
  13. commit rollback操作产生undo和redo?
  14. 秦牧鸿蒙之体有什么用,第一五一二章 鸿蒙元气
  15. 蛟龙未遇,潜身于鱼虾之间;君子失时,拱手于小人之下。
  16. socket文件传输
  17. 上云安全建设之CDN安全防护
  18. 详解BUG(又名:BUG的生命周期)
  19. 一个啥都不懂但还不知天高地厚的我
  20. 程序员的3年之痒改变的不止薪水

热门文章

  1. P4342:[IOI1998]Polygon(区间dp)
  2. P5074-Eat the Trees【插头dp】
  3. P2633-Count on a tree【主席树,LCA】
  4. P6015-[CSGRound3]游戏【树状数组】
  5. AtCoder Grand Contest 021 D - Reversed LCS(区间dp)
  6. Codeforces Round #653 (Div. 3)
  7. 【并查集】银河英雄传说 (luogu 1196/ssl 1225)
  8. org.apache.ibatis.builder.BuilderException: Could not find value method on SQL annotation
  9. Java IO: RandomAccessFile
  10. springboot点击运行没反应,什么都不显示的解决方式