我有一个问题,让Spring SAML集成为我的IDP生成正确的元数据文件。我被颁发了新的SHA256 SSL证书。我已经完成了创建适当密钥库的所有步骤,并设置了Spring Security配置文件。我几乎是98%的方式,但在生成的元数据文件中缺少一个东西,我一辈子也弄不清楚为什么它没有设置。
以下是MetadataGeneratorFilter的ExtendedMetadata配置:
<bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.MetadataGenerator">
<property name="entityId" value="urn:myentityidhere"/>
<property name="entityBaseURL" value="https://${saml.url}"/>
<property name="extendedMetadata">
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
<property name="signMetadata" value="true"/>
<property name="signingAlgorithm" value="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<property name="alias" value="ceo"/>
<property name="signingKey" value="${saml.sp.alias}"/>
<property name="encryptionKey" value="${saml.sp.alias}"/>
</bean>
</property>
</bean>
</constructor-arg>
当我运行我的应用程序并转到/saml/metadata URI以使Spring生成我需要发送到我的IdP的元数据文件时,SHA256 algo在SignatureMethod上被正确设置,但是子DigestMethod标记的算法值仍然被设置为SHA1,当我需要将它与DigestValue一起设置为SHA256值而不是SHA1值时。
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference URI="#urn_myentityidhere">
<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>xxxxxxx</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
有人能指导我如何/我需要设置什么,以获得DigestMethod算法值设置为256吗?我想,由于它是SignedInfo标记的子标记,它将从Extendedmetadata配置继承signingAlgorithm值,但可惜它不是。
如有任何帮助,将不胜感激。非常感谢。
解决方案--万一有人在意
所以,经过一天的挖掘,我决定自己来实现它。我通过添加字段digestMethodAlgorithm扩展了ExtendedMetadata类,并添加了适当的getter/setter:
/**
* Algorithm used for creation of digest method of this entity. At the moment only used for metadata signatures.
* Only valid for local entities.
*/
private String digestMethodAlgorithm;
/**
* Returns digest method algorithm value
* @return String
*/
public String getDigestMethodAlgorithm()
{
return digestMethodAlgorithm;
}
/**
* Sets the digest method algorithm to use when signing the SAML messages.
* This can be used, for example, when a strong algorithm is required (e.g. SHA 256 instead of SHA 128).
* If this property is null, then the {@link org.opensaml.xml.Configuration} default algorithm will be used instead.
*
* Value only applies to local entities.
*
* At the moment the value is only used for signatures on metadata.
*
* Typical values are:
* http://www.w3.org/2001/04/xmlenc#sha1
* http://www.w3.org/2001/04/xmlenc#sha256
* http://www.w3.org/2001/04/xmlenc#sha384
* http://www.w3.org/2001/04/xmlenc#sha512
* http://www.w3.org/2001/04/xmlenc#ripemd160
*
* @param digestMethodAlgorithm The new digest method algorithm to use
* @see org.opensaml.xml.signature.SignatureConstants
*/
public void setDigestMethodAlgorithm(String digestMethodAlgorithm)
{
this.digestMethodAlgorithm = digestMethodAlgorithm;
}
<bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.MetadataGenerator">
<property name="entityId" value="urn:myentityidhere"/>
<property name="entityBaseURL" value="https://${saml.url}"/>
<property name="extendedMetadata">
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
<property name="signMetadata" value="true"/>
<property name="signingAlgorithm" value="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<property name="digestMethodAlgorithm" value="http://www.w3.org/2001/04/xmlenc#sha256"/>
<property name="alias" value="ceo"/>
<property name="signingKey" value="${saml.sp.alias}"/>
<property name="encryptionKey" value="${saml.sp.alias}"/>
</bean>
</property>
</bean>
</constructor-arg>
Samlutil.GetMetadataAsString内部,第572行
...
String digestMethodAlgorithm = extendedMetadata.getDigestMethodAlgorithm();
element = SAMLUtil.marshallAndSignMessage(descriptor, credential, signingAlgorithm, digestMethodAlgorithm, keyGenerator);
...
在Samlutil.MarshallandSignMessage中,就在第437行之后,我添加/更改了以下内容:
...
BasicSecurityConfiguration secConfig = null;
if (digestMethodAlgorithm != null)
{
secConfig = (BasicSecurityConfiguration) Configuration.getGlobalSecurityConfiguration();
secConfig.setSignatureReferenceDigestMethod(digestMethodAlgorithm);
}
try {
SecurityHelper.prepareSignatureParams(signature, signingCredential, secConfig, keyInfoGenerator);
} catch (org.opensaml.xml.security.SecurityException e) {
throw new MessageEncodingException("Error preparing signature for signing", e);
}
...
我通过Gradle,spring-security-saml-1.0.0.release重新编译了整个Spring SAML核心包,将新的jar从build/libs目录复制到我的项目中,部署了webapp,将浏览器指向/SAML/metadata,并成功地获得了元数据文件,其中包含了正确的SHA256签名部分。
我将看看我能做些什么,让这个项目的git repopromise它,因为我不想失去这个能力,因为项目的未来版本。以前从未参与过这样的开源项目。
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference URI="#urn_myentityidhere">
<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/2001/04/xmlenc#sha256"/>
<ds:DigestValue>xxxxxx</ds:DigestValue>
</ds:Reference>
自从@VladimírSchäfer的回答之后,事情似乎发生了变化;它对我们的AD FS 2.0和SHA-256不起作用。我们必须添加一个额外的设置才能使其正常工作(参见下面的代码)。
问题似乎出现在OpenSAML的xmltooling库中,特别是org.opensaml.xml.security.basicSecurityConfiguration.getSignaturealgorithmuri(凭据)
方法--它不只是使用证书的签名算法(在我们的例子中是sha256withrsa
),而是获取证书的密钥,然后查看该密钥的算法,并使用注册URI的映射来查找签名URI。如果他们只有一个JCA签名算法到URI的映射,而不是密钥算法到URI,那就很好了。
解决方法是在Spring布线期间使用BasicSecurityConfiguration
注册正确的签名算法URI,覆盖http://www.w3.org/2000/09/XMLDSIG#rsa-sha1
中已经存在的(不希望的)URIhttp://www.w3.org/2001/04/XMLDSIG-more#rsa-sha256
。
我们还必须删除setSignatureReferenceDigestMethod()
调用,否则将元数据导入AD FS将失败。
import org.opensaml.Configuration;
import org.opensaml.xml.security.BasicSecurityConfiguration;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.security.saml.SAMLBootstrap;public class CustomSamlBootstrap extends SAMLBootstrap {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
super.postProcessBeanFactory(beanFactory);
BasicSecurityConfiguration config = (BasicSecurityConfiguration) Configuration.getGlobalSecurityConfiguration();
config.registerSignatureAlgorithmURI("RSA", "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");
}
}
签名算法描述如下: 1.将请求参数按参数名升序排序; 2.按请求参数名及参数值相互连接组成一个字符串:...; 3.将应用密钥分别添加到以上请求参数串的头部和尾部:<请求参数字符串>; 4.对该字符串进行MD5(全部大写),MD5后的字符串即是这些请求参数对应的签名; 5.该签名值使用sign参数一起和其它请求参数一起发送给服务开放平台。 参数示例 { "name": "file.uplo
签名作用 问题 如何分辨出是否贵企业的请求? 如何分辨出请求消息的内容是否被篡改? 解决方法 通过数字签名就可以解决上述的问题。具体为:约定sign_key作为密钥,该sign_key仅贵企业和滴滴知道,在传输中不可见,用于参与签名计算。 企业在发送请求前,将消息内容与sign_key按照滴滴提供的签名算法计算出签名。滴滴在收到请求时,也按相同算法计算出签名。 如果为同一签名,则可信任来源为贵企业
算法描述 生成签名的时候,将颁发的sign_key加入到传递的参数中,参与加密 传递的参数(包含sign_key)按照参数名升序排序,然后,以&形式连接(类似格式为a=xxx&b=xxx&c=xxx...),生成小写的md5串 生成sign后,sign和其他参数一起传递,对于中文在传递的过程中,需要进行urlencode,加密的时候不进行urlencode(如是以POST方法json格式传参不需要
修订记录 2018-09-19:合成开放平台的说明到本地文档。 签名生成总体说明 本文档仅适用于QQ轻游戏后台openapi接口的签名生成,由于是通用说明,本文中仅以/openapi/apollo_verify_openid_openkey的签名生成作为示例。 签名值sig是将请求源串以及密钥根据一定签名方法生成的签名值,用来提高传输过程参数的防篡改性。 签名值的生成共有3个步骤:构造源串,构造
问题内容: 我正在尝试使用HMAC-SHA256算法创建签名,这是我的代码。我正在使用美国ASCII编码。 我从上面的代码中得到的结果是: 这与Wiki中显示的相同 除外 的。 如果我做对了所有事情,或者可能可以改善我的代码,我正在寻找想法/意见。 问题答案: 0x仅表示其后的字符表示一个十六进制字符串。 因此,0x只是为了阐明输出的格式,而无需担心它。
我可以从账单和运输中取消设置字段,但为什么我不能从其他字段部分取消设置字段。我在这些字段上添加了一个条件。也许我用错了元键。 使用此插件创建字段签出字段编辑器