簡體   English   中英

JWT RS256:通過https獲取公鑰是否安全?

[英]JWT RS256: Is it safe to fetch public key over https?

我正在使用RS256算法簽署JWT。 要在客戶端驗證這些令牌,我需要以某種方式訪問​​公鑰。

當我設置一個不受保護的API路由('/ api / certificate')來返回包含公鑰的證書時,是否存在安全問題(欺騙,...)。 我是否需要采取任何額外的安全措施?

有幾個概念經常混淆,也許不適合你,但讓我試着在這個答案中解釋一些事情。

非對稱加密顯然需要公鑰和私鑰,兩者基本上都只是數字。 私鑰是保密的,公眾是公共的,任何人都可以擁有它。 簽名時,您使用私鑰進行簽名,然后任何人都可以使用公鑰驗證簽名是由具有相應私鑰的人(即您)進行的。

但問題是如何分發您的公鑰,或者在您的jwt示例中,客戶如何獲得它。 正如您在問題中正確指出的那樣,僅僅通過不安全的渠道下載公鑰是不夠好的,因為攻擊者可以用自己的公鑰替換它,從而導致攻擊者能夠簽署令牌。

對此的一個解決方案可能是如您所建議的那樣通過https獲取,這實際上意味着使用第二組公共 - 私有密鑰對(網絡服務器的密鑰)來保護發送第一組。 理論上的問題仍然是相同的,它只是在后台為您固有解決:瀏覽器如何知道它在連接時從服務器接收的公鑰實際上屬於服務器。 他們之間還沒有安全通道。

輸入證書。

證書是一種文檔,它基本上將公鑰與其所有者聯系起來,這正是您想要的。 當瀏覽器連接到網站時,服務器會發送其公鑰及其證書 ,以便瀏覽器可以驗證公鑰實際上屬於發送它的服務器(在本例中為域名)。 如何驗證它超出了本文的范圍,重點是證書是由另一個公鑰簽名的,證書可以由另一個公鑰簽名等,並且鏈由一個列表終止稱為您的操作系統/瀏覽器供應商為您的計算機和/或瀏覽器設置的受信任根證書。

您也應該以相同的方式使用證書驗證公鑰。 您甚至不需要SSL(https)傳輸的負擔,驗證公鑰是否屬於特定主題是證書的主要目的。

因此,您所要做的不僅僅是從API獲取公鑰,而是將其與證書一起使用。 您可能已經這樣做了,很少使用裸公鑰。 您很可能已經從服務器接收了pfx或cer或crt或其他任何內容。 根據您正在開發的技術堆棧,您可以確保使用內置機制來完全驗證證書並確保其有效。 請不要實施您自己的驗證,因為這是一項棘手的業務,很難做到正確。 如果證書通過驗證,您可以相信您從API收到的公鑰是真實的並且屬於它聲稱屬於的任何內容。 可能有一些警告(例如,確保除了基本驗證之外,您還要檢查證書中其他人不能擁有的字段組合)。

作為一項額外的安全措施,您還可以通過在客戶端中提供有效證書的指紋列表來實現證書鎖定 ,從而使其更安全地抵御某些類型的攻擊(在瀏覽器客戶端中更少,但概念仍然相同) )。

編輯 (在通過一般的到期驗證后,要在證書中檢查哪些字段等):

在一般情況下,它取決於誰簽署了證書以及它是什么類型的證書。

由真實證書頒發機構(CA)簽名的服務器證書只能將服務器域作為其公用名(CN)字段,真正的CA通常不會簽署任何其他內容,並且它們也不會為您的域簽署證書。除非你能證明你控制yourdomain.com。 因此,在這種情況下,在證書通過驗證后檢查CN可能就足夠了。 您確實需要檢查CN,因為任何人都可以擁有來自GlobalSign或Thawte或其他可信CA的有效證書,它只需花錢。 他們不能擁有的是yourdomain.com的證書。

如果您簽署自己的證書,您也不會為任何人簽署任何內容,因此在這種情況下,檢查發行人(您簽署的)和CN(針對誰)就足夠了。 如果證書以其他方式通過驗證(意味着受信任的根證書簽名),則應該沒問題,因為攻擊者通常無法將您的CA證書作為您計算機上的受信任證書。

一般來說,你想要檢查別人不能擁有的東西。 如果你依賴真正的CA,它會更容易,通常最好檢查指紋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM