Добрый день!
Вчера у меня получилось подписать пустой файл. При этом я заметил некую странность работы компоненты 1С при каноникализации строки.
Подписываю xml строку следующего формата:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header><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="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/><ds:Reference URI=""><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></ds:Transforms><ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><ds:DigestValue>%DigestValue%</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>%SignatureValue%</ds:SignatureValue><ds:KeyInfo><ds:X509Data><ds:X509Certificate>%BinarySecurityToken%</ds:X509Certificate></ds:X509Data></ds:KeyInfo></ds:Signature></soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
Подпись вставляю в тег Header.
Каноникализация в 1С:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header></soapenv:Header>
<soapenv:Body></soapenv:Body>
</soapenv:Envelope>
Данная каноническая форма xml соответствует форме, которую я получаю на другом онлайн ресурсе.
В результате, сервис
https://www.justsign.me/verifyqca/Verify/ возвращает сообщение, что подпись математически корректна. При этом в коде 1С я воспользовался объектом ADODB.Stream и убрал метки порядка байтов. Правда позже выяснил, что при сохранении xml строки в файл формата utf-8 в 1с можно передавать параметр, который определяет наличие этих байтов. В общем, с нормализацией строки разобрался.
Кроме того, добавление строки "<?xml version="1.0" encoding="UTF-8" standalone="no"?>" в начало xml файла после подписи, никак не повлияло на конечный результат. Подпись корректна.
Однако.
Если попробовать подписать похожую пустую xml строку:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header><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="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/><ds:Reference URI=""><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></ds:Transforms><ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><ds:DigestValue>%DigestValue%</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>%SignatureValue%</ds:SignatureValue><ds:KeyInfo><ds:X509Data><ds:X509Certificate>%BinarySecurityToken%</ds:X509Certificate></ds:X509Data></ds:KeyInfo></ds:Signature></soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
В данной строке добавлено объявление пространства имен xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
Каноническая форма в 1С:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header></soapenv:Header>
<soapenv:Body></soapenv:Body>
</soapenv:Envelope>
Каноническая форма на стороннем ресурсе:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header></soapenv:Header>
<soapenv:Body></soapenv:Body>
</soapenv:Envelope>
Я заметил, что объявление пространства имен xmlns:xsi в канонической форме остается, а в 1С убирается.
В итоге подпись на ресурсе не проходит. Может быть проблема исключительно в этом? В файлах примерах, что я присылал ранее, пространства имен в канонической форме также убраны, а на стороннем ресурсе они остаются(перепроверил). Я не придал этому значения тогда.
К сожалению, мне пока не удалось на ресурсах 1С найти описание работы процедуры C14N() встроенной компоненты, запросил у тех поддержки описание, но пока ответа нет.
Посмотрел описание процедуры в гугле, но не понял, можно ли передавать какой-либо параметр на вход, чтобы на выходе не убирались пространства имен.