使用 xmlsec1 對 InCommon SAML 元數據的簽名驗證失敗
InCommon Federation提供 IdP 和 SP 元數據。他們的刷新策略建議經常檢查元數據聚合以使用最新版本。他們強烈建議 InCommon SP至少每天刷新和驗證元數據。
按照元數據消費頁面上提供的說明,我下載了一個聚合併獲得了元數據簽名證書的真實副本。
然後,我將“驗證下載的元數據上的 XML 簽名”。這就是我遇到問題的地方。我可以使用嵌入式 x509 證書驗證下載的元數據,但無法使用單獨下載的元數據簽名證書進行驗證。
我從 InCommon 下載了兩個文件:
- xml:
InCommon-metadata-idp-only.xml
- 私人簽名密鑰:
inc-md-cert.pem
我想我應該能夠執行命令:
# xmlsec1 --verify \ --id-attr:ID urn:oasis:names:tc:SAML:2.0:metadata:EntitiesDescriptor \ --privkey-pem ./inc-md-cert.pem \ ./InCommon-metadata-idp-only.xml
無法顯示“無法從 ./inc-md-cert.pem 載入私鑰”。我可以使用
openssl x509 -text -in ./inc-md-cert.pem
. (而且它是可讀的,這是正確的路徑。)如果我用--privkey-pem
or引用它,也會以同樣的方式失敗--pubkey-pem
。現在,如果我改用
--pubkey-cert-pem ./inc-md-cert.pem
它,它執行沒有錯誤,表明OK SignedInfo References (ok/all): 1/1
.但是不,它顯然忽略了我的私人簽名密鑰,只是根據嵌入在 metadata.xml 文件中的密鑰進行驗證。(我可以完全刪除
--pubkey-cert-pem
參數,並且使用嵌入式 x509 證書驗證仍然有效。更新
鑑於提供的簽名文件是自簽名的(由組織),我嘗試將自己添加為受信任的證書。例如,如果您嘗試使用 openssl 進行基本驗證,請比較:
# openssl verify ./inc-md-cert.pem error 18 at 9 depth lookup:self signed certificate # openssl verify -CAfile ./inc-md-cert.pem ./inc-md-cert.pem ./inc-md-cert.pem: OK
那麼如果這是問題呢?所以我嘗試添加
--trusted-pem
選項# xmlsec1 --verify \ --id-attr:ID urn:oasis:names:tc:SAML:2.0:metadata:EntitiesDescriptor \ --privkey-pem ./inc-md-cert.pem \ --trusted-pem ./inc-md-cert.pem \ ./InCommon-metadata-idp-only.xml func=xmlSecOpenSSLAppKeyLoadBIO:file=app.c:line=263: obj=unknown:subj=PEM_read_bio_PrivateKey and PEM_read_bio_PUBKEY: error=4:crypto library function failed: func=xmlSecOpenSSLAppKeyLoad:file=app.c:line=153: obj=unknown:subj=xmlSecOpenSSLAppKeyLoadBIO: error=1:xmlsec library function failed: filename=/tmp/inc-md-cert.pem;errno=2 func=xmlSecAppCryptoSimpleKeysMngrKeyAndCertsLoad:file=crypto.c:line=118: obj=unknown:subj=xmlSecCryptoAppKeyLoad: error=1:xmlsec library function failed:uri=./inc-md-cert.pem Error: failed to load public key from "./inc-md-cert.pem". Error: keys manager creation failed
我認為這是我的基本錯誤,因為這並不難:如何使用外部密鑰(由 InCommon 提供)來驗證元數據文件的簽名(由 InCommon 提供)?
一種解決方案,雖然感覺有點不滿意:
a)使用嵌入式證書驗證 InCommon 元數據文件。
# xmlsec1 --verify --id-attr:ID \ urn:oasis:names:tc:SAML:2.0:metadata:EntitiesDescriptor \ ./InCommon-metadata-idp-only.xml OK SignedInfo References (ok/all): 1/1 Manifests References (ok/all): 0/0
b) 然後,只需將嵌入證書與單獨下載的證書進行比較——它們應該匹配,以空格為模。請注意,可能會連結一個或其他證書,出於比較目的,您應該忽略它。