xmlsec1 を使用した InCommon SAML メタデータの署名検証が失敗する

xmlsec1 を使用した InCommon SAML メタデータの署名検証が失敗する

共通連合IdPとSPのメタデータを提供します。更新ポリシーでは、メタデータ集約最新バージョンを使用してください。InCommon SPを強く推奨しますメタデータの更新と検証少なくとも毎日。

提供されている指示に従ってメタデータの消費ページで、集約をダウンロードし、メタデータ署名証明書の正規のコピーを取得します。

次に、「ダウンロードしたメタデータのXML署名を検証する」という項目があります。ここで問題が発生しています。ダウンロードしたメタデータを検証することはできますが、埋め込まれたx509証明書ただし、別途ダウンロードしたメタデータ署名証明書を使用して検証することはできません。

InCommon からダウンロードした 2 つのファイルがあります。

  • 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--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 提供) の署名を検証するにはどうすればよいでしょうか?

答え1

少し不満ではありますが、解決策が 1 つあります。

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) 次に、埋め込まれた証明書と個別にダウンロードした証明書を比較します。空白を除いて一致するはずです。どちらかの証明書が連鎖している可能性がありますが、比較の目的では無視してください。

答え2

かなり苦労した後、コマンドラインに追加してみるとよいことがわかりました--enabled-key-data。たとえば、次のようになります。

--enabled-key-data rsa または --enabled-key-data x509

どちらもうまくいくはずです。また、

xmlsec1 --list-key-data選択できるものを確認します。

あなたの場合は、

xmlsec1 --verify \
  --enabled-key-data rsa \
  --id-attr:ID urn:oasis:names:tc:SAML:2.0:metadata:EntitiesDescriptor \
  --pubkey-cert-pem ./inc-md-cert.pem \
  ./InCommon-metadata-idp-only.xml

あなたがしたいことをすればいいのです。

関連情報