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

Уведомление

Icon
Error

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

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

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

Добрый день!

Использую jcp.1.0.52 для подписания SOAP сообщений. Эти сообщения получает система работающая на .NET

Столкнулся с проблемой:
Если в сообщении присутствует пустой самозакрывающийся тег(напр. <aaa/>), то на стороне .NET верификация подписи не проходит.

Думаю причина в том, что на стороне .NET перед верификацией подписи выполняется приведение xml к каноническому виду и пустой тег представляется как пара <aaa></aaa>(что соответствует документу http://www.w3.org/TR/xml-c14n#Example-SETags), а на JCP этого не происходит.

При создании объекта SignedInfo я указываю метод канонизации:

Код:
SignedInfo si = fac.newSignedInfo(fac.newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS,
                    (C14NMethodParameterSpec) null),
                    fac.newSignatureMethod("http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411", null),
                    Collections.singletonList(ref)); 


Может нужно что-то еще прописывать?

Заранее спасибо.
Вложение(я):
inSOAPMsg.xml (1kb) загружен 27 раз(а).
out_inSOAPMsg.xml (3kb) загружен 16 раз(а).

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

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 710 раз в 671 постах
Здравствуйте. Вы могли бы приложить исходный (неподписанный) и подписанный документы?
Offline akmidd  
#3 Оставлено : 17 августа 2012 г. 15:22:57(UTC)
akmidd

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

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

Приложил файлы к первому сообщению.

Еще заметил, что если во входном файле вместо одиночного тега написать пару открывающийся/закрывающийся, то в подписанном она заменяется на одиночный тег.
Offline akmidd  
#4 Оставлено : 17 августа 2012 г. 15:53:38(UTC)
akmidd

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

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

Дебажил класс org.apache.xml.security.c14n.implementations.Canonicalizer20010315Excl(метод engineCanonicalize) который поидее должен выполнять канонизацию документа.
Отладчик зашел туда один раз, результат выполнения содержит тег SignedInfo(см. приложение) и там уже есть DigestValue. Т.е сами подписываемые данные не канонизируются(по крайней мере через этот класс).
Вложение(я):
engineCanonicalizeResult.xml (2kb) загружен 25 раз(а).

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

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 710 раз в 671 постах
akmidd написал:
если вместо одиночного тега написать пару открывающийся/закрывающийся, то в подписанном она заменяется на одиночный тег.

Это правильно канонизации.
Offline akmidd  
#6 Оставлено : 17 августа 2012 г. 19:19:24(UTC)
akmidd

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

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

Вот тут http://www.w3.org/TR/2001/REC-xml-c14n-20010315 написано, что должно быть наоборот.

"Empty element conversion to start-end tag pair"
Offline tiesto  
#7 Оставлено : 17 августа 2012 г. 19:58:49(UTC)
tiesto

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

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

Наблюдаю такую же ситуацию, как у автора.
если вот так проводить каноникализацию, то возвращается корректное значение (то есть пустой тег представляется как пара)

Код:

    public static byte[] getCanonXML(Node xmlContent) {
        org.apache.xml.security.Init.init();
        Canonicalizer canon;
        byte[] canon_xmlContent;
        try {
            canon = Canonicalizer.getInstance(CanonicalizationMethod.EXCLUSIVE);
            canon_xmlContent = canon.canonicalizeSubtree(xmlContent);
            return canon_xmlContent;

        } catch (InvalidCanonicalizerException ex) {
            Logger.getLogger(XMLConverter.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (CanonicalizationException ex) {
            Logger.getLogger(XMLConverter.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }

    }
Offline Евгений Афанасьев  
#8 Оставлено : 17 августа 2012 г. 21:59:27(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 710 раз в 671 постах
Если включить логирование в logging.properties (level=FINE), то можно увидеть, что перед хешированием пустые теги типа <A /> представлены в виде пар вида <A></A>.
Offline akmidd  
#9 Оставлено : 20 августа 2012 г. 18:57:12(UTC)
akmidd

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

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

Вот это сообщение в логе соответствует представлению документа перед тем как будет вычислятся дайджест?
Код:
[DEBUG] DigesterOutputStream - ...


На .NET можно включить аналогичное логирование?

Отредактировано пользователем 20 августа 2012 г. 19:02:16(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#10 Оставлено : 20 августа 2012 г. 22:01:48(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 710 раз в 671 постах
Исходное сообщение содержит:
Код:

...
<AAA></AAA>
<BBB aa="uu"></BBB>
<SSS>rrrr</SSS>
<VVV />
...

Лог XMLDSigRI может выглядеть примерно так:
...
ru.CryptoPro.JCPxml.dsig.internal.dom.ApacheCanonicalizer transform
FINE: Created transform for algorithm: http://www.w3.org/2001/10/xml-exc-c14n#
ru.CryptoPro.JCPxml.dsig.internal.dom.ApacheCanonicalizer transform
FINE: ApacheData = true
ru.CryptoPro.JCPxml.dsig.internal.DigesterOutputStream write
FINE: Pre-digested input:
ru.CryptoPro.JCPxml.dsig.internal.DigesterOutputStream write
FINE: <S:Body xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="body">
<AAA></AAA>
<BBB aa="uu"></BBB>
<SSS>rrrr</SSS>
<VVV></VVV>
</S:Body>
ru.CryptoPro.JCPxml.dsig.internal.dom.DOMReference digest
FINE: Reference object uri = #body
ru.CryptoPro.JCPxml.dsig.internal.dom.DOMReference digest
FINE: Reference digesting completed
ru.CryptoPro.JCPxml.dsig.internal.dom.DOMSignatureMethod sign
FINE: Signature provider:JCP version 1.0
ru.CryptoPro.JCPxml.dsig.internal.dom.DOMSignatureMethod sign
FINE: Signing with key: CryptoPro Gost Exchange PrivateKey with parameters:1.2.643.2.2.98
PM org.apache.xml.security.transforms.Transform initializeTransform
FINE: Create URI "http://www.w3.org/2001/10/xml-exc-c14n#" class "class org.apache.xml.security.transforms.implementations.TransformC14NExclusive"
org.apache.xml.security.transforms.Transform initializeTransform
FINE: The NodeList is [CanonicalizationMethod: null]
org.apache.xml.security.utils.ElementProxy setElement
FINE: setElement(CanonicalizationMethod, "null"
ru.CryptoPro.JCPxml.dsig.internal.dom.ApacheCanonicalizer transform
FINE: Created transform for algorithm: http://www.w3.org/2001/10/xml-exc-c14n#
ru.CryptoPro.JCPxml.dsig.internal.dom.ApacheCanonicalizer transform
FINE: isNodeSet() = true
ru.CryptoPro.JCPxml.dsig.internal.dom.DOMSignedInfo canonicalize
FINE: Canonicalized SignedInfo:
ru.CryptoPro.JCPxml.dsig.internal.dom.DOMSignedInfo canonicalize
FINE: <SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"></SignatureMethod><Reference URI="#body"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"></DigestMethod><DigestValue>sQN8nIOhQ0zDvBbAxMB74DPuZWffTVN0Ww03QpXn5cc=</DigestValue></Reference></SignedInfo>
ru.CryptoPro.JCPxml.dsig.internal.dom.DOMSignedInfo canonicalize
FINE: Data to be signed/verified:PFNpZ25lZEluZm8geG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPjxD
YW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8x
MC94bWwtZXhjLWMxNG4jIj48L0Nhbm9uaWNhbGl6YXRpb25NZXRob2Q+PFNpZ25hdHVyZU1ldGhv
ZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZHNpZy1tb3JlI2dvc3Ry
MzQxMDIwMDEtZ29zdHIzNDExIj48L1NpZ25hdHVyZU1ldGhvZD48UmVmZXJlbmNlIFVSST0iI2Jv
ZHkiPjxUcmFuc2Zvcm1zPjxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8y
MDAxLzEwL3htbC1leGMtYzE0biMiPjwvVHJhbnNmb3JtPjwvVHJhbnNmb3Jtcz48RGlnZXN0TWV0
aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxkc2lnLW1vcmUjZ29z
dHIzNDExIj48L0RpZ2VzdE1ldGhvZD48RGlnZXN0VmFsdWU+c1FOOG5JT2hRMHpEdkJiQXhNQjc0
RFB1WldmZlRWTjBXdzAzUXBYbjVjYz08L0RpZ2VzdFZhbHVlPjwvUmVmZXJlbmNlPjwvU2lnbmVk
SW5mbz4=
...

По поводу логирования в .NET - лучше задать вопрос в соответствующем разделе.

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

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