在大多数企业环境中,在应用程序之间的连接中使用某种形式的安全通信(例如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问题相关推荐

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

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

  2. ELK下Kibana和Elasticsearch之间相互TLS身份验证

    介绍 安全套接字层(SSL)和传输层安全性(TLS)为传输中的数据提供加密.虽然这些术语通常可以互换使用,但Kibana仅支持TLS,它取代了旧的SSL协议. TLS需要X.509证书来验证通信方并执 ...

  3. windows远程桌面连接时,显示发生身份验证错误,给函数提供的身份无效

    初次看到这个错误的时候懵了.访问给的地址一看,发现大概意思是不安全了,微软要更新一下 凭据安全支持提供程序协议 (CredSSP) 是处理其他应用程序的身份验证请求的身份验证提供程序. CredSSP ...

  4. -Error-阿里云远程桌面连接时提示发生身份验证错误

    问题: 阿里云一段时间没有连,今天远程,提示"发生身份验证错误",密码重置之后依旧提示该错误. 解决办法: 1. 登陆阿里云网站,登陆后,点击控制台 2. 选择云服务器 3. 选择 ...

  5. VMware View Client 连接服务器,提示身份验证失败,连接服务器时

    第一次安装或则重装系统后安装VMware View的时候  点击下一步 然后连接服务器地址  例如:192.168.xx.xxx,点击连接后,在输入账号的时候弹出VMware View Client ...

  6. 为终端服务连接配置网络级身份验证

    1.1.1 为终端服务连接配置网络级身份验证 在客户端连接到终端服务器时,可以通过在连接过程的早期提供用户身份验证来提高终端服务器的安全性.这种早期用户身份验证方法称为网络级身份验证. 网络级身份验证 ...

  7. Windows远程桌面连接提示:出行身份验证错误 要求的函数不受支持

    #1.Windows远程桌面连接提示:出行身份验证错误 要求的函数不受支持,这可能是由于CredSSP加密Oracle修正. #2.打开Windows电脑,运行命令行输入gpedit.msc回车,进入 ...

  8. 远程桌面连接服务器,提示身份验证错误,要求的函数不受支持,但又找不到加密Oracle修正

    远程连接服务器系统时,客户端提示身份验证错误,要求的函数不受支持,但又找不到加密Oracle修正 解决方案:提供一个修改注册表的方法,亲测可用: 1. 打开注册表,快捷输入 "regedit ...

  9. 远程桌面连接:提示出现身份验证错误,要求的函数不受支持。这可能是由于CredSSP加密数据库修正错误。

    问题起因:因为工作中要使用远程桌面连接,在连接某一IP地址时,突然弹出错误:出现身份验证错误.要求的函数不受支持.远程计算机:XX.XX.XX.XX(远程的IP地址)这可能是由于CredSSP加密数据 ...

最新文章

  1. 一款N-沟道耗尽型JFET晶体管 MPF102
  2. 用BFS(广度优先搜索queuelist)算法解决农夫过河问题
  3. cuda 编 程(10) cuda 并行加速时间对比
  4. 根据BAPI_PO_CREATE1创建采购订单
  5. 深度学习框架TensorFlow(1.安装和简介)
  6. cad文字递增快捷键_十年经验总结,100个CAD快捷键。
  7. Mysql 一条SQL语句实现批量更新数据,update结合case、when和then的使用案例
  8. php break 用法,PHP break语句
  9. OpenCV:使用python-cv2实现视频的分解与合成
  10. php mssql 分页SQL语句优化 持续影响
  11. python歌词统计单词词频_python词频统计
  12. 使用Grafana搭建监控系统
  13. 【总结思考】如何提高项目的稳定性和开发效率
  14. 高能手办团服务器维护了,高能手办团11月27日更新了什么 11月27日更新维护详情...
  15. 猿辅导、掌门教育悄然转身,发力素质教育
  16. 数字人民币红包体验如何?
  17. Java解析word文档,将word文档题库选择题导入
  18. Faraday:微博广告分层实验平台架构
  19. CTF练题(5)word隐写基础题,jpg图片隐写,敲击码解密
  20. mapbox-gl-draw改造,支持绘制时实时显示面积

热门文章

  1. linux下redis的安装和配置
  2. Arthas - 开源 Java 诊断工具
  3. 一道非常棘手的 Java 面试题:i++ 是线程安全的吗
  4. java 为什么需要常量池 1
  5. Java虚拟机是如何执行线程同步的
  6. 史上最全Redis面试题
  7. 《金色梦乡》金句摘抄(五)
  8. 求素数为什么到平方根就行了
  9. 2017蓝桥杯省赛---java---B---8(包子凑数)
  10. 用赫夫曼树进行文件的压缩