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

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生成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正则表达式的环视实际应用案例

一、千位分隔符案例&#xff08;一&#xff09; 逆序环视和顺序环视结合应用。 **需求&#xff1a;**数字格式化成用 , 分隔的货币格式。 正则表达式&#xff1a;(?n)(?<\d)(?<!\.\d*)(?(\d{3})(\.|$)) 测试代码&#xff1a; double[] data new double[] { 0,…

软件工程专插本_2021年专插本部分招生专业(拟),广科/广东理工/华商/培正/松田/工商大!...

小师姐从各专插本交流群中收集到了6所院校的2021年本科插班生拟招生专业&#xff1a;广东理工学院、广东科技学院、广东财经大学华商学院、广州大学松田学院、广东培正学院、广东工商职业技术大学。ps&#xff1a;以下只是拟招生专业&#xff0c;具体还是以考试院公布的为准。另…

Requests库实战(一)---网页采集器

网页采集器User-Agent伪装完整代码功能&#xff1a;通过动态url来实现用户输入搜索关键字&#xff0c;返回搜索到的页面。User-Agent伪装 一种反爬机制。 原理&#xff1a;网站的服务器会检测对于请求的载体身份标识&#xff0c;如果检测到请求的载体身份标识为某一款浏览器&a…

ES6 对正则表达式的扩展

文章目录修饰符 y修饰符 uECMAScript 6.0&#xff08;以下简称 ES6&#xff09;是 JavaScript 语言的下一代标准&#xff0c;已经在 2015 年 6 月正式发布了。它的目标&#xff0c;是使得 JavaScript 语言可以用来编写复杂的大型应用程序&#xff0c;成为企业级开发语言。修饰符…

transformer机制讲解_【核心代码解读】Transformer-XL

[论文] Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context​arxiv.orgMotivationTransformer在预训练阶段&#xff0c;设置了固定序列长度max_len的上下文&#xff0c;finetuning阶段&#xff0c;模型不能获取大于max_len的上下文依赖&#xff1b;Tran…

Neo4j导入:java.lang.IllegalStateException:不支持在单个导入中混合指定和未指定的组所有物...

休息片刻之后&#xff0c;我最近一直在使用Neo4j导入工具 &#xff0c;并遇到了我最初不理解的有趣的错误消息。 我有一些CSV文件&#xff0c;其中包含要导入Neo4j的节点。 它们的内容如下所示&#xff1a; $ cat people_header.csv name:ID(Person)$ cat people.csv "…

Requests库实战(二)---破解百度翻译

功能&#xff1a;爬取到页面中翻译后的文本数据 获取请求地址和请求方式 先输入dog翻译一下&#xff0c;发现是Ajax请求(动态实时刷新页面)&#xff0c;Ajax请求的数据包可以在网络的XHR中看到。找到输入dog的数据包&#xff0c;通过标头的表单数据kw:dog以及响应的结果就可以…

局部变量的赋值问题

int i 5; i 10;变量 i 在栈帧里面的局部变量表里面&#xff0c;这个局部变量表类似一个数组&#xff0c;里面包含了一些“槽位”来存放局部变量&#xff0c;i 这个变量&#xff0c;就是在局部变量表中的某一个槽位里面&#xff0c;并且 i 只会占用一个槽位&#xff0c;对变量…

php生成 sku_高并发下,php与redis实现的抢购、秒杀功能

抢购、秒杀是如今很常见的一个应用场景&#xff0c;主要需要解决的问题有两个&#xff1a;1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少&#xff08;"超卖"问题&#xff09;对于第一个问题&#xff0c;已经很容易想到用缓存来处理抢购&#xff0c;…

lambda :: -_无需再忙了:Lambda-S3缩略图,由SLAppForge Sigma钉牢!

lambda :: ->如果你还没有注意到了&#xff0c;我最近被唠叨试图开始使用时&#xff0c;我遭遇了陷阱AWSλ-S3正式例子 。 虽然大多数这些愚蠢的错误的指责是对我自己的懒惰&#xff0c;过度自尊和缺乏对细节的关注&#xff0c;我个人觉得&#xff0c;在开始与一家领先的无服…

Requests库实战(三)---爬取豆瓣电影详细信息

完整代码 爬取豆瓣电影的详细信息 地址&#xff1a;豆瓣电影动画 向下滑动时新增的数据也是Ajax请求&#xff0c;原理和上一个项目是一样的。唯一的不同是此处请求url携带了多个参数 import requests import json header{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x6…

lineseparator_首选System.lineSeparator()以用Java编写系统相关的行分隔符字符串

lineseparatorJDK 7在java.lang.System类上引入了一个名为lineSeparator&#xff08;&#xff09;的新方法。 该方法不期待任何参数&#xff0c;并返回一个String &#xff0c;它表示“取决于系统的行分隔符字符串。” 此方法的Javadoc文档还指出System.lineSeparator() “始终…

JavaScript(JS)中与正则表达式有关的方法介绍

文章目录RegExpRegExp 对象的属性compiletestexecString一共有 7 个与正则表达式式相关的方法&#xff0c;这些方法分别来自于 RegExp 与 String 对象。RegExp RegExp 对象表示正则表达式, 主要用于对字符串执行模式匹配. 语法: new RegExp(pattern[, flags]) 参数 pattern …

Requests库实战(四)---爬取肯德基餐厅地址信息

功能&#xff1a;爬取查询后的肯德基餐厅的地址信息 地址&#xff1a;http://www.kfc.com.cn/kfccda/storelist/index.aspx 亮点是post请求的参数有两组&#xff1a;查询字符串参数&#xff0c;表单数据。 对于post请求,由于url中隐藏了许多参数&#xff0c;所以引入了表单数据…

显示请求_学习记录:HTTP的响应与请求amp;Curl

本文包含四个部分&#xff0c;简要介绍HTTP请求、HTTP响应、chrome开发者查看、与CURL命令。Part1&#xff1a;HTTP请求1GET请求指定的页面信息&#xff0c;并返回实体主体。2HEAD类似于get请求&#xff0c;只不过返回的响应中没有具体的内容&#xff0c;用于获取报头。3POST向…

java.线程池 线程数_如何在线程“ main”中修复异常java.lang.NoClassDefFoundError:Java中的org / slf4j / LoggerFactory...

java.线程池 线程数此错误表示您的代码或您在应用程序中使用的任何外部库都在使用SLF4J库 &#xff08;一个开放源代码日志记录库&#xff09;&#xff0c;但无法找到所需的JAR文件&#xff0c;例如slf4j-api-1.7.2.jar因此它是在线程“ main” java.lang.NoClassDefFoundError…

正则表达式实战---爬取多张图片

主要是分析网站图片的html源代码&#xff0c;来决定正则表达式如何写。 完整代码 #使用正则表达式爬取多张图片,亮点在于数据解析 #爬取网站&#xff1a;https://www.bilibili.com/read/cv11323037?fromsearch import requests import re import os image_pathimage if not …

JS(JavaScript) 使用捕获性分组处理文本模板,最终生成完整字符串

var tmp "An ${a} a ${b} keeps the ${c} away";// obj 是 json 对象 var obj {a:"apple",b:"day",c:"doctor" };/** *descript 声明定义一个函数 tmpl&#xff0c;该函数将文本模板对应的变量替换后返回 * */function tmpl(t,o){/*…

6 日期字符串转日期_Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类...

因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题&#xff0c;2005年&#xff0c;Stephen Colebourne创建了Joda-Time库&#xff0c;作为替代的日期和时间API。Stephen向JCP提交了一个规范&#xff0c;他本人作为规范的领导人&#xff0c;该规范就是JSR 310&am…

第一个JDK 10(18.3)候选版本(内部版本43)展示了新的版本控制方案

Mark Reinhold的帖子“ JDK 10&#xff1a;First Release Candidate ”宣布“在build 43中没有未解决的P1错误”&#xff0c;并将Build 43命名为最初的JDK 10 Release Candidate 。 Reinhold帖子还指向“ JDK 10 Early Access Builds ”页面&#xff0c;该页面包含发行说明的链…