證書對象( Credential )中包含密鑰信息,密鑰可以是對稱的,也可以是非對稱的,可能是壹個也可能是多個,其重要的作用就作為密鑰的容器存在。證書對象和我們通常說的數字證書不是壹個概念。
證書對象 Credential 可以通過 KeySupport 工具自動生成。 KeySupport 可以生成對稱密鑰和非對稱密鑰對,下面的例子是生成 RSA 密鑰對,並生成證書對象:
如何讀取已經存在的密鑰到證書對象中?OpenSAML推薦的方法是去使用各種 CredentialResolvers 類對象把已經存在的密鑰放入新創建的證書對象中。
比如密鑰被存放在 JavaKeyStore 中,相應地久應該使用 KeyStoreCredentialResolver ,其構造函數需要key store和密鑰別名與口令的Map。
通過帶有key別名的criterion來查詢credential resolver中的credentials。
除此之外還有如下常用CredentialResolver:
簽名是密碼學壹個證明數據完整性的手段。OpenSAML中提供了工具來對短信信息經行簽名以及驗證簽名。由於斷言的表現形式是壹種XML,所以其簽名也是基於XML簽名方法。
這裏先簡要介紹下XML文件的簽名方法,具體關於細節可以參見以下文章:
其大致流程為:
核實和驗證XML的簽名:
在OpenSAML中,每壹個實現 SignableXMLObject 接口的對象都可以被簽名。簽名的產生壹***分為4步:
在壹些情況下,OpenSAML會自動完成了簽名的的過程,比如在傳輸SAML消息時,詳見關於 HTTPRedirectDeflateEncoder 的內容。
在驗證簽名之前最好是判斷該消息是否被簽名:
驗證簽名的第壹步是判斷該簽名是否符合SAML簽名的標準聲明,也就是是否應用了XML的規範化算法:
然後再進行真正密碼學意義上的驗證簽名:
SignatureValidator 對象中被設置了 credential 對象,其中包含密鑰信息。
在OpenSAML中斷言信息需要加密處理,要求使用壹個對稱密鑰來來加密數據,同時用另外壹個而非對稱密鑰用來加密這個對稱密鑰。斷言的密文和密鑰的密文都會在ArtifactResponse體現出來。
Encrypter不光可以加密Assertion,Attribute和NameID等XMLObject都可以被加密。
keyInfoCredentialResolver用於獲得非對稱密碼要,該密鑰用於解密對稱密鑰;再使用對稱密鑰獲得數據。
更多關於SAML協議的是實現的內容,請參見本人編寫的壹系列教程文章,其介紹如何使用OpenSAML,歡迎閱讀指正: