Openssl

使用 xmlsec1 對 InCommon SAML 元數據的簽名驗證失敗

  • February 26, 2020

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-pemor引用它,也會以同樣的方式失敗--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) 然後,只需將嵌入證書與單獨下載的證書進行比較——它們應該匹配,以空格為模。請注意,可能會連結一個或其他證書,出於比較目的,您應該忽略它。

引用自:https://serverfault.com/questions/899768