同时使用传入和传出连接时,相互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

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

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

相关文章

matlab小波脊线,小波脊线提取,模极大值法。运行的结果不太对,代码有些地方我也没完全看懂...

本帖最后由 1393107100 于 2019-5-1 11:10 编辑clear,clcclose all%%%%%% 小波变换 %%%%%%%%%%%%%%%%fs1024;t1/fs:1/fs:1;f1100;f2200;f3300;scos(2*pi*f1*t.*(t>0&t<0.3))2*cos(2*pi*f2*t.*(t>0.3&t<0.8))3*sin(2*pi*f3*t.*(t>0.8&t<1));%sc…

php json追加500错误,在composer.json中添加了一个git地址;composer update 报错

在composer.json中添加了一个git地址&#xff1b;composer update 报错&#xff0c;不知道是什么原因导致的&#xff0c;如图&#xff1a;问题补充&#xff1a;在BAE包里面添加composer.json 后 重新composer updateYour requirements could not be resolved to an installable…

java 解析gson_使用Java和Google GSON解析ESPN API

java 解析gson在我的第一篇文章中&#xff0c;我将解释如何解析ESPN API。 可以在http://developer.espn.com/docs上找到API文档。 首先&#xff0c;您需要请求一个API密钥&#xff0c;然后您可以开始查询REST API以检索JSON响应。 在下面的示例中&#xff0c;我将简单查询在英…

matlab曲线拟合 最低点,Matlab曲线拟合 最小二乘法 polyfit【转】

曲线拟合已知离散点上的数据集 &#xff0c;即已知在点集 上的函数值 &#xff0c;构造一个解析函数(其图形为一曲线)使 在原离散点 上尽可能接近给定的值&#xff0c;这一过程称为曲线拟合。最常用的曲线拟合方法是最小二乘法&#xff0c;该方法是寻找函数 使得 最小。MATLAB函…

多元统计分析matlab,MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法...

MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法&#xff1a;1.层次聚类hierarchical clustering2.k-means聚类这里用最简单的实例说明以下层次聚类原理和应用发法。层次聚类是基于距离的聚类方法&#xff0c;MATLAB中通过pdist、linkage、dendrogram、cluster等…

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

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

sin查找表 matlab,利用Xilinx中的ROM构造查找表来计算sin和cos的方法探讨

1.使用matlab制作.coe文件查找表的构造构造256点的正余弦表exp(-j*2*pi*(0:255)/256)&#xff0c;分别得到 cos和sin的查找表matlab代码: 求sinfid fopen(sin.txt,a );str1 MEMORY_INITIALIZATION_RADIX10;;str2 MEMORY_INITIALIZATION_VECTOR;fprintf(fid,\t%s\n \t%s\n, s…

lucene使用3.0.3_使用Apache Lucene 4.3轻松进行搜索

lucene使用3.0.3Lucene是用Java编写的全文搜索引擎&#xff0c;可以为任何应用程序提供强大的搜索功能。 Lucene的核心是基于文件的全文本索引。 Lucene提供API创建该索引&#xff0c;然后向该索引添加和删除内容。 此外&#xff0c;它允许使用功能强大的搜索算法从该索引中搜索…

Java124 0,AcWing 124. 数的进制转换java

package acwing寒假每日一题;import java.io.BufferedInputStream;import java.util.*;public class TransNumber {public static void main(String[] args) {Scanner in new Scanner(new BufferedInputStream(System.in));//n次操作int n in.nextInt();//输入字符串&#xf…

php提取pdf首页图片,pdf图片怎么提取

pdf图片的提取方法&#xff1a;首先用极速PDF阅读器打开文档&#xff1b;然后在图片处单击鼠标右键并选择“复制图片”&#xff0c;这时就可以粘贴发送了。本文操作环境&#xff1a;Windows7系统&#xff0c;Microsoft Office PowerPoint2020版本&#xff0c;Dell G3电脑。pdf图…

dlopen linux 实例_Linux静态库和动态库

库从本质上来说是一种可执行代码的二进制格式&#xff0c;可以被载入内存中执行。库分静态库和动态库两种。 静态库和动态库的区别1. 静态函数库这类库的名字一般是libxxx.a&#xff1b;利用静态函数库编译成的文件比较大&#xff0c;因为整个 函数库的所有数据都会被整合进目标…

Neo4j:Cypher – Neo.ClientError.Statement.TypeError:不知道如何添加Double和String

我最近将支持Neo4j的应用程序从Neo4j 3.2升级到Neo4j 3.3&#xff0c;发现围绕类型强制的行为发生了有趣的变化&#xff0c;导致我的应用程序抛出了很多错误。 在Neo4j 3.2和更早版本中&#xff0c;如果将String添加到Double&#xff0c;它将把Double强制转换为String并连接值…

php7 php5.6 array,[转]php5.6 升级到php7及变化

不向后兼容的变更错误和异常处理相关的变更在 PHP 7 中&#xff0c;很多致命错误以及可恢复的致命错误&#xff0c;都被转换为异常来处理了。 这些异常继承自 Error 类&#xff0c;此类实现了 Throwable 接口 (所有异常都实现了这个基础接口)。这也意味着&#xff0c;当发生错误…

python 在末尾增加一个字符串,python - Python File.write在末尾添加额外的字符串 - SO中文参考 - www.soinside.com...

我正在使用python(3.6)更新文本文件&#xff0c;并打开r with open(f.play, r) as f2:play f2.read()result manipulate(play)print(result)f2.seek(0, 0)f2.write(result)通过这样做&#xff0c;我得到了意外的结尾部分ap:Envelope>当然&#xff0c;多余的部分是在第一次…

反射setaccessible_advancedday16类加载器,反射

加载配置文件在src目录下创建一个config.properties配置文件&#xff0c;使用类加载器加载配置文件。//创建集合Properties propertiesnew Properties();//获取src目录下&#xff0c;配置文件的流InputStream in ClassLoader.getSystemClassLoader() .getResourceAsStream(…

eventbus多个订阅_番石榴的EventBus –简单的发布者/订阅者

eventbus多个订阅在查看Google的Guava库版本10的最新添加内容时&#xff0c;我注意到EventBus的添加。 这是发布-订阅样式消息传递系统的轻量级实现。 这类似于JMS提供的发布-订阅模型&#xff0c;但是消息保留在应用程序内&#xff0c;而不是在外部广播。 EventBus允许您在程…

python 字段升序,python 根据两个字段排序, 一个升序, 一个降序

SSL双向认证java实现&lpar;转&rpar;本文通过模拟场景,介绍SSL双向认证的java实现 默认的情况下,我认为读者已经对SSL原理有一定的了解,所以文章中对SSL的原理,不做详细的介绍. 如果有这个需要,那么通过GOOGLE,可以搜索到很 ...List和Tuple类型list列表,list是一种有序的…

元气骑士如何获得机器人成就皮肤_元气骑士:机器人成就皮肤该怎么获得?百场老机器人教你走位...

【元气骑士我最行&#xff0c;不爱红武爱老云】各位亲爱的读者大家好&#xff0c;我是百场老机器老云。自从《元气骑士》更新出了特典皮肤之后&#xff0c;众多玩家开始了自己的成就之旅。有很多老玩家能够轻松完成这些成就&#xff0c;但是对于不少接触这款游戏不久的玩家来说…

Elasticsearch –使用模式替换过滤器和自定义分析器忽略查询中的特殊字符

使用Elasticsearch 5&#xff0c;我们有一个字段&#xff0c;例如驾驶执照编号&#xff0c;其中的值可能包含特殊字符&#xff0c;并且由于用户在有限的验证范围内输入了值&#xff0c;因此值的大小写不一致。 例如&#xff0c;这些是假设值&#xff1a; CA-123-456-789 WI.1…

python代码编程软件_编程与编程软件(python-pycharm)

课程安排编辑语言之python数据库软件之mysql今日内容概要编程与编程语言计算机存储内部工作原理编程语言的发展史解释型语言与编译型语言python解释器版本及下载安装编写python程序的编辑器(提升编码效率)变量的概念变量名的命名规范变量名的书写风格今日内容详细编程与编程语言…