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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline dsaponenko  
#1 Оставлено : 5 октября 2012 г. 15:57:55(UTC)
dsaponenko

Статус: Участник

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

Имеется код подписи xml. Подписанные запросы проходят валидацию на сервисе http://188.254.16.92:9999/gateway/services/SID0003038?wsdl. Пример корректно подписанного сообщения:
Код:

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:rev="http://smev.gosuslugi.ru/rev110801" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><soapenv:Header><wsse:Security soapenv:actor="http://smev.gosuslugi.ru/actors/smev" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="CertId-EFA5A10D61AB4A75BF8D8ED1D5320FB5">
MIIC3zCCAo6gAwIBAgIKEsWe8AACAAHVwjAIBgYqhQMCAgMwZTEgMB4GCSqGSIb3DQEJARYRaW5m
b0BjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMRMwEQYDVQQKEwpDUllQVE8tUFJPMR8wHQYDVQQD
ExZUZXN0IENlbnRlciBDUllQVE8tUFJPMB4XDTEyMDIxMzEzMDExNFoXDTE0MTAwNDA3MDk0MVow
ITELMAkGA1UEBhMCUlUxEjAQBgNVBAMTCWxvY2FsaG9zdDBjMBwGBiqFAwICEzASBgcqhQMCAiQA
BgcqhQMCAh4BA0MABEA6ImQDH7j3PCusNnrnVVU+r1jYYKUDkuU17Z8G1JJ1N5hTG3BKLt7tuPoZ
QvtIDs1J6sLF6bd/C3GhoJ2IryP6o4IBYDCCAVwwCwYDVR0PBAQDAgLkMBMGA1UdJQQMMAoGCCsG
AQUFBwMBMB0GA1UdDgQWBBTHD14DVO1CbNajzLNlEgHXrm0l+DAfBgNVHSMEGDAWgBRtj14F2V+s
kReUHpWaBTA4N3oQKjBVBgNVHR8ETjBMMEqgSKBGhkRodHRwOi8vd3d3LmNyeXB0b3Byby5ydS9D
ZXJ0RW5yb2xsL1Rlc3QlMjBDZW50ZXIlMjBDUllQVE8tUFJPKDIpLmNybDCBoAYIKwYBBQUHAQEE
gZMwgZAwMwYIKwYBBQUHMAGGJ2h0dHA6Ly93d3cuY3J5cHRvcHJvLnJ1L29jc3BuYy9vY3NwLnNy
ZjBZBggrBgEFBQcwAoZNaHR0cDovL3d3dy5jcnlwdG9wcm8ucnUvQ2VydEVucm9sbC9wa2ktc2l0
ZV9UZXN0JTIwQ2VudGVyJTIwQ1JZUFRPLVBSTygyKS5jcnQwCAYGKoUDAgIDA0EA887qxpBwQV2w
wtJ2UfhyFmKQM59Fy2vo57N4woi08Edk8owuYTUUxyROPBcHKAcW5bmGPMBA+5AblCol1prVaQ==
</wsse:BinarySecurityToken><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/2001/04/xmldsig-more#gostr34102001-gostr3411"/>
<ds:Reference URI="#BodyId-C1E3DD32F7384E82AE0080F22ADC5E6C">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
<ds:DigestValue>TiQ29Ll8Q1Pvtc20D0320UXwi04v7q7wCf/4sY/USFo=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
Y+/De9CWM07z4VowmSW23ra1l2xQjm/COlOZeCSeHIfjw2P2KnMfEO3TyH9zcxzxuHpcsPTl9czl
muRaw6y+2Q==
</ds:SignatureValue>
<ds:KeyInfo>
<wsse:SecurityTokenReference><wsse:Reference URI="#CertId-EFA5A10D61AB4A75BF8D8ED1D5320FB5" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/></wsse:SecurityTokenReference></ds:KeyInfo>
</ds:Signature></wsse:Security></soapenv:Header>
   <soapenv:Body wsu:Id="BodyId-C1E3DD32F7384E82AE0080F22ADC5E6C">
      <rev:createRequestRequest>
      </rev:createRequestRequest>
   </soapenv:Body>
</soapenv:Envelope>


Но вот самостоятельно проверить подпись в своем коде не удается. Код проверки подписи:
Код:

package sx.smev.security;

import com.sun.org.apache.xml.internal.security.Init;
import com.sun.org.apache.xpath.internal.XPathAPI;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ws.security.message.token.X509Security;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import ru.CryptoPro.JCPxml.xmldsig.JCPXMLDSigInit;
import ru.jcp.xml.dsig.internal.dom.XMLDSigRI;
import sx.smev.security.exceptions.XmlVerifyException;

import javax.xml.crypto.KeySelector;
import javax.xml.crypto.MarshalException;
import javax.xml.crypto.dsig.XMLSignature;
import javax.xml.crypto.dsig.XMLSignatureFactory;
import javax.xml.crypto.dsig.dom.DOMValidateContext;
import javax.xml.soap.SOAPMessage;
import java.io.ByteArrayInputStream;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

/**
 * @author dsaponenko
 */
public class CryptoProXmlVerifier {
  private static final Log log = LogFactory.getLog(CryptoProBinarySigner.class);

  static {
    if (!Init.isInitialized()) {
      Init.init();
    }
    if (!JCPXMLDSigInit.isInitialized()) {
      log.info("Start loading JCP for xmldsig");
      JCPXMLDSigInit.init();
      log.info("JCP for xmldsig loaded");
    }
    System.setProperty("com.ibm.security.enableCRLDP", "false");
  }

  public CryptoProXmlVerifier() {
  }

  public boolean verify(SOAPMessage message) throws XmlVerifyException {
    try {
      // Extract some nodes to verify document
      Document doc = message.getSOAPPart().getEnvelope().getOwnerDocument();
      final Element wssecontext = doc.createElementNS(null, "namespaceContext");
      wssecontext.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:" + "wsse".trim(), "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
      NodeList secnodeList = XPathAPI.selectNodeList(doc.getDocumentElement(), "//wsse:Security");

      Element r = null;
      Element el;
      if (secnodeList != null && secnodeList.getLength() > 0) {
        String actorAttr;
        for (int i = 0; i < secnodeList.getLength(); i++) {
          el = (Element) secnodeList.item(i);
          actorAttr = el.getAttributeNS("http://schemas.xmlsoap.org/soap/envelope/", "actor");
          if (actorAttr != null && actorAttr.equals("http://smev.gosuslugi.ru/actors/smev")) {
            r = (Element) XPathAPI.selectSingleNode(el, "//wsse:BinarySecurityToken[1]", wssecontext);
            break;
          }
        }
      }
      if (r == null)
        return false;

      final X509Security x509 = new X509Security(r);

      // Extract certificate
      final X509Certificate cert = (X509Certificate) CertificateFactory.getInstance("X.509").generateCertificate(new ByteArrayInputStream(x509.getToken()));

      if (cert == null) {
        throw new Exception("Cannot find certificate to verify signature");
      }

      System.out.println(cert);
      // Get signature node
      NodeList nl = doc.getElementsByTagNameNS("http://www.w3.org/2000/09/xmldsig#", "Signature");
      if (nl.getLength() == 0) {
        throw new Exception("Cannot find Signature element");
      }

      DOMValidateContext valContext = new DOMValidateContext(KeySelector.singletonKeySelector(cert.getPublicKey()), nl.item(0));
      XMLSignature signature = getSignature(valContext);

      // Verify signature
      return signature.validate(valContext);

    } catch (Exception ex) {
      throw new XmlVerifyException(ex);
    }
  }

  private XMLSignature getSignature(DOMValidateContext validateContext) throws NoSuchAlgorithmException, MarshalException {
    XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", new XMLDSigRI());
    return fac.unmarshalXMLSignature(validateContext);
  }
}


Мы работаем с xmlsec 1.4, поэтому используется сервис провайдер из архива (Найти страницу откуда был взят этот архив не удалось). При этом подпись и проверка подписи успешно осуществляется с библиотеками и сервис-провайдером со страницы http://cryptopro.ru/blog...lzovaniem-kriptopro-jcp, но по ряду причин нет возможности использовать xmlsec 1.5.

В lib\ext лежат библиотеки указанных в readme версий. Подпись корректна, а вот проверка подписи не проходит.

Код тестирования:

Код:

    KeyStore ks = SpecUtility.loadKeyStore(SpecUtility.DEFAULT_STORETYPE, null, "123".toCharArray());
    X509Certificate certificate =(X509Certificate)ks.getCertificate("tomcat");
    PrivateKey privateKey = (PrivateKey) ks.getKey("tomcat", "123".toCharArray());

    CryptoProXmlSigner xmlSignature = new CryptoProXmlSigner(certificate, privateKey);
    SOAPMessage soapMessage = getSoapMessage(MESSAGE.getBytes("windows-1251"));

    /* Подписываем запрос */
    xmlSignature.sign(soapMessage);

   assertTrue(new CryptoProXmlVerifier().verify(soapMessage1));


В чем может быть проблема?
Вложение(я):
test_jcp_wss4j1_6.tar.gz (86kb) загружен 11 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Евгений Афанасьев  
#2 Оставлено : 5 октября 2012 г. 16:05:10(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,977
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
Здравствуйте.
То есть вы используете JCPxml + xmlsec 1.4, и проверка не выполняется, а если используете CryptoProXMLDSigRI + xmlsec 1.5 - то проходит ?
Offline dsaponenko  
#3 Оставлено : 8 октября 2012 г. 15:29:37(UTC)
dsaponenko

Статус: Участник

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

afev написал:
Здравствуйте.
То есть вы используете JCPxml + xmlsec 1.4, и проверка не выполняется, а если используете CryptoProXMLDSigRI + xmlsec 1.5 - то проходит ?


Верно отчасти. Если я использую CryptoProXMLDSigRI + xmlsec 1.5 из примера со страницы пример, то проверка подписи проходит.

Про JCPxml + xmlsec 1.4 не понял. При конструировании фабрики для демаршаллизации сигнатуры используется сервис провайдер:
Код:
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", new XMLDSigRI());
, этот сервис провайдер взят из другого примера.

Можно обойтись без него при использовании wss4j 1.6?
Offline Евгений Афанасьев  
#4 Оставлено : 8 октября 2012 г. 16:43:02(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,977
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
dsaponenko написал:
этот сервис провайдер взят из другого примера.

В смысле провайдер более ранний, который был в начале года и использовал xmlsec-1.4 ? Там были ошибки с дублированием xmlns.
dsaponenko написал:
Можно обойтись без него при использовании wss4j 1.6?

В wss4j 1.6 - нет.
Offline dsaponenko  
#5 Оставлено : 8 октября 2012 г. 17:00:30(UTC)
dsaponenko

Статус: Участник

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

afev написал:
dsaponenko написал:
этот сервис провайдер взят из другого примера.

В смысле провайдер более ранний, который был в начале года и использовал xmlsec-1.4 ? Там были ошибки с дублированием xmlns.
dsaponenko написал:
Можно обойтись без него при использовании wss4j 1.6?

В wss4j 1.6 - нет.


Да, более ранний. Я в курсе ошибок дублирования, как раз создавал тему по этой проблеме, но эта проблема никак не относится к проверке подписи. Или относится?

Итого имеем, CryptoProXMLDSigRI.jar (более ранний) + xmlsec 1.4 + wss4j 1.6. Подпись корректная (проходит проверку на сервисе СМЭВ), надо проверить подпись своими средствами. Код проверки я привел выше. Во всех случаях возвращается false. Исходных кодов сервис-провайдера нет, чтобы посмотреть в чем проблема. На xmlsec 1.5 перейти сейчас нет возможности.

Отредактировано пользователем 8 октября 2012 г. 17:07:37(UTC)  | Причина: Не указана

Offline dsaponenko  
#6 Оставлено : 12 октября 2012 г. 17:48:50(UTC)
dsaponenko

Статус: Участник

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

Какие есть мысли? Как поступить с проверкой подписи?
Offline dsaponenko  
#7 Оставлено : 17 октября 2012 г. 20:17:59(UTC)
dsaponenko

Статус: Участник

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

Более подробный вывод сообщений:
Код:

17.10.2012 17:13:59 org.jcp.xml.dsig.internal.dom.ApacheCanonicalizer transform
FINE: Created transform for algorithm: http://www.w3.org/2001/10/xml-exc-c14n#
17.10.2012 17:13:59 org.jcp.xml.dsig.internal.dom.ApacheCanonicalizer transform
FINE: isNodeSet() = true
17.10.2012 17:13:59 ru.jcp.xml.dsig.internal.DigesterOutputStream write
FINER: Pre-digested input:
17.10.2012 17:13:59 ru.jcp.xml.dsig.internal.DigesterOutputStream write
FINER: <soapenv:Body wsu:Id="BodyId-01B47351B13846D09F66BBCD1E03315D">
      <rev:createRequestRequest>
      </rev:createRequestRequest>
   </soapenv:Body>
17.10.2012 17:13:59 ru.CryptoPro.JCP.Digest.GostDigest engineDigest
FINER: ENTRY
17.10.2012 17:13:59 ru.CryptoPro.JCP.pref.JCPPref get
CONFIG: System Preference Node: /ru/CryptoPro/JCP/tools.SelfTester_jar_names=ru.
CryptoPro.JCP.Install.JCPInstaller;ru.CryptoPro.Crypto.JCryptoPInstaller
17.10.2012 17:13:59 ru.CryptoPro.JCP.pref.JCPPref get
CONFIG: System Preference Node: /ru/CryptoPro/JCP/tools.SelfTester_external_clas
sNames=null
17.10.2012 17:13:59 ru.CryptoPro.JCP.Digest.GostDigest reset
FINER: ENTRY
17.10.2012 17:13:59 ru.CryptoPro.JCP.Digest.GostDigest reset
FINER: RETURN
17.10.2012 17:13:59 ru.CryptoPro.JCP.Digest.GostDigest reset
FINER: ENTRY
17.10.2012 17:13:59 ru.CryptoPro.JCP.Digest.GostDigest reset
FINER: RETURN
17.10.2012 17:13:59 ru.CryptoPro.JCP.Digest.GostDigest reset
FINER: ENTRY
17.10.2012 17:13:59 ru.CryptoPro.JCP.Digest.GostDigest reset
FINER: RETURN
17.10.2012 17:13:59 ru.CryptoPro.JCP.Digest.GostDigest engineDigest
FINER: RETURN
17.10.2012 17:13:59 ru.jcp.xml.dsig.internal.dom.DOMReference validate
FINE: Expected digest: F87lC3DsMy+sGtUQeLCRXvmbdcIkE7NeR2/bvvtn+pU=
17.10.2012 17:13:59 ru.jcp.xml.dsig.internal.dom.DOMReference validate
FINE: Actual digest: vLrFMDJ9VhzwSDysZnDIwkgUnvo4kF81y2RBfAQWd8k=
17.10.2012 17:13:59 ru.jcp.xml.dsig.internal.dom.DOMXMLSignature validate
FINE: Reference[#BodyId-01B47351B13846D09F66BBCD1E03315D] is valid: false
17.10.2012 17:13:59 ru.jcp.xml.dsig.internal.dom.DOMXMLSignature validate
FINE: Couldn't validate the References
Message xml signature is bad


Видно, что дайджесты получились разные. При этом подпись то корректна. При проверке на техпортале подпись валидна. Что делать?
Offline Евгений Афанасьев  
#8 Оставлено : 17 октября 2012 г. 21:01:57(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,977
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
В предыдущей версии проблема была в том (если не ошибаюсь), что брался хеш с данных с дублированием xmlns, потому был неверный. А на портале расчитывается хеш, видимо, правильно.
Offline dsaponenko  
#9 Оставлено : 18 октября 2012 г. 19:40:12(UTC)
dsaponenko

Статус: Участник

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

Что вы имеете в виду? Я пытаюсь проверить подпись корректного документа. Из лога видно, что успешно извлекается body сообщения и для него считается дайджест, где здесь появляется дублирование?

Проблема дублирования xmlns при формировании подписи сейчас нас не беспокоит, обошли ее.
Offline Евгений Афанасьев  
#10 Оставлено : 18 октября 2012 г. 20:17:48(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,977
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
Можете прикрепить XML-документ (исходный и подписанный), который проверяется на техпортале (для которого вы приводили вывод сообщений)?

Отредактировано пользователем 18 октября 2012 г. 20:21:15(UTC)  | Причина: Не указана

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