KeyCloakをバージョンアップして、SAMLを使用してシングルサインオンを行おうとしたら、「Validation Error of XML Signature」と表示されました。この原因について調査及び研究し、その成果をまとめています。
The SSO login attempt failed.
Validation Error of XML Signature - SAML Response
原因
以前使っていた、KeyCloakのバージョン8とバージョン21のSAMLのXMLを比較したところ、バージョン8についてはKeyValueの値が含まれているのに対して、バージョン21には含まれていないことが分かりました。どうやらこのKeyValueの値が含まれていない事によりエラーになっていたようです。
KeyCloakのバージョン8とバージョン21のSAMLのXMLの比較
色々と調べてみて確証はありませんが、KeyCloakではRSAのKeyValue情報はSAMLのXMLに基本的には含めないように仕様を変更したのではないかと思われます。含めるようにする設定もあるのかもしれませんが、このコンテンツではその方法については調査していません。
参考サイト
【GitHub】SAML Signature metadata loses certificate info #17549
2023年3月10日の投稿です。
◆Describe the bugの機械翻訳
SAML IdP で signSpMetadata オプションが有効になっている場合、SAML SP メタデータ・エンド ポイントは、鍵の材料が X.509 証明書として渡された場合でも、公開鍵を常に RSAKeyValue 要素として公開する。これは、発行者のような重要な情報が失われ、メタデータの署名を検証する際に信頼の連鎖を確立する能力に支障をきたすことを意味する。
注目すべきは、この動作にも一貫性がないことだ: wantAssertionsEncryptedを有効にすると、SPSSODescriptor要素内でX509Dataとして、つまり証明書を保持したまま、同じ鍵マテリアルが提示される。
この問題はKeycloak 18で確認され、現在のKeycloak 21でも再現されましたが、Keycloak 12でメタデータ署名機能が追加されて以降も存在するようです(コミット10077b1)。
DeepL.com(無料版)で翻訳しました。
ソースのコメントに下記のように記述されています。
//No need to expose pubkey separately if cert is available
(証明書が利用可能な場合、公開鍵を個別に公開する必要はありません)
下記の研究日誌の内容のことを指しているのではないかと思います(推測)。
参考
rmartincさんが「ありがとう@dkobras! 私も最初は保守的になることを考えていました。 しかし、たどるコードパスに応じて動作がかなり不安定であることを確認した後(KeyInfoにKeyValueのみが追加される場合もあれば、KeyValueとX509Dataの両方が追加される場合もあります)、常に同じ適切なことを行う方が良いと思いました。」と言っています。
【GitHub】SAML signature KeyValue is missing, can it be added? #20750
KeyCloakのGitHubに寄せられている質問で、KeyValueが欠けているけど、どうやって追加するのが質問しています。ただ、その質問には回答はされていません。T.T
2023年6月3日の質問です。
【エンジニアによる投資】[Ubuntu20.04] KeyCloakでSAML SSOテスト
KeyCloakのバージョン17を使用している様子で、そのXMLにはKeyValueの値が含まれているように見えます。2022年2月24日の寄稿です。
【Qiita】Keycloakを使ってSAMLを理解する#1
【Qiita】Keycloakを使ってSAMLを理解する#2
このブログは、KeyCloak8.0.1ということで、KeyValueが含まれている。2020年1月に投稿されているので、そのあたりではKeyCloak8は普通にダウンロードできたという事だろうと推測する。
◆機械翻訳
このリリースより前は、SAML SP メタデータには、署名と暗号化の両方に使用する同じキーが含まれていました。 このバージョンの Keycloak 以降、SP メタデータでの暗号化使用に、暗号化を目的としたレルム キーのみが含まれています。 各暗号化キー記述子に対して、それが使用されることになるアルゴリズムも指定します。 次の表は、サポートされている XML-Enc アルゴリズムと Keycloak レルム キーへのマッピングを示しています。 詳細については、アップグレード ガイドを参照してください。
DeepL.com(無料版)で翻訳しました。