私は、アサーションの代わりに応答に署名してSAML 2.0を実装しようとしています。私はアサーションレベルで私の署名を受け入れる3つの既存ベンダーを持っていますが、新しいベンダーはプロトコル/応答レベルでそれを要求しています。私は約8時間にわたりグーグルとデバッグを行っており、私が間違っていることの有効な例は見つけられません。下の私のコードは、私がやっていることをはっきりと示しており、最後の10行ほどが私が実装した違い(if/else内)です。また、XMLで、SignatureValueとDigestValueが両方とも空であることに気付きました。誰かが私に明快なドキュメントを教えてもらえますか、それともopenSAMLを使って動作する応答シグネチャの例ですか?この時点で、どんな助けにも感謝しています。openSAMLを使用した署名応答
Assertion assertion = OpenSamlHelper.CreateSamlAssertion(
issuer.trim(), recipient.trim(), domain.trim(), subject.trim(),
attributes);
//
// Sign
//
Credential signingCredential = getSigningCredential(keystore, storetype, storepass, alias, keypass);
Signature signature = (Signature) Configuration.getBuilderFactory()
.getBuilder(Signature.DEFAULT_ELEMENT_NAME)
.buildObject(Signature.DEFAULT_ELEMENT_NAME);
signature.setSigningCredential(signingCredential);
signature.setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1);
signature.setCanonicalizationAlgorithm(SignatureConstants.ALGO_ID_C14N_EXCL_OMIT_COMMENTS);
SecurityConfiguration secConfiguration = Configuration.getGlobalSecurityConfiguration();
NamedKeyInfoGeneratorManager namedKeyInfoGeneratorManager = secConfiguration.getKeyInfoGeneratorManager();
KeyInfoGeneratorManager keyInfoGeneratorManager = namedKeyInfoGeneratorManager.getDefaultManager();
KeyInfoGeneratorFactory keyInfoGeneratorFactory = keyInfoGeneratorManager.getFactory(signingCredential);
KeyInfoGenerator keyInfoGenerator = keyInfoGeneratorFactory.newInstance();
KeyInfo keyInfo = null;
try {
keyInfo = keyInfoGenerator.generate(signingCredential);
} catch (Exception e) {
logger.error(e);
}
signature.setKeyInfo(keyInfo);
String saml = "";
try {
MarshallerFactory marshallerFactory = Configuration.getMarshallerFactory();
if (signatureType == SignatureType.Response) {
response.setSignature(signature);
marshallerFactory.getMarshaller(response).marshall(response);
}
if (signatureType == SignatureType.Assertion) {
assertion.setSignature(signature);
marshallerFactory.getMarshaller(assertion).marshall(assertion);
}
Signer.signObject(signature);
UPDATE:私は上記のコードで取得したXMLは、以下のように、signatureValueまたはダイジェスト値が含まれていない..
<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="#_651cc837-e890-46c7-9cf9-646ffd38aaad">
<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#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="xs"/>
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue/>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue/>
Signer.signObject(署名)を移動させた後、アサーションはレスポンスに取り付けた後のポイントに、私は、次のXMLを受け取る。..
<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="#_273e38e9-3b51-4845-8b8b-f0970e3e9bab">
<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#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="xs"/>
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>UlVtsjSAvtjOLMbw+HUX9n7FtxM=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
jM7GxZ77VBHuAatMXLx14s0ExOmmfDpBhCpF8OKV4F3C1BiRutM41aTH25yhgSn+6l4TkK6kEDbFOYI6isvJUhtdVgH4E1xJl0DFfvPJphTF096acvJrLPehpsFd2Ab6sARuV1sbg/gwNFzvlHJWgit5NxHNuFN1qcv3vuhvQ83fOfxxuyLyJrEjpqvbRzwWepHiuTVHlNObrUvjVxEc7AUKPtwTqGlA6y3SdzIDwjN/LsB1V6PWhiMZsbxJx3LUuk5UECOYmRhKQifZWdOdvHoWBq05J54I6RvAplNDTfRBr4AM+tfIz3OXpN6OpKdSC43HRg9LO9bXprui+4CvrQ==
</ds:SignatureValue>
を追加した後、私はこの明日再現しようとするつもりです。あなたはここに何を返そうとしていますか?上記のコードはアサーションの権利に署名しますが、レスポンスには署名しませんか? –