5

署名アルゴリズムを次のように設定できます。

signature.setSignatureAlgorithm("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");

DigestMethod アルゴリズムをそのように設定する方法を見つけようとしています。OpenSAML API 経由で可能ですか? どんな入力でも大歓迎です。

更新: 明確にするためにサンプルの署名を追加します。この質問が関係しているのは、その中の DigestMethod 要素です。

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>
      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
      <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
      <ds:Reference URI="#_884D49DAD03AD60748547F8322C11AA0">
        <ds:Transforms>
          <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
          <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        </ds:Transforms>
        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
        <ds:DigestValue>...</ds:DigestValue>
      </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue>...</ds:SignatureValue>
    <ds:KeyInfo>
      <ds:KeyName>...</ds:KeyName>
    </ds:KeyInfo>
  </ds:Signature>

更新:ウラジミールの答えは機能します。しかし、その解決策はスレッドセーフではないようですか? 私のアプリケーションでは、opensaml を 1 回だけブートストラップし、異なる署名アルゴリズムのように、異なる構成の異なるスレッドで使用します。スレッドセーフな方法でこれを行う方法はありますか?

更新: Shibboleth IdP は opensaml を使用します。Shibboleth IdP Wikiによると、これは現在グローバル構成です。そのため、IdP または SP 側に関係なく、opensaml を使用して SAML メッセージを処理する場合、この制限が存在するはずです。以下はその記事からの抜粋です。

IdP 署名/ダイジェスト アルゴリズムおよび関連する設定の変更は、現在グローバルな操作です。アルゴリズムは、対話するすべての依拠当事者に対して変更されます。選択した新しいアルゴリズムを使用してすべての依拠当事者が応答を処理できることを確認するまで、この変更を行わないでください。

更新: 最後に、これを行う方法を見つけました。回答として追加しました。

4

4 に答える 4

9

これは、署名を設定した後に署名のコンテンツ参照を変更することにより、スレッドセーフに実行できます [1]。

例えば

authnRequest.setSignature(signature);

((SAMLObjectContentReference)signature.getContentReferences().get(0))
           .setDigestAlgorithm(EncryptionConstants.ALGO_ID_DIGEST_SHA256);

[1] https://lists.internet2.edu/sympa/arc/mace-opensaml-users/2007-10/msg00003.html

于 2015-07-10T14:49:14.810 に答える
7

アプリケーションの初期化中のどこかで、次の呼び出しを試してください。

  BasicSecurityConfiguration config = (BasicSecurityConfiguration) Configuration.getGlobalSecurityConfiguration();
  config.setSignatureReferenceDigestMethod(SignatureConstants.ALGO_ID_DIGEST_SHA256);
于 2014-07-23T18:14:02.287 に答える
0

OpenSAML ソースに目を通すと、DefaultBootstrap クラスと DefaultSecurityConfigurationBootstrap クラスを拡張する別の方法が考えられるため、この構成をすべての SAML 実装で使用できます。

その後、DefaultSamlBootstrap の代わりに CustomSamlBootstrap クラスを使用して、システムを初期化できます。

例えば:

import org.opensaml.Configuration;
import org.opensaml.DefaultBootstrap;
import org.opensaml.xml.ConfigurationException;    
public class CustomSamlBootstrap extends DefaultBootstrap {
    public static synchronized void bootstrap() throws ConfigurationException {

        initializeXMLSecurity();

        initializeXMLTooling();

        initializeArtifactBuilderFactories();

        initializeGlobalSecurityConfiguration();

        initializeParserPool();

        initializeESAPI();

        initializeHttpClient();
    }

    protected static void initializeGlobalSecurityConfiguration() {
        Configuration.setGlobalSecurityConfiguration(YourCustomSecurityConfigurationBootstrap.buildDefaultConfig());
    }

}

import org.opensaml.xml.security.BasicSecurityConfiguration;
import org.opensaml.xml.security.DefaultSecurityConfigurationBootstrap;
import org.opensaml.xml.signature.SignatureConstants;


public class YourCustomSecurityConfigurationBootstrap extends DefaultSecurityConfigurationBootstrap {
    public static BasicSecurityConfiguration buildDefaultConfig() {
        BasicSecurityConfiguration config = new BasicSecurityConfiguration();

        populateSignatureParams(config);
        populateEncryptionParams(config);
        populateKeyInfoCredentialResolverParams(config);
        populateKeyInfoGeneratorManager(config);
        populateKeyParams(config);

        return config;
    }

    /**
     * Populate signature-related parameters.
     *
     * @param config the security configuration to populate
     */
    protected static void populateSignatureParams(BasicSecurityConfiguration config) {
        // Asymmetric key algorithms
        config.registerSignatureAlgorithmURI("RSA", SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA256);
        config.registerSignatureAlgorithmURI("DSA", SignatureConstants.ALGO_ID_SIGNATURE_DSA);
        config.registerSignatureAlgorithmURI("EC", SignatureConstants.ALGO_ID_SIGNATURE_ECDSA_SHA1);

        // HMAC algorithms
        config.registerSignatureAlgorithmURI("AES", SignatureConstants.ALGO_ID_MAC_HMAC_SHA1);
        config.registerSignatureAlgorithmURI("DESede", SignatureConstants.ALGO_ID_MAC_HMAC_SHA1);

        // Other signature-related params
        config.setSignatureCanonicalizationAlgorithm(SignatureConstants.ALGO_ID_C14N_EXCL_OMIT_COMMENTS);
        config.setSignatureHMACOutputLength(null);
        config.setSignatureReferenceDigestMethod(SignatureConstants.ALGO_ID_DIGEST_SHA1);
    }

}

編集:スレッドごとに異なるセキュリティ構成を使用したいことがわかりました。

このために、BaseSAML2MessageEncoder の最適なサブクラスを拡張して、signMessage 関数をオーバーライドすることができます。次に、必要に応じて YourCustomSecurityConfigurationBootstrap を SecurityHelper.prepareSignatureParams(Signature signature, Credential signingCredential, SecurityConfiguration config, String keyInfoGenName) メソッドに渡します。

于 2015-12-14T17:25:32.083 に答える