Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы<12
Опции
К последнему сообщению К первому непрочитанному
Offline scorpio1379  
#11 Оставлено : 29 мая 2012 г. 14:02:45(UTC)
scorpio1379

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.05.2012(UTC)
Сообщений: 6
Откуда: moscow

что-то я совсем затупил.. извините за дурацкие вопросы но заниматься ЭЦП я начал совсем недавно и потому совсем еще не в теме.
как вы проверяли подпись в СМЭВ?

у вас свой клиент или же через SOAPUI или еще как? тк у меня на сервере с NetBeans-ом не открыты порты 7777 и 9999 то мне приходиться ответ в soapui сервера переносить copy-Paste ом на другой сервер где SOAPUI настроен на тестовый сервер. я пробовал переносить xmlник - но результат один и тот же (если переносить copy-pastом тестовый пример из документации к тестовому сервису то все работает ). может я просто не правильно тестирую подпись?

касательно JCP и CSP я вообще не использую CSP для работы, просто когда начал разбираться, я натолкнулся на ошибку system level error occurred while verifying trust при просмотре сертификатов. (не всех а только от тестового CryptoPro b "боевого" СМЭВ ) выличил установкой CSP с модулем совместимости.
и теперь интересует можно ли как нибудь вылечить эту проблему без установки CSP (или эта ошибка не влияет на работу JSP)


теперь по коду.. еще раз прошу прощения за вопросы просто я немного запутался...
первое я взял из примера CryptoProXMLDSigRI-1.51 прямо из ru.wss4j1_6_3.manager вытащил необходимые методы подписи и проверки в свой модуль.
получил подпись но без тегов transformS
СМЭВ естественно не принял подпись.
изменил код в соответствии с примером в этой ветке.
transforms появился но СМЭВ подпись не принимает.

какие преобразования для корректной работы СМЭВ я должен совершить?

могут ли быть проблемы проверки подписи связаны не с процессом подписи а с неправильной установкой JCP или неверной обработкой ключей\сертификатов и как это проверить?

Offline Евгений Афанасьев  
#12 Оставлено : 29 мая 2012 г. 15:15:27(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline scorpio1379  
#13 Оставлено : 29 мая 2012 г. 15:23:13(UTC)
scorpio1379

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.05.2012(UTC)
Сообщений: 6
Откуда: moscow

спасибо,
сейчас попробую установить eclipse и сделать клиент. может через SOAPUI не проходит почему то
Offline scorpio1379  
#14 Оставлено : 29 мая 2012 г. 19:24:26(UTC)
scorpio1379

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.05.2012(UTC)
Сообщений: 6
Откуда: moscow

а подскажите как правильно записать Document в xml
через Transformer
Код:

TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		DOMSource source = new DOMSource(doc);
		StreamResult result = new StreamResult(new File("C:\\file.xml"));
 
		// Output to console for testing
		// StreamResult result = new StreamResult(System.out);
 
		transformer.transform(source, result);

или же через Serialize
Код:

XMLSerializer serializer = new XMLSerializer();
    serializer.setOutputCharStream(
      new java.io.FileWriter("order.xml"));
    serializer.serialize(document);
Offline scorpio1379  
#15 Оставлено : 29 мая 2012 г. 19:45:19(UTC)
scorpio1379

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.05.2012(UTC)
Сообщений: 6
Откуда: moscow

такс а похоже всех ввел в заблуждение, извините.
дело в том что SOAPUI сам форматирует xml для наглядности.
я сохранил результат в файл прямо из вэб сервиса а потом проверил СМЭВом
все проходит и тестовым ключом CryptoPro и Боевым СМЭВ.
спасибо за ответы.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы<12
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.