WS-Security:使用BinarySecurityToken进行身份验证
眾所周知,WS-Security設(shè)定的目標(biāo)之一是對(duì)SOAP消息強(qiáng)制執(zhí)行完整性和/或保密。 在完整性的情況下,添加到SOAP消息的簽名是數(shù)學(xué)過程的結(jié)果,該過程涉及發(fā)送者的私鑰,從而導(dǎo)致加密的消息摘要。
默認(rèn)情況下,大多數(shù)框架(例如WSS4J)僅對(duì)正文進(jìn)行簽名。 如果要添加額外的標(biāo)頭(例如Timestamp標(biāo)頭),則需要明確指示對(duì)其進(jìn)行簽名。 使用WSS4J例如Spring的支持,你可以設(shè)置包含本地元素名稱的逗號(hào)分隔的列表,并使用securementSignatureParts屬性對(duì)應(yīng)的命名空間。
在下面的示例中,如何指示它對(duì)Body和Timestamp元素(及其同級(jí)元素)進(jìn)行簽名。 這將導(dǎo)致將兩個(gè)數(shù)字簽名附加到消息中:
<property name="securementSignatureParts" value="{}{http://schemas.xmlsoap.org/soap/envelope/}Body;{}{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd}Timestamp"> </property>最終,SOAP消息將與XML數(shù)字簽名數(shù)據(jù)以及大多數(shù)情況下包含證書的BinarySecurityToken一起發(fā)送。 到目前為止沒有新內(nèi)容。 但是,令我吃驚的是,似乎沒有廣泛了解BST的目標(biāo)是什么,也不知道如何使用它來控制身份驗(yàn)證。 讓我嘗試闡明一下:與SOAP消息一起發(fā)送的發(fā)件人的證書起著標(biāo)識(shí)的作用。 您可以將其與用戶名++進(jìn)行比較。 應(yīng)該清楚的是,消息中的證書不能被信任,用戶名也不能不經(jīng)過密碼驗(yàn)證。 到目前為止,每個(gè)人都對(duì)此表示同意: “是的,當(dāng)然,需要對(duì)證書進(jìn)行驗(yàn)證才能被信任,然后您便會(huì)被設(shè)置!” 但這還不是全部。 證書的驗(yàn)證與身份驗(yàn)證不同。 消息中的證書有效并且由已知CA簽名的事實(shí)不足以考慮發(fā)件人是否已通過身份驗(yàn)證。 例如:在最惡意的時(shí)刻,我本可以截取消息,更改內(nèi)容,基于我的私鑰創(chuàng)建新的簽名并用我的證書替換消息中的BST。 我的證書完全可以是正式的CA簽名證書(甚至由您使用的同一CA簽名),因此它可以通過驗(yàn)證檢查。 如果框架只是簡(jiǎn)單地驗(yàn)證消息中的證書,那么我們將完全沒有安全性。
注意:如果您是通過安全傳輸發(fā)送郵件,則可能是我無法截獲該郵件。 但是安全傳輸大多在實(shí)際端點(diǎn)之前終止,而使一小部分傳輸“不安全”。 盡管這部分將主要在公司內(nèi)部進(jìn)行,但是我想指出的是,無論您的傳輸多么安全,端點(diǎn)都有責(zé)任驗(yàn)證發(fā)件人的身份。 例如; 在異步系統(tǒng)中,SOAP消息可能已經(jīng)放置在消息隊(duì)列上,以便稍后進(jìn)行處理。 當(dāng)由端點(diǎn)開始處理時(shí),安全傳輸?shù)嫩欅E早已消失。 您必須使用消息中包含的信息來驗(yàn)證身份。
為了解決此漏洞,我們有兩個(gè)解決方案:第一個(gè)解決方案進(jìn)一步建立在我們已經(jīng)描述的基礎(chǔ)上:消息中的證書根據(jù)信任庫(kù)中的CA根證書進(jìn)行了驗(yàn)證。 在這種情況下,建議首先縮小可信CA的范圍。 例如,您可以在有限的CA列表中與客戶達(dá)成協(xié)議,以從中獲取證書。 這樣一來,您已經(jīng)降低了信任更多“灰色區(qū)域” CA的風(fēng)險(xiǎn),因?yàn)檫@些CA可能不遵循發(fā)出如此嚴(yán)格的證書的規(guī)則(例如,正確檢查其客戶的身份)。 其次,由于您的受信任CA發(fā)出的*每張*證書都將被視為“已認(rèn)證”,因此我們將通過發(fā)出一些額外的支票來彌補(bǔ)漏洞。 使用WSS4J,可以基于證書的主題DN屬性配置匹配模式。 他們對(duì)此有一個(gè)不錯(cuò)的博客條目: http : //coheigea.blogspot.ie/2012/08/subject-dn-certificate-constraint.html 。 我們可以指定證書的DN必須匹配給定值,如下所示:
Wss4jHandler handler = ... handler.setOption(WSHandlerConstants.SIG_SUBJECT_CERT_CONSTRAINTS, "CN = ...");注意:目前在Wss4jSecurityInterceptor中使用Spring對(duì)WSS4J的支持尚無此設(shè)置器,因此您必須對(duì)其進(jìn)行擴(kuò)展才能啟用此功能!
總結(jié)正在執(zhí)行的步驟:
- 此檢查為我們保證了證書確實(shí)屬于證書聲稱屬于的一方。
- 這將是身份驗(yàn)證步驟; 一旦發(fā)現(xiàn)證書有效,我們將檢查證書的所有者是否也是我們要授予訪問權(quán)限的證書的所有者
請(qǐng)注意,默認(rèn)情況下不進(jìn)行此檢查(至少在使用WSS4J時(shí))! 如果您不指定它,而只是將您的CA添加到信任庫(kù)中,您將留下一個(gè)安全漏洞!
第二種解決方案不需要額外的配置,并且僅取決于要在信任庫(kù)中顯示的發(fā)送者的證書。
消息中包含的證書與信任庫(kù)中的證書匹配。 如果它們匹配,則對(duì)發(fā)送者進(jìn)行身份驗(yàn)證。 無需針對(duì)CA驗(yàn)證證書,因?yàn)樵谛湃螏?kù)中導(dǎo)入的證書是顯式可信的(WSS4J仍將檢查證書是否未過期,并可能對(duì)其進(jìn)行吊銷檢查)。 同樣,信任庫(kù)中沒有CA證書(或CA中間證書)! 也只有您要授予訪問權(quán)限的發(fā)件人的證書。 因此,通過從信任庫(kù)中添加(或刪除)其證書來控制訪問。
這要求您在最初導(dǎo)入證書時(shí)要謹(jǐn)慎,因?yàn)槟仨毚_保它們實(shí)際上代表發(fā)送者。 但這是在將證書添加到信任庫(kù)時(shí)以及在添加CA證書(如第一個(gè)解決方案)時(shí)始終必須執(zhí)行的操作。
結(jié)論
假設(shè)您可以限制受信任的CA,則在大多數(shù)情況下,第一種解決方案是首選的,也是最具擴(kuò)展性的。 對(duì)于新客戶端,不需要對(duì)信任庫(kù)進(jìn)行任何更改。 匹配的屬性可以存儲(chǔ)在外部,因此很容易更改/添加。 另外,當(dāng)客戶端證書過期或被吊銷時(shí),您無需執(zhí)行任何特殊操作。 發(fā)件人將在給定時(shí)刻使用新證書,并將根據(jù)您的信任庫(kù)中的CA直接對(duì)其進(jìn)行驗(yàn)證。 在第二種解決方案中,您將必須將新證書添加到受托者中,并將舊證書保留一段時(shí)間,直到執(zhí)行切換為止。
總體經(jīng)驗(yàn)教訓(xùn):水密安全很難。 IT領(lǐng)域的#1規(guī)則(假設(shè)是所有麻煩的源頭)在這里確實(shí)是正確的。 持懷疑態(tài)度,并確保您完全了解正在發(fā)生的事情。 在您確定默認(rèn)設(shè)置之前,請(qǐng)不要信任默認(rèn)設(shè)置。 房子警報(bào)的默認(rèn)設(shè)置(例如123456)也不是好主意。 Tomcat安裝上的默認(rèn)管理員密碼也不是。
翻譯自: https://www.javacodegeeks.com/2013/09/ws-security-using-binarysecuritytoken-for-authentication.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的WS-Security:使用BinarySecurityToken进行身份验证的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 九华山求什么最灵验 九华山介绍
- 下一篇: 使用Apollo通过WebSocket通