В описании формата указано: Атрибут URI элемента Reference должен иметь пустое значение.
Если я делаю в FinalPayment элементы
Name_Security = envelope.createName("Signature", "ds", "http://www.w3.org/2000/09/xmldsig#");
SOAPElement SOAP_Signature = SOAP_FinalPayment.addChildElement (Name_Security);
SOAPElement SOAP_SignetInfo = SOAP_Signature.addChildElement("SignetInfo", "ds");
SOAP_SignetInfo.addChildElement("CanonicalizationMethod","ds").addAttribute(new QName("Algorithm"), "http://www.w3.org/2001/10/xml-exc-c14n#");
SOAP_SignetInfo.addChildElement("SignatureMethod", "ds").addAttribute(new QName("Algorithm"), "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411");
SOAPElement SOAP_SignetInfo_Referens = SOAP_SignetInfo.addChildElement("Referens", "ds");
SOAPElement SOAP_Transforms = SOAP_SignetInfo_Referens.addChildElement(new QName("http://www.w3.org/2000/09/xmldsig#", "Transforms", "ds"));
QName Name_Transform = new QName("http://www.w3.org/2000/09/xmldsig#", "Transform", "ds");
SOAP_Transforms.addChildElement(Name_Transform).addAttribute(new QName("Algorithm"), "http://www.w3.org/2000/09/xmldsig#enveloped-signature");
SOAP_Transforms.addChildElement(Name_Transform).addAttribute(new QName("Algorithm"), "http://www.w3.org/2001/10/xml-exc-c14n#");
SOAPElement SOAP_DigestMethod = SOAP_SignetInfo_Referens.addChildElement(new QName("http://www.w3.org/2000/09/xmldsig#","DigestMethod", "ds"));
SOAP_DigestMethod.addAttribute(new QName("Algorithm"), "http://www.w3.org/2001/04/xmldsig-more#gostr3411");
SOAP_SignetInfo_Referens.addAttribute(new QName("URI"), "");
// Подпись платежа
Document SOAP_FinalPayment_doc = SOAP_FinalPayment.getOwnerDocument();
com.sun.org.apache.xml.internal.security.Init.init();
// Инициализация JCP XML провайдера.
if(!JCPXMLDSigInit.isInitialized()) {
JCPXMLDSigInit.init();
}
// Инициализация ключевого контейнера.
KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME);
keyStore.load(null, null);
// Получение ключа и сертификата.
PrivateKey privateKey = jsp.Get_PrivateKey();
X509Certificate cert = jsp.Get_sert();
// Подписываемый элемент.
Element token = SOAP_FinalPayment_doc.getDocumentElement();//header.getSecurityHeader();
/*** Подпись данных ***/
// Загрузка провайдера.
Provider xmlDSigProvider = new ru.CryptoPro.JCPxml.dsig.internal.dom.XMLDSigRI();
// Преобразования над документом.
final Transforms transforms = new Transforms(SOAP_FinalPayment_doc);
transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
transforms.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", xmlDSigProvider);
// Преобразования над блоком SignedInfo
List<Transform> transformList = new ArrayList<Transform>();
Transform transformC14N =
fac.newTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS, (XMLStructure) null);
transformList.add(transformC14N);
// Ссылка на подписываемые данные.
Reference ref = fac.newReference("#FinalPayment",
fac.newDigestMethod("http://www.w3.org/2001/04/xmldsig-more#gostr3411", null),
transformList, null, null);
// Блок SignedInfo.
SignedInfo si = fac.newSignedInfo( fac.newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE,
(C14NMethodParameterSpec) null),
fac.newSignatureMethod("http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411", null),
Collections.singletonList(ref));
// Блок KeyInfo.
KeyInfoFactory kif = fac.getKeyInfoFactory();
X509Data x509d = kif.newX509Data(Collections.singletonList(cert));
KeyInfo ki = kif.newKeyInfo(Collections.singletonList(x509d));
// Подпись данных.
javax.xml.crypto.dsig.XMLSignature sig = fac.newXMLSignature(si, ki);
DOMSignContext signContext = new DOMSignContext(privateKey, token);
sig.sign(signContext);
Мне после подписывания блок Signature дописывается в конец SOAP сообщения за пределами SOAP-ENV:Envelope получить данные тегов DigestValue, SignatureValue и X509Certificate я могу. И потом стираю этот блок. Мне кажется, что это неправильно. Как можно сразу положить подпись в нужное место. Бьюсь уже неделю, т.к. впервые столкнулся с SOAP сервисами такой задачей.