我们可以将签名算法设置如下:
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>
更新:Vladimír的回答有效。但是,该解决方案似乎线程不安全?在我的应用程序中,我们只引导opensaml一次,然后由具有不同配置的不同线程使用 - 如不同的签名算法。有没有办法以线程安全的方式执行此操作?
更新: Shibboleth IdP使用opensaml,根据Shibboleth IdP Wiki,这是一个全局配置。因此,无论IdP还是SP方面,如果opensaml用于处理SAML消息,则应该存在此限制。以下是该文章的摘录:
更改IdP签名/摘要算法及相关设置 目前是全球运营。该算法将针对所有人进行更改 与之互动的依赖方。在你之前不要做这个改变 已经验证所有依赖方都可以使用 您选择的新算法
更新:终于找到了完成这项工作的方法。已添加它作为答案。
答案 0 :(得分:7)
在应用程序初始化期间尝试以下调用:
BasicSecurityConfiguration config = (BasicSecurityConfiguration) Configuration.getGlobalSecurityConfiguration();
config.setSignatureReferenceDigestMethod(SignatureConstants.ALGO_ID_DIGEST_SHA256);
答案 1 :(得分:7)
这可以通过在设置签名[1]后修改签名的内容引用来安全地完成。
e.g。
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardDidShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardDidHide:", name: UIKeyboardDidHideNotification, object: nil)
...
func keyboardDidHide (notification: NSNotification) {
self.tableView.contentInset = UIEdgeInsetsZero
self.tableView.scrollIndicatorInsets = UIEdgeInsetsZero
}
[1] https://lists.internet2.edu/sympa/arc/mace-opensaml-users/2007-10/msg00003.html
答案 2 :(得分:0)
通过OpenSAML源,另一种方法是扩展DefaultBootstrap和DefaultSecurityConfigurationBootstrap类,因此这个配置可用于所有SAML实现。
然后可以使用CustomSamlBootstrap类代替DefaultSamlBootstrap来初始化您的系统。
例如:
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(签名签名,Credential signingCredential, SecurityConfiguration config,String keyInfoGenName)方法。
答案 3 :(得分:0)
我这样做的方法是创建自己的类TenantAwareSecurityConfiguration来实现SecurityConfiguration接口。它具有一个属性委托,该属性委托最终被分配给BasicSecurityConfiguration的默认实现。
我在一个单独的bean中进行了此操作,该bean在初始实例化发生后被调用。在此bean中,我初始化了自己的类,在构造函数中,传递了默认的BasicSecurityConfiguration实例。
现在在我的课堂上,我重写了两种获取摘要和签名算法的方法。对于其余方法,我只将调用委派给基础委托。
这样,您可以自己实现这些方法。就我而言,我需要获取特定于租户的算法,以便这些方法从租户属性中返回特定于租户的算法。
很快就会发布代码段。