日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

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

發(fā)布時(shí)間:2023/12/3 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 同时使用传入和传出连接时,相互TLS身份验证存在Java问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在大多數(shù)企業(yè)環(huán)境中,在應(yīng)用程序之間的連接中使用某種形式的安全通信(例如TLS或SSL)。 在某些環(huán)境中, 相互(雙向)身份驗(yàn)證也是一項(xiàng)非功能性要求。 有時(shí)將其稱為雙向SSL或雙向TLS身份驗(yàn)證。 因此,除了提供證書的服務(wù)器外,它還請求客戶端發(fā)送其證書,以便隨后可以使用它來認(rèn)證調(diào)用方。

我當(dāng)前客戶的一個(gè)合作伙伴正在開發(fā)一種服務(wù)器,該服務(wù)器可以通過MQTT接收數(shù)據(jù),并且由于數(shù)據(jù)非常敏感,因此客戶決定應(yīng)使用相互TLS身份驗(yàn)證來保護(hù)數(shù)據(jù)。 此外,客戶要求將該服務(wù)器收集的聚合數(shù)據(jù)發(fā)布到其他下游服務(wù)時(shí),還必須使用雙向TLS身份驗(yàn)證來完成。 該服務(wù)器需要向其調(diào)用方提供服務(wù)器證書,以便他們可以驗(yàn)證主機(jī)名和身份,但是另外,當(dāng)在SSL握手期間被請求這樣做時(shí),它必須向下游服務(wù)器提供具有有效用戶ID的客戶端證書。

最初的想法是使用用于配置密鑰庫的標(biāo)準(zhǔn)JVM系統(tǒng)屬性來實(shí)現(xiàn)此目的:“-Djavax.net.ssl.keyStore =…”,即將客戶端和服務(wù)器證書都放入單個(gè)密鑰庫中。 但是,我們很快意識(shí)到這是行不通的,并且跟蹤SSL調(diào)試日志表明,無論是在傳入SSL握手期間還是傳出SSL握手期間,服務(wù)器都提供了錯(cuò)誤的證書。 在傳入握手期間,它應(yīng)出示其服務(wù)器證書。 在外發(fā)握手期間,它應(yīng)出示其客戶證書。

注釋了以下日志摘錄,并顯示了這些問題:

  • 提供給呼叫者的證書有誤
  • 向下游提交了錯(cuò)誤的證書

經(jīng)過進(jìn)一步調(diào)查,很明顯該問題與JVM中的默認(rèn)密鑰管理器實(shí)現(xiàn)有關(guān)。 的
SunX509KeyManagerImpl類用于選擇JVM在握手期間應(yīng)提供的證書,并且對于客戶機(jī)證書和服務(wù)器證書選擇,代碼僅采用找到的第一個(gè)證書:

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

第一行中的方法返回的別名僅匹配密鑰類型(例如DSA)和可選的頒發(fā)者。 因此,在密鑰庫包含兩個(gè)或多個(gè)證書的情況下,選擇性不夠。 此外,列表的順序基于對HashMap條目集的迭代,因此順序不是說字母順序的,而是確定性的和恒定的。 因此,在搜索服務(wù)器證書時(shí),該算法可能會(huì)返回客戶端證書。 但是,如果該部分起作用,則當(dāng)服務(wù)器進(jìn)行下游連接并需要出示其客戶端證書時(shí),該算法將失敗,因?yàn)閷⒃俅纬鍪镜谝粋€(gè)證書,即服務(wù)器證書。 因此,由于無法創(chuàng)建并發(fā)的傳入和傳出雙向SSL連接,因此我向Oracle提交了一個(gè)錯(cuò)誤(內(nèi)部審查ID 9052786在20180225上報(bào)告給Oracle)。

一種解決方案是使用兩個(gè)密鑰庫,每個(gè)證書存儲(chǔ)一個(gè), 如此處所示 。

JVM的一個(gè)可能補(bǔ)丁是通過使用
“擴(kuò)展密鑰用法”證書擴(kuò)展。 基本上,可以增強(qiáng)上述代碼,以額外檢查擴(kuò)展的密鑰用法并在別名選擇期間做出更明智的決定,例如:

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; }

更多詳細(xì)信息,包括完整運(yùn)行的示例和單元測試, 請參見此處 。

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

總結(jié)

以上是生活随笔為你收集整理的同时使用传入和传出连接时,相互TLS身份验证存在Java问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。