Имя: Пароль:
1C
1С v8
Криптография, как подписывать XML ?
0 DES
 
28.07.16
13:27
Есть Файл XML. Получатель требует его подписать, дает пример.
В начале идет этот XML , а за ним должен следовать такой кусок
<SignatureContent>
    <SignedDoc>
        <hash Id="SignedContent">--------?---------</hash>
        <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">;
            <SignedInfo>
                <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"; />
                <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"; />
                <Reference URI="#SignedContent">
                    <Transforms>
                        <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"; />
                    </Transforms>
                    <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"; />
                    <DigestValue>--------?---------=</DigestValue>
                </Reference>
            </SignedInfo>
            <SignatureValue>--------?---------</SignatureValue>
            <KeyInfo>
                <X509Data>
                    <X509SubjectName>------------тут понятно что писать ----------</X509SubjectName>
                    <X509Certificate>--------?---------</X509Certificate>
                </X509Data>
            </KeyInfo>
        </Signature>
    </SignedDoc>
</SignatureContent>

что нужно вписывать вместо "-----?-------" ? и можно ли это получить посредством 1с8 ?
1 Serginio1
 
28.07.16
13:37
2 Serginio1
 
28.07.16
13:38
3 Garykom
 
гуру
28.07.16
13:39
4 Serginio1
 
28.07.16
13:40
5 Garykom
 
гуру
28.07.16
13:43
(4) оттуда "есть два варианта
1. высокоуровневый криптопро.net
2. низкоуровневый crypto api

выбирайте"

криптопро не обязателен
6 Кирпич
 
28.07.16
14:03
(0) прежде чем броситься в глубины дотнетов, сишарпов и java, советую спросить этот вопрос у самого получателя. Уж он то точно знает.
7 DES
 
28.07.16
14:16
неужели нет нигде обработки по подписанию XML ?
8 Кирпич
 
28.07.16
14:26
(7) сделай. пример в (2)
9 DES
 
28.07.16
14:35
делаю.
сразу ругается на using System.Security.Cryptography.Xml;
Ошибка    1    Имя типа или пространства имен "Xml" отсутствует в пространстве имен "System.Security.Cryptography" (пропущена ссылка на сборку?)    D:\ServiceEfactura5\ConsoleApplication1\ConsoleApplication1\Program.cs    7    36    ConsoleApplication1
10 Gary417
 
28.07.16
14:37
(9) ну читайте подробнее пример то

To compile this example, you need to include a reference to System.Security.dll.
11 DES
 
28.07.16
14:43
Ошибка    1    Имя "rsaKey" отсутствует в текущем контексте    D:\ServiceEfactura5\ConsoleApplication1\ConsoleApplication1\Program.cs    66    36    ConsoleApplication1
12 DES
 
28.07.16
14:45
для проверки делать в VS тип проекта консольное приложение ?
13 Кирпич
 
28.07.16
14:49
(11) напиши просто Key
14 DES
 
28.07.16
14:52
да уже догнался, а как в этом примере подкинуть свой ключ из хранилища ?
15 Кирпич
 
28.07.16
14:54
16 Garykom
 
гуру
28.07.16
14:59
(15) Кста да тока хотел сказать что нафуя сторонник когда можно из 1С сразу http://catalog.mista.ru/public/199912/
17 Garykom
 
гуру
28.07.16
15:00
18 Кирпич
 
28.07.16
15:11
19 DES
 
28.07.16
15:15
(16) просят че то за скачку, не пойму.
20 Garykom
 
гуру
28.07.16
15:21
(19) СП продать? Раздел МенеджерКриптографии.
21 DES
 
28.07.16
15:28
(20) что такое СП ?
У меня книжки есть, из коробки.
22 DES
 
28.07.16
15:40
кто может качнуть http://catalog.mista.ru/public/199912/ для меня ?
23 Кирпич
 
28.07.16
18:47
(22) Да там фигня. Тебе не поможет.
24 DES
 
28.07.16
18:54
как так, пишет же что все путем из 1с
25 H A D G E H O G s
 
28.07.16
19:26
1С при подписи не включает в результат исходный файл.
26 Garykom
 
гуру
28.07.16
19:46
(25) ТСу нуна взять хеш от файла (исходного XML) и подписать его ЭП, затем все это засунуть в одну XMLину.
27 Garykom
 
гуру
28.07.16
19:47
(26)+ Если честно то проблеммка на максимум пару дней (при наличии связи с кто проверяет или способа проверки) и 4-8 нормочасов.
28 Кирпич
 
28.07.16
19:50
(24) тебе нужна подпись типа XMLDSIG, про которую пример в (2)
В 1С это можно сделать (сам не пробовал), но надо самому генерить хеши и шифровать и в XML всё это запихивать. В (2) применяется класс SignedXml, который умеет это делать.
29 Кирпич
 
28.07.16
19:55
+(28) могут быть еще заморочки со стороны Получателя, чтобы твой алгоритм выдавал ровно то, что ожидает Получатель, байт в байт. Не факт, что даже пример из (2) сгенерит правильный файл, но скорее всего сгенерит. У Получателя твоего наверное тоже всё на C# сделано. Так что ковыряй пока лучше C#.
30 DES
 
29.07.16
10:02
Вся эта лабудень делается через IE и JAVA на локальном компе. Может как то можно это выдрать и закинуть в 1С. Ну или хотя бы алгоритм расковырять.
31 Serginio1
 
29.07.16
10:07
(30) В кой то веки я согласен с Кирпичом. Спрашивай у получателя алгоритс.
В 4 приведен пример поиска ключа, алгоритм хэширования и подпись этим ключом.
В большинстве случаев достаточно 2. Ты бы взял и попробовал.
32 DES
 
29.07.16
10:18
(29) как в (2) присобачить свой RSA key ?
33 DES
 
29.07.16
10:18
(31) взял, попробовал, почто то что нужно
34 DES
 
29.07.16
10:19
(31) получатель недоступен для консультирования, все что есть это pdf от eFactura.
35 Кирпич
 
29.07.16
10:39
(34) так ты всё молдавские фактуры грызёшь? :)
у тебя же вроде какая то либа была. она наверное и подписывать умеет. не?
36 Кирпич
 
29.07.16
10:43
+(35) ну и в PDF загляни. обычно алгоритм подписи описывают подробно.
37 DES
 
29.07.16
10:56
не могу заглянуть в pdf, я его распечатал и протер до дыр.
Алгоритм описан в виде исходные данные и требуемые результаты.

сделал поиск ключа в хранилище
                string certThumbprint = @"CDA379DF091A7541FD5152DF4736449E7948FF5A";
                X509Store storeMy = new X509Store(StoreName.My, StoreLocation.CurrentUser);
                storeMy.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
                X509CertificateCollection foundCertColl = storeMy.Certificates.Find(X509FindType.FindByThumbprint, certThumbprint, false);

как его преобразовать в RSA key ?
38 Serginio1
 
29.07.16
11:14
(37) Смотри 4. Там все есть
X509Certificate cert = foundCertColl[0];

KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(cert));

// Добавляем KeyInfo в SignedXml.
signedXml.KeyInfo = keyInfo;

// Вычисляем подпись.
signedXml.ComputeSignature(); //Здесь возникает exception
39 Serginio1
 
29.07.16
11:16
40 Serginio1
 
29.07.16
11:21
41 Serginio1
 
29.07.16
11:22
Проси алгоритм подписи на C#.
42 DES
 
29.07.16
11:52
(39) сделал по (39)
структура получилась соответствующая, только значения слегка отличаются
Нужно
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"; />

а выдает
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"; />

насколько это критично ?
43 Serginio1
 
29.07.16
11:57
Наверное другой XmlDsigC14NTransform

XmlDsigExcC14NTransform

https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.xml.xmldsigexcc14ntransform(v=vs.110).aspx
44 DES
 
29.07.16
16:03
ДА, строчка получилась та что нужно, а формат стал другой
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший