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

Уведомление

Icon
Error

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

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

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

Здравствуйте!

Проблема с подписью. Подписываю кодом (mf = SOAPMessage):

Код:

   
    mf.getSOAPPart().getEnvelope().addNamespaceDeclaration("wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
    mf.getSOAPPart().getEnvelope().addNamespaceDeclaration("wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
    mf.getSOAPPart().getEnvelope().addNamespaceDeclaration("ds", "http://www.w3.org/2000/09/xmldsig#");
    mf.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(mf.getSOAPPart());
    Document doc = mf.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);

    XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", xmlDSigProvider);

    List<Transform> transformList = new ArrayList<Transform>();
    Transform transform = fac.newTransform(Transform.ENVELOPED, (XMLStructure) null);
    Transform transformC14N = fac.newTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS, (XMLStructure) null);
    transformList.add(transform);
    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
    KeyInfoFactory kif = fac.getKeyInfoFactory();
    X509Data x509d = kif.newX509Data(Collections.singletonList(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(privateKey, token);
    signContext.putNamespacePrefix(javax.xml.crypto.dsig.XMLSignature.XMLNS, "ds");
    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);


Проблема в добавляемом алгоритме канонизации Transform transformC14N = fac.newTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS, (XMLStructure) null); Если я его убираю, то получаю ожидаемую подпись с элементом:

Код:

          <ds:Reference URI="#body">
            <ds:Transforms>
              <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
            </ds:Transforms>


При включении Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS, я ожидаю на выходе аналогичный пакет только с двумя элементами:

Код:

          <ds:Reference URI="#body">
            <ds:Transforms xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
              <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            </ds:Transforms>


Но получаю документ с множеством лишних объявленных пространств имен:

Код:

          <ds:Reference URI="#body" xmlns="" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                        xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
                        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">
            <ds:Transforms xmlns="" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                           xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
                           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">
              <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" xmlns=""
                            xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                            xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
                            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"/>
            </ds:Transforms>


wsu и wsse присутствуют в каждом элементе, в том числе и в рутовом. В чем может быть проблема?

Вложение(я):
signedRequest.txt (22kb) загружен 50 раз(а).
unsignedRequest.txt (3kb) загружен 28 раз(а).

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

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 710 раз в 671 постах
Здравствуйте.
Какие wss4j (1.5 или 1.6) и jre вы используете?
Такая проблема существует в jre 1.6, попробуйте проверить в jre 1.7 (_02) + jcp, вроде в jre 1.7 эта проблема исчезла.

Отредактировано пользователем 2 марта 2012 г. 22:25:45(UTC)  | Причина: Не указана

Offline dsaponenko  
#3 Оставлено : 5 марта 2012 г. 13:47:16(UTC)
dsaponenko

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

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

Использую JRE6 и wss4j версии 1.6. С JRE7 надо бы попробовать.

А есть ли возможность указать каноникализацию только при подписи, чтобы она не модифицировала исходное сообщение?
Offline Евгений Афанасьев  
#4 Оставлено : 5 марта 2012 г. 15:08:20(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 710 раз в 671 постах
Канонизация применяется к SignedInfo. Она необходима, чтобы при обработке различными парсерами подпись была валидна.
Offline dsaponenko  
#5 Оставлено : 5 марта 2012 г. 15:19:13(UTC)
dsaponenko

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

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

Да, это понятно. Только после подписи на выходе получается обработанное сообщение. Но ведь можно работать дальше и с не обработанным, только указывать алгоритм каноникализации и при проверке подписи сообщение снова преобразуется в нужный вид. Можно ли как то избежать такой проблемы с jre6?
Offline Евгений Афанасьев  
#6 Оставлено : 5 марта 2012 г. 15:34:36(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 710 раз в 671 постах
dsaponenko написал:
Можно ли как то избежать такой проблемы с jre6?

Вы имеете в виду вставки лишних пространств имен в jre6? Или вы имеете в виду Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS, который приводит к этой проблеме? Канонизация выполняется над SignedInfo перед подписью, а Transform над данными перед хэшированием.

Отредактировано пользователем 5 марта 2012 г. 15:49:26(UTC)  | Причина: Не указана

Offline dsaponenko  
#7 Оставлено : 5 марта 2012 г. 17:18:55(UTC)
dsaponenko

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

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

Как раз интересует исключение лишних пространств имен после подписи.
Offline Евгений Афанасьев  
#8 Оставлено : 5 марта 2012 г. 18:35:00(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 710 раз в 671 постах
Вот тут http://www.java.net/node/673578 есть описание похожей ошибки. Вы не пробовали на jre 1.7?
Offline dsaponenko  
#9 Оставлено : 5 марта 2012 г. 18:37:05(UTC)
dsaponenko

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

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

Забыл написать. С JRE7 проблема решается. Лишние неймспейсы пропадают. Вот только загвоздка, что не все проекты используют 1.7. В основном везде 1.6

Отредактировано пользователем 5 марта 2012 г. 18:37:48(UTC)  | Причина: Не указана

Offline mustiks  
#10 Оставлено : 28 марта 2012 г. 21:36:46(UTC)
mustiks

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

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

Поблагодарили: 1 раз в 1 постах
Здравствуйте,
Тоже пытаюсь подписать xml по Гост, пытаюсь воспользоватся примером из "ГОСТ + SOAP message Security (wss4j) с помощью КриптоПро JCP"

Вылетает ошибка javax.xml.crypto.NoSuchMechanismException: class configured for XMLSignatureFactory(provider: CryptoProXMLDSig)cannot be found.

В jre\lib\ext все необходимые библиотеки вроде xmlsec и все ее зависимости скопированы. JCP установлен без ошибок в процессе инсталяции

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