Добрый день!
Путь, по которому я пытаюсь пройти:
Установка:
tar -xzf linux-amd64.tgz
cd linux-amd64
sudo ./install.sh
Версия самая свежая из ныне доступных (40r4)
Добавление корневых сертификатов (под root) из файла
http://cpca.cryptopro.ru/cacer.p7b:sudo certmgr -inst -all -store uroot -file cacer.p7b
Добавление сертификата пользователя:
cp /path/from/some/folder/User.cer /path/to/local/storage/User.cer
Добавляю сертификат с привязкой к закрытому ключу и возможностью подписывать документы
Закрытый ключ состоит из шести key-файлов:
header.key
masks2.key
masks.key
name.key
primary2.key
primary.key
В итоге всех манипуляций проверяю командой certmgr --list и вижу Private Link: Yes » т.е. сертификат и приватный ключ установлены в системе корректно.
Нам нужно подписать условный /path/to/xml/file.xml:
Код:<?xml version="1.0" encoding="utf-8"?>
<case xmlns:mig="http://umms.fms.gov.ru/replication/migration" xmlns:core="http://umms.fms.gov.ru/replication/core"
xmlns:ic="http://umms.fms.gov.ru/application/invitation"
xmlns="http://umms.fms.gov.ru/application/invitation/electronic/issuance" schemaVersion="1.0">
<core:uid>1554599</core:uid>
<foo/>
<bar/>
</case>
Первым делом я формирую хэш командой:
Код:/opt/cprocsp/bin/amd64/cryptcp -hash -dir /path/to/hash/ -hashAlg 1.2.643.2.2.9 /path/to/xml/file.xml
Вопросы:
хэш формируется на основе исходного файла без изменений оного?
нужно ли перед хэшированием приводить файл к какому-то виду? тут намёк на Canonicalization
Затем собираю структуру:
Код:<Signature
xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411" />
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
</Transforms>
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411" />
<DigestValue>сюда пишу значение [в base64], полученное на шаге №6</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue> ... </SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate> сюда пишу значение открытого ключа сертификата с шага /path/to/local/storage/User.cer </X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
Делаю Canonicalization для тега <SignedInfo> и записываю эту строку в файл /path/to/xml/SignedInfo.xml.sig
Код:/opt/cprocsp/bin/amd64/cryptcp -sign -uMy -dn "user@domain.ru" -hashAlg 1.2.643.2.2.9 -pin 123456 -nochain /path/to/xml/SignedInfo.xml.sig /path/to/sig/file.xml.sig
Полученное на предыдущем шаге значение пишу в тег <SignatureValue>.
Отдельно отмечу, что само по себе полученное значение в файле SignedInfo.xml.sig отлично валидируется в сервисе
https://dss.cryptopro.ru/Verify/Verify/ (в прочем как и консольными командами).
В итоге собранный xml файл не проходит валидацию на сервисе
https://dss.cryptopro.ru/Verify/Verify/Перепробовал различные варианты сборки xml, ничего не помогает.
Нужна помощь с пошаговым алгоритмом действий, возможно какие-то неправильные действия совершаю на некоторых шагах.
Где-то пишут про необходимость какое-то значение в base64 перегнать, где-то пишут, что надо делать Canonicalization не только для SignatureValue, а для всего файла, где-то пишут, что надо какую-то строку перевернуть (сделать revert).
Отредактировано пользователем 1 апреля 2019 г. 14:22:25(UTC)
| Причина: Не указана