Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,977 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 708 раз в 669 постах
|
1. Я взял ваш пример подписания с форума, добавил его в Eclipse Indigo (windows 7, 32b.); ранее у меня был сгенерирован клиент для обращения к сервису. В JDK 1.7.0_02 установлен JCP (к нему - commons-logging-1.1.1, xalan-2.7.1, xmlsec-1.5.0 и serializer-2.7.1, + все библиотеки wss4j 1.6.3), имеются ключ и сертификат для подписи. XML-сообщение Код:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body Id="body">
<ns2:AssetReturn xmlns="http://smev.gosuslugi.ru/rev111111" xmlns:ns2="http://output.azws.iteco.ru" xmlns:ns3="http://www.w3.org/2004/08/xop/include">
<Message>
<Sender/>
<Recipient>
<Code>?</Code>
<Name>?</Name>
</Recipient>
<TypeCode>GSRV</TypeCode>
<Status>RESULT</Status>
<Date>2012-05-24T13:55:56.915+04:00</Date>
<TestMsg>?</TestMsg>
</Message>
<MessageData>
<AppData>
<ns2:XMLData>testmsg</ns2:XMLData>
</AppData>
</MessageData>
</ns2:AssetReturn>
</S:Body>
</S:Envelope>
читается из файла (utf-8), подписывается с помощью wss4j 1.6.3. Я использовал только Код:
...
Transform transformC14N = fac.newTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS, (XMLStructure) null);
transformList.add(transformC14N);
...
Reference ref = fac.newReference("#body", fac.newDigestMethod("http://www.w3.org/2001/04/xmldsig-more#gostr3411", null), transformList, null,null );
...
Проверка выполняется: А) verifySecuredMessage; Б) передача сообщения - Код:
...
String msg = org.apache.ws.security.util.XMLUtils.PrettyDocumentToString(doc);
VerifySignatureRequestType vsrType = new VerifySignatureRequestType(msg, false, "http://smev.gosuslugi.ru/actors/smev");
VerifySignatureResponseType result = st.verifySignature(vsrType);
...
На счет CSP лучше написать в соответствующем разделе, но на работу JCP он влиять не должен. 2. Пробы показали, что transformC14N нужно указывать, так как иначе в п. 1 у меня, например, выдается ошибка сервиса. 3. Есть ли у вас возможность сделать пример обращения к сервису не через сервер, а напрямую? Попробуйте сделать такой пример в Eclipse. Проблем, по идее, не должно быть, если вы устанавливали JCP 1.0.52 по инструкции (install <JRE> ...), срок лицензии не истек и ключ предназначен для подписи ЭЦП. Код примера: Код:
com.sun.org.apache.xml.internal.security.Init.init();
SpecUtility.initJCP();
KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME);
keyStore.load(null, null);
PrivateKey privateKey = (PrivateKey)keyStore.getKey(SpecUtility.DEFAULT_ALIAS, SpecUtility.DEFAULT_PASSWORD);
X509Certificate cert = (X509Certificate) keyStore.getCertificate(SpecUtility.DEFAULT_ALIAS);
MessageFactory mf = MessageFactory.newInstance();
SOAPMessage message = mf.createMessage();
SOAPPart soapPart = message.getSOAPPart();
FileInputStream is = new FileInputStream("C:\\soap.xml");
soapPart.setContent(new StreamSource(is));
if (message == null) {
return false;
}
message.getSOAPPart().getEnvelope().addNamespaceDeclaration("wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
message.getSOAPPart().getEnvelope().addNamespaceDeclaration("wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
message.getSOAPPart().getEnvelope().addNamespaceDeclaration("ds", "http://www.w3.org/2000/09/xmldsig#");
message.getSOAPBody().setAttributeNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "wsu:Id","body");
WSSecHeader header = new WSSecHeader();
header.setActor("http://smev.gosuslugi.ru/actors/smev");
header.setMustUnderstand(false);
Element sec = header.insertSecurityHeader(message.getSOAPPart());
Document doc = message.getSOAPPart().getEnvelope().getOwnerDocument();
Element token =(Element) sec.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:BinarySecurityToken"));
token.setAttribute("EncodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary");
token.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
token.setAttribute("wsu:Id", "CertId");
header.getSecurityHeader().appendChild(token);
// Prepare signature provider
Provider xmlDSigProvider = new ru.CryptoPro.JCPxml.dsig.internal.dom.XMLDSigRI();
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", xmlDSigProvider);
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("#body", fac.newDigestMethod("http://www.w3.org/2001/04/xmldsig-more#gostr3411", null), transformList, null,null );
// Make link to signing element
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));
// Prepare key information to verify signature in future on other side
//final Object[] obj = samData.clone();
KeyInfoFactory kif = fac.getKeyInfoFactory();
X509Data x509d = kif.newX509Data(Collections.singletonList((X509Certificate) cert));
KeyInfo ki = kif.newKeyInfo(Collections.singletonList(x509d));
// Create signature and sign by private key
javax.xml.crypto.dsig.XMLSignature sig = fac.newXMLSignature(si, ki);
DOMSignContext signContext = new DOMSignContext((Key) privateKey, token);
sig.sign(signContext);
// Insert signature node in document
Element sigE = (Element) XPathAPI.selectSingleNode(signContext.getParent(), "//ds:Signature");
Node keyE = XPathAPI.selectSingleNode(sigE, "//ds:KeyInfo", sigE);
token.appendChild(doc.createTextNode(XPathAPI.selectSingleNode(keyE, "//ds:X509Certificate", keyE).getFirstChild().getNodeValue()));
keyE.removeChild(XPathAPI.selectSingleNode(keyE, "//ds:X509Data", keyE));
NodeList chl = keyE.getChildNodes();
for (int i = 0; i < chl.getLength(); i++) {
keyE.removeChild(chl.item(i));
}
Node str = keyE.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:SecurityTokenReference"));
Element strRef = (Element)str.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:Reference"));
strRef.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
strRef.setAttribute("URI", "#CertId");
header.getSecurityHeader().appendChild(sigE);
String msg = org.apache.ws.security.util.XMLUtils.PrettyDocumentToString(doc);
System.out.println( msg );
Array.writeFile("C:\\soap_signed.xml", str2.getBytes("utf-8"));
SOAPXMLSignatureManager_1_6_3 signatureManager =
new SOAPXMLSignatureManager_1_6_3(SpecUtility.DEFAULT_CRYPTO_PROPERTIES,
SpecUtility.DEFAULT_ALIAS, SpecUtility.DEFAULT_PASSWORD, SpecUtility.DEFAULT_PASSWORD);
System.out.println( signatureManager.verifySecuredMessage(message, true) );
SignatureToolService sts = new SignatureToolServiceLocator();
SignatureTool st = sts.getSignatureToolPort(new URL("http://188.254.16.92:7777/gateway/services/SID0003038"));
VerifySignatureRequestType vsrType = new VerifySignatureRequestType(msg, false, "http://smev.gosuslugi.ru/actors/smev");
VerifySignatureResponseType result = st.verifySignature(vsrType);
System.out.println(result.getError().getErrorCode() + ", " + result.getError().getErrorMessage());
Отредактировано пользователем 29 мая 2012 г. 15:16:39(UTC)
| Причина: Не указана |