質問者
Azure ADからの要求における署名検証について

質問
-
お世話になっております。
掲題の件につきまして質問を行わせてください。
現在、Azure ADとのSAML連携をJAVA(struts2)で構築しており、
その中でAzure ADからのログアウト要求(SAMLRequest)を受けた際のSP側の署名検証でお伺いしたい事があります。
現状、署名をパラメータから取得を行い、Signature(java.security.Signature)クラスで検証を行っていますが、
常にfalseとなってしまっている状態です。
※公開鍵が正しくメタデータから取得できていることはログイン時のテストで確認済み
Signatureクラスでupdateを行う際はクエリストリングのバイトを設定していますが、
こちらで合っていますでしょうか?(何を使用すべきでしょうか?)
検証時の過去事例や解決策等ございましたらご教授頂けると幸いです。
String paramSignature = request.getParameter("Signature"); String paramSigAlg = request.getParameter("SigAlg"); String relayState = request.getParameter("RelayState"); String query = "SAMLRequest" + "=" + URLEncoder.encode(encodedMessage, UTF8); query += relayState == null ? "" : "&RelayState=" + URLEncoder.encode(relayState, UTF8); query += "&SigAlg=" + URLEncoder.encode(paramSigAlg, UTF8); org.apache.xml.security.Init.init(); java.security.Signature sig = java.security.Signature.getInstance("SHA256withRSA"); sig.initVerify(cre.getPublicKey()); sig.update(query.getBytes()); result = sig.verify(signatureBytes);
- 編集済み hiroaki deto 2019年8月20日 9:12
すべての返信
-
hiroaki detoさん、こんにちは。フォーラムオペレーターのHarukaです。
MSDNフォーラムにご投稿くださいましてありがとうございます。
署名検証について詳しくないが、ご提示したコードは署名オブジェクトにクエリ文字列バイトを追加するステップを見逃しているようです。
検証のために署名オブジェクトを初期化する前にコードを追加してください:
sig.initSign(cer .getPrivate()); sig.update(query.getBytes()); signatureBytes = sig.sign();
https://www.tutorialspoint.com/java_cryptography/java_cryptography_verifying_signature.htmまでをご参照いただければと思います。
どうぞよろしくお願いします。
MSDN/ TechNet Community Support Haruka
ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~ -
ご回答ありがとうございました。
Signatureの使い方については再度確認してみたいと思います。
その上で2点ほど確認させてください。
①Azure ADからのSPへのログアウト要求のSignatureは検証すべきで合っていますでしょうか?
②Azure ADからのSignatureを検証する際に 署名オブジェクトにクエリ文字列バイトを追加する必要があるとの事ですがこちらのクエリが指すのはSAMLRequestとRelayStateとアルゴリズムのバイト数で問題ないでしょうか?
String query = "SAMLRequest" + "=" + URLEncoder.encode(encodedMessage, UTF8); query += relayState == null ? "" : "&RelayState=" + URLEncoder.encode(relayState, UTF8); query += "&SigAlg=" + URLEncoder.encode(paramSigAlg, UTF8);
よろしくお願い致します。
-
hiroaki detoさん、こんにちは。フォーラムオペレーターのHarukaです。
ご返信いただきありがとうございます。
ご使用しているアルゴリズムjava.security.Signature sig = java.security.Signature.getInstance("SHA256withRSA");は正しくないと思われますが、
java.security.Signature sig = java.security.Signature.getInstance("HS256");
を試していただければと思います。
どうぞよろしくお願いします。
MSDN/ TechNet Community Support Haruka
ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~