none
Azure ADからの要求における署名検証について RRS feed

  • 質問

  • お世話になっております。

    掲題の件につきまして質問を行わせてください。

    現在、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);





    2019年8月19日 7:37

すべての返信

  • 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までお気軽にお問い合わせください。~

    2019年8月21日 8:50
    モデレータ
  • ご回答ありがとうございました。

    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);

    よろしくお願い致します。

    2019年8月22日 2:15
  • 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までお気軽にお問い合わせください。~

    2019年8月29日 7:21
    モデレータ