SAML 訊息檢視器
檢視登入訊息,找出 IdP 與 SP 設定差異
輸入訊息
貼上原始 XML、HTTP POST 的 SAMLRequest / SAMLResponse Base64,或 HTTP Redirect 的完整網址。全部在瀏覽器內解析:內容不會送出,也不會寫進網址、瀏覽器儲存或 console。
SAML 訊息裡可能有還能重播的登入憑證。這一頁只留在目前這個分頁的記憶體裡,重新整理就沒了;「複製連結」複製的是工具網址,不含你貼的內容。
裸貼的 Base64 裡 + 就是 Base64 的 +;表單 body 與 Redirect query 依 form-urlencoded 規則,+ 是空白、Base64 的 + 要寫成 %2B。Redirect 的內容是 raw DEFLATE(沒有 zlib 標頭),這兩件事弄反解出來的 XML 會少幾個位元組,而且錯得很安靜。
載入範例
輸入或來源形式已變更,請重新解析
訊息摘要
簽章尚未驗證本版只解析訊息內容,沒有進行 XML 簽章驗證,也沒有檢查憑證鏈。畫面上的任何欄位都不代表它經過簽署或未被竄改。
簽章位置與演算法
以下只是訊息裡宣告的內容。完整驗簽要處理標準化、允許的轉換、reference 摘要、受信任的外部憑證與 ID 唯一性,少做任何一項都不能說「已驗證」。
解析時注意到的事
條件檢查
填入你在 SP 這邊的設定值,工具才有東西可以比對。沒填的項目一律標成「未檢查」—— 拿訊息自己的值當預期值永遠會通過,那是一排沒有資訊的綠勾。
沒有請求 ID 就不判定 InResponseTo。IdP 主動發起的登入本來就沒有這個欄位,那不是錯誤。
秒(0 到 300)
預期值已變更,請重新檢查
檢查結果
| 檢查項目 | 結果 | 說明 |
|---|
每一項各自獨立顯示,不會合成一顆綠燈。「未檢查」就是沒有檢查,不代表通過。
身分與屬性
NameID、Attribute 值與 SessionIndex 預設遮罩。按下「顯示敏感值」只影響這個畫面,不會寫進任何地方。
原始 XML 0
解碼後的原文,裡面有身分資訊
這一段是完整原文,含 NameID 與 Attribute 值。複製或貼到工單之前請自己確認要不要遮罩 —— 它不會被放進「遮罩後匯出」的報告裡。
原文逐字照你貼進來的樣子顯示,不會被重新排版的結果覆蓋。
匯出報告
把解析結果與條件檢查匯出成排錯報告。預設遮罩 NameID、Attribute 值、SessionIndex 與來源位址,而且報告上一定寫著「簽章尚未驗證」。原始 XML 不會放進來。
使用說明 7
這支工具怎麼判,以及它刻意不替你決定的事
解析成功不代表登入有效。本版沒有驗證 XML 簽章、沒有檢查憑證鏈、也沒有解密加密的 Assertion —— 一份被竄改過的訊息在這裡看起來會跟正常的一模一樣。
有 Signature 元素不等於驗簽成功
完整的 XML 簽章驗證要處理標準化方式、允許的轉換、reference 摘要、受信任的外部憑證、ID 是否唯一,還要證明「畫面上顯示的那份 Assertion」正是被簽章保護的那一份(簽名包覆攻擊就是攻這一點)。少做任何一項,「已驗證」三個字就是騙人的。所以本版一律標「簽章尚未驗證」。
Audience 的多個限制是「而且」不是「或者」
Conditions 裡每一個 AudienceRestriction 都是獨立的限制,要全部滿足;同一個 restriction 內部的多個 Audience 才是任一符合即可。把所有 Audience 攤平成一個清單再問「有沒有包含」,會把「A 而且 B」讀成「A 或 B」—— 那正好會把一份不該給這個 SP 用的 Assertion 判成通過。
NotBefore 含當下,NotOnOrAfter 不含
NotBefore 是下界包含(時間剛好等於它就算成立),NotOnOrAfter 是上界不含(剛好等於它就已經過期)。兩者不對稱,寫成同一種比較會在邊界那一秒判反。容許時差讓某一項通過時,畫面會標出「靠時差才通過」。
POST 的 + 與 Redirect 的 %2B
裸貼的 Base64 裡 + 就是 Base64 的 +。表單 body 與 Redirect query 是 form-urlencoded,那裡的 + 是空白,Base64 的 + 必須寫成 %2B。另外 Redirect 的內容是 raw DEFLATE,沒有 zlib 標頭。這幾件事弄反,解出來的 XML 會少幾個位元組,而且看起來完全正常。
DOCTYPE 與外部實體一律拒絕
這支工具的 XML 剖析器不接受 DOCTYPE、不接受自訂實體宣告、也不會去讀任何外部資源或 schema。遇到未定義的實體參照會直接報錯,不會靜靜當成空字串放過去 —— 那正是外部實體攻擊的形狀。
多個 Assertion 全部列出來
只看第一個 Assertion 是簽名包覆攻擊的溫床,實務上 IdP 也真的會送多個。這裡每一個都獨立列出、獨立檢查。同名的 Attribute 也分開保存不合併 —— 「IdP 送了兩個同名 Attribute」本身就是排錯時要看到的事實。
加密的 Assertion 只看得到外層
本版只顯示 EncryptedAssertion 的加密演算法,不接收私鑰解密,也不會假裝看得到裡面的內容。SAML Artifact binding 同樣不在範圍內。