Подписывайте документы онлайн,
быстро и безопасно!

APB.DocumentSigner – это плагин, который поддерживает электронную подпись документов с использованием одного или нескольких пользовательских сертификатов через браузер.

Скачать

Преимущества

Электронная подпись

Поддерживает электронную подпись документов XML следующих форматов:

XAdES_BES XAdES_XL XAdES_T XmlDsig
Графическая подпись

Позволяет управлять размером и расположением графических подписей на страницах PDF документов.

Работа в браузере

Легко интегрируется с браузерами Google Chrome, Mozila FireFox, Opera и Microsoft Edge Chromium.

Простая установка

Состоит из плагина и клиентского приложения. Загрузка необходимых компонентов происходит автоматически. Минимальные системные требования: Windows 7 SP1

Кому полезен
APB.DocumentSigner?

Соответствует мировым техническим стандартам электронных подписей.

Позволяет использовать электронную подпись на любом веб-ресурсе, что решает следующие задачи:

  • создание документов с электронной подписью
  • подтверждение личности подписавшего
  • гарантия целостности всего документа
  • защита персональных данных клиентов

Возможные сферы применения плагина:

  • клиентские порталы и электронные торговые площадки;
  • системы интернет-банкинга;
  • электронные офисы для системы корпоративного документооборота и сдачи отчетностей
  • Позволяет дистанционно, со своего компьютера подписывать клиентские документы
  • Дает возможность использовать любой защищенный носитель электронной подписи
  • Гарантирует защиту персональных данных пользователя

Как начать пользоваться APB.DocumentSigner?

1

установите плагин для браузера

Установить
2

скачайте и установите компонент для работы плагина

Скачать
3

плагин и компонент не готовы к работе

Примеры

Для корректной работы компонента и плагина должен быть установлен .Net Framework 4.7.2

Примеры для разработчика

  1. Обратиться в ЗАО «Агропромбанк» для заключения соглашения об использовании плагина;
  2. Получить от ЗАО «Агропромбанк» ключ доступа к функциям плагина и указать его в структуре JSON сообщения (поле domainSignature);
  3. Реализовать функцию слушателя window.addEventListener( 'message', function(event) {…}), которая будет ожидать ответа от плагина APB.DocumentSigner;
  4. Реализовать функцию отправки запроса плагину function SendRequest( base64Data, typeDocument, typeOperation).

    /*------ Подпись XML------
    * Структура JSON сообщения
    * {
    *	"source" : "адрес отправителя",
    *	"destination" : "адрес получателя",
    *	"typeDocument" : "тип документа",
    *	"typeOperation" : "тип операции",
    *   "dataBlock" : "пересылаемые приложению данные(строка данных)",
    *	"domainSignature" : "ключ доступа",
    *	------для XML------
    *	"method" : "алгоритм подписи(RSAwithSHA1 / RSAwithSHA256 / RSAwithSHA512)",
    *	"packing" : "тип упаковки сигнатуры (ENVELOPED / ENVELOPING / INTERNALLY_DETACHED / EXTERNALLY_DETACHED / HASH_INTERNALLY_DETACHED)",
    *	"format" : "формат подписи (XAdES_BES / XAdES_XL / XAdES_T / XmlDsig)",
    *   "timeStampUri : время подписи",
    *	"contentUri : id узла который будет подписан"
    * }
    */
    var SignExtension = SignExtension || {};
    SignExtension.Enum = {
    //Алгоритм подписи
    XmlSignMethod:{
    SHA1 : 1,
    SHA256 : 2,
    SHA512 : 3
    },
    //Тип упаковки сигнатуры
    XmlSignType:{
    Enveloped : 1,
    Enveloping : 2,
    InternallyDetached : 3,
    ExternallyDetached: 4,
    HashInternallyDetached: 5
    },
    //Формат подписи
    XmlSignFormat:{
    XAdES_BES : 1,
    XAdES_XL : 2,
    XAdES_T : 3,
    XmlDsig : 4
    },
    //Тип операции
    TypeOperation:{
    //Проверка подписи документа
    Verify: 2,
    //Ошибка, ответ приходит от плагина
    Error: 3,
    //Доступ, ответ приходит от плагина
    Access: 5,
    //Проверка, если плагин установлен. Возвращяет статусы:
    //STATE: need update - необходимо обновить компоненты
    //STATE: success - компоненты установлены, версии плагина и компонент совпадают
    //STATE: not exist - компоненты не установлены
    IsExist: 6,
    //Авторизация клиента
    Autorization: 7,
    //подпись документа
    SignDocument: 8
    },
    //тип документа
    TypeDocument:{
    XML: 1,
    PDF: 2
    },
    //идентификатор плагина
    ExtensionIdFireFox: '{B01F58C6-F424-4711-9260-231A12BBEFE5}',
    ExtensionIdChrome:  'oaphoginhonideopfonmfckckbejlknn'
    };

    //-----------------------------------------------------------
    //ключ доступа(Здесь следует указать ключ доступа к функциям плагина)
    const KEY_SIGNATURE='CvPk0Lxu77F/HWld4ukn2ATN7nZE1N+HJ+mEV+Qu7o7NRPyHLSnyihq' +
    '5Z2c27f2tef/vv6V1fn6/16R3Sg6oAHNvQ+2saPyY6Xg8J8au3A18NgNe5Uya3L/OXVU0VDoeCpP+nA' +
    'PLT2ZTmD19pQtJfboLvp9D1JXcmMl3KlltykooFUsJmFl4uTxQjbbgbmu6HL27PnGv7w/QNsFBxtTIT' +
    'BMD/uFQaCByNBDHaAjyz2EGgh3DWUlTaMf6bKwOVTF6cMfAgsPj7GJLBuRjSw3nqBBxv16YigdfNvfG' +
    'f6wVFuu3e+g34qTKO28TrwiKWSE9Oxh0ih2n/9x8HABp7FczVQ==';
    //------------------------------------------
    // Браузер Mozilla FireFox
    var isFirefox = typeof InstallTrigger !== 'undefined';
    // Chrome Chrome
    var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
    //----------------------------------------------------------------------------------------
    /*
    *	отправка сообщения в запросе
    *	->xmlString - xml строка
    *   ->fileName - имя файла без расширения
    */
    function SendMessageSignXML(xmlString, fileName)
    {
    try
    {
    let message = JSON.parse('{}');
    //Наименование документа
    message.docName = fileName;
    //адрес отправителя
    message.source = window.location.href;
    //тип документа
    message.typeDocument = SignExtension.Enum.TypeDocument.XML;
    //адрес получателя
    if(isFirefox)
    {
    message.destination = SignExtension.Enum.ExtensionIdFireFox;
    }
    else
    {
    message.destination = SignExtension.Enum.ExtensionIdChrome;
    }
    //ключ доступа
    message.domainSignature = KEY_SIGNATURE.toString();
    //тип операции
    message.typeOperation = SignExtension.Enum.TypeOperation.SignDocument;
    //блок данных
    message.dataBlock = xmlString;
    //расширения, по которым будет выбран список сертификатов. По умолчанию плагин будет использоать расширения(1.3.6.1.4.1.52072.1.1; 1.3.6.1.4.1.52072.1.2)
    // символ ';' разделяет расширение
    message.searchByExtension = "1.3.6.1.4.1.50561.5.1.1; 1.3.6.1.4.1.52072.1.4";
    //алгоритм подписи
    message.method = SignExtension.Enum.XmlSignMethod.SHA256;
    //тип упаковки сигнатуры
    message.packing = SignExtension.Enum.XmlSignType.Enveloped;
    //формат подписи
    message.format = SignExtension.Enum.XmlSignFormat.XmlDsig;
    //время подписи
    //Для алгоритмов XAdES_XL, XAdES_T этот параметр является обязательным (например, http://ca.agroprombank.com/tsa или http://sha256timestamp.ws.symantec.com/sha256/timestamp)
    message.timeStampUri = "";
    //id узла который будет подписан. Если поле пустое, будет подписан весь документ.
    message.contentUri = "";
    //отправка кросдоменного запроса
    window.postMessage(message,"*");
    }
    catch(e)
    {
    //отображение ошибки
    alert(e.message);
    // вывод исключения в консоль
    console.error(e);
    }

    }

    //получение результата от плагина
    window.addEventListener('message', function (event) {
    if (event.source != window)
    return;
    var message = event.data;
    //id расширения
    let ExtensionId;

    if (isFirefox) {
    //Firefox id
    ExtensionId = SignExtension.Enum.ExtensionIdFireFox;
    }
    else {
    //Chrome id
    ExtensionId = SignExtension.Enum.ExtensionIdChrome;
    }
    //если есть адресс отправителя и сообщение пришло от плагина
    if (message.source && message.source === ExtensionId) {
    //тип операции
    switch (message.typeOperation) {
    //ошибка
    case SignExtension.Enum.TypeOperation.Error:
    {
    alert('Внимание!\n' + message.dataBlock);
    break;
    }
    //доступ
    case SignExtension.Enum.TypeOperation.Access:
    {
    alert('Ошибка доступа!\n' + message.dataBlock);
    break;
    }
    //проверка установленного компонента
    case SignExtension.Enum.TypeOperation.IsExist:
    {
    alert('Проверка наличия плагина!\n' + message.dataBlock);
    break;
    }
    //Ответ от авторизации
    case SignExtension.Enum.TypeOperation.Autorization:
    {
    console.log('Получен ответ от Авторизации:');
    console.log(message.dataBlock);
    break;
    }
    //Ответ от подписи документа
    case SignExtension.Enum.TypeOperation.SignDocument:
    {
    console.log('Получен ответ от Подписи:');
    console.log(message);
    break;
    }
    //Ответ от проверки подписей
    case SignExtension.Enum.TypeOperation.Verify:
    {
    console.log('Получен ответ от Проверки подписей:');
    console.log(message);
    break;
    }
    default:
    {
    alert('От content получен неизвестный тип операции');
    break;
    }
    }
    }
    });

    /*------АВТОРИЗАЦИЯ------
    * Структура JSON сообщения
    * {
    *	"source" : "адрес отправителя",
    *	"destination" : "адрес получателя",
    *	"typeDocument" : "тип документа",
    *	"typeOperation" : "тип операции",
    *   "dataBlock" : "пересылаемые приложению данные(строка данных)",
    *	"domainSignature" : "ключ доступа",
    *	------для XML------
    *	"method" : "алгоритм подписи(RSAwithSHA1 / RSAwithSHA256 / RSAwithSHA512)",
    *	"packing" : "тип упаковки сигнатуры (ENVELOPED / ENVELOPING / INTERNALLY_DETACHED / EXTERNALLY_DETACHED / HASH_INTERNALLY_DETACHED)",
    *	"format" : "формат подписи (XAdES_BES / XAdES_XL / XAdES_T / XmlDsig)",
    *   "timeStampUri : время подписи",
    *	"contentUri : id узла который будет подписан"
    * }
    */
    var SignExtension = SignExtension || {};
    SignExtension.Enum = {
        //Алгоритм подписи
        XmlSignMethod:{
            SHA1 : 1,
            SHA256 : 2,
            SHA512 : 3
        },
        //Тип упаковки сигнатуры
        XmlSignType:{
            Enveloped : 1,
            Enveloping : 2,
            InternallyDetached : 3,
            ExternallyDetached: 4,
            HashInternallyDetached: 5
        },
        //Формат подписи
        XmlSignFormat:{
            XAdES_BES : 1,
            XAdES_XL : 2,
            XAdES_T : 3,
            XmlDsig : 4
        },
        //Тип операции
        TypeOperation:{
            //Проверка подписи документа
            Verify: 2,
            //Ошибка, ответ приходит от плагина
            Error: 3,
            //Доступ, ответ приходит от плагина
            Access: 5,
            //Проверка, если плагин установлен. Возвращяет статусы:
            //STATE: need update - необходимо обновить компоненты
            //STATE: success - компоненты установлены, версии плагина и компонент совпадают
            //STATE: not exist - компоненты не установлены
            IsExist: 6,
            //Авторизация клиента
            Autorization: 7,
            //подпись документа
            SignDocument: 8
        },
        //тип документа
        TypeDocument:{
            XML: 1,
            PDF: 2
        },
        //идентификатор плагина
        ExtensionIdFireFox: '{B01F58C6-F424-4711-9260-231A12BBEFE5}',
        ExtensionIdChrome:  'oaphoginhonideopfonmfckckbejlknn'
    };

    //-----------------------------------------------------------
    //ключ доступа(Здесь следует указать ключ доступа к функциям плагина)    
    const KEY_SIGNATURE='CvPk0Lxu77F/HWld4ukn2ATN7nZE1N+HJ+mEV+Qu7o7NRPyHLSnyihq' +
    '5Z2c27f2tef/vv6V1fn6/16R3Sg6oAHNvQ+2saPyY6Xg8J8au3A18NgNe5Uya3L/OXVU0VDoeCpP+nA' +
    'PLT2ZTmD19pQtJfboLvp9D1JXcmMl3KlltykooFUsJmFl4uTxQjbbgbmu6HL27PnGv7w/QNsFBxtTIT' +
    'BMD/uFQaCByNBDHaAjyz2EGgh3DWUlTaMf6bKwOVTF6cMfAgsPj7GJLBuRjSw3nqBBxv16YigdfNvfG' +
    'f6wVFuu3e+g34qTKO28TrwiKWSE9Oxh0ih2n/9x8HABp7FczVQ==';
    //------------------------------------------
    // Браузер Mozilla FireFox
    var isFirefox = typeof InstallTrigger !== 'undefined';
    // Chrome Chrome
    var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
    //----------------------------------------------------------------------------------------
    /*
    *	отправка сообщения в запросе
    *	->data - строка с данными(например guid: {ACEE0F0D-061A-4A21-A30A-ACA3CCF6FB9D})
    */
    function SendMessageAutorization(data)
    {
        try
        {
            let message = JSON.parse('{}');
            //адрес отправителя
            message.source = window.location.href;
            //тип документа
            message.typeDocument = SignExtension.Enum.TypeDocument.XML;
            //адрес получателя
            if(isFirefox)
            {
                message.destination = SignExtension.Enum.ExtensionIdFireFox;
            }
            else
            {
                message.destination = SignExtension.Enum.ExtensionIdChrome;
            }
            //ключ доступа
            message.domainSignature = KEY_SIGNATURE.toString();
            //тип операции
            message.typeOperation = SignExtension.Enum.TypeOperation.Autorization;
            //тип документа
            message.typeDocument = SignExtension.Enum.TypeDocument.XML;
            //алгоритм подписи
            message.method = SignExtension.Enum.XmlSignMethod.SHA256;
            //тип упаковки
            message.packing = SignExtension.Enum.XmlSignType.Enveloped;
            //формат подписи
            message.format = SignExtension.Enum.XmlSignFormat.XAdES_BES;
            //время подписи
            message.timeStampUri = "";
            //id узла который будет подписан
            message.contentUri = "";
            message.dataBlock = data;

            window.postMessage(message, "*");

        }
        catch(e)
        {
            //отображение ошибки
            alert(e.message);
            // вывод исключения в консоль
            console.error(e);
        }

    }

    //получение результата от плагина
    window.addEventListener('message', function (event) {
        if (event.source != window)
            return;
        var message = event.data;
        //id расширения
        let ExtensionId;

        if (isFirefox) {
            //Firefox id
            ExtensionId = SignExtension.Enum.ExtensionIdFireFox;
        }
        else {
            //Chrome id
            ExtensionId = SignExtension.Enum.ExtensionIdChrome;
        }
        //если есть адресс отправителя и сообщение пришло от плагина
        if (message.source && message.source === ExtensionId) {
            //тип операции
            switch (message.typeOperation) {
                //ошибка
                case SignExtension.Enum.TypeOperation.Error:
                {
                    alert('Внимание!\n' + message.dataBlock);
                    break;
                }
                //доступ
                case SignExtension.Enum.TypeOperation.Access:
                {
                    alert('Ошибка доступа!\n' + message.dataBlock);
                    break;
                }
                //проверка установленного компонента
                case SignExtension.Enum.TypeOperation.IsExist:
                {
                    alert('Проверка наличия плагина!\n' + message.dataBlock);
                    break;
                }
                //Ответ от авторизации
                case SignExtension.Enum.TypeOperation.Autorization:
                {
                    console.log('Получен ответ от Авторизации:');
                    console.log(message.dataBlock);
                    break;
                }
                //Ответ от подписи документа
                case SignExtension.Enum.TypeOperation.SignDocument:
                {
                    console.log('Получен ответ от Подписи:');
                    console.log(message);
                    break;
                }
                //Ответ от проверки подписей
                case SignExtension.Enum.TypeOperation.Verify:
                {
                    console.log('Получен ответ от Проверки подписей:');
                    console.log(message);
                    break;
                }
                default:
                {
                    alert('От content получен неизвестный тип операции');
                    break;
                }
            }
        }
    });

    /*------ Подпись PDF------
    * Структура JSON сообщения
    * {
    *	"source" : "адрес отправителя",
    *	"destination" : "адрес получателя",
    *	"typeDocument" : "тип документа",
    *	"typeOperation" : "тип операции",
    *   "dataBlock" : "пересылаемые приложению данные(строка данных)",
    *	"domainSignature" : "ключ доступа",
    *	------для PDF------
    *	"startX" : "координаты по оси Х",
    *	"startY" : "координаты по оси Y",
    *	"height" : "высота",
    *	"width" : "ширина",
    *	"pageNumber" : "номер страницы"
    * }
    */
    var SignExtension = SignExtension || {};
    SignExtension.Enum = {
        //Тип операции
        TypeOperation:{
            //Проверка подписи документа
            Verify: 2,
            //Ошибка, ответ приходит от плагина
            Error: 3,
            //Доступ, ответ приходит от плагина
            Access: 5,
            //Проверка, если плагин установлен. Возвращяет статусы:
            //STATE: need update - необходимо обновить компоненты
            //STATE: success - компоненты установлены, версии плагина и компонент совпадают
            //STATE: not exist - компоненты не установлены
            IsExist: 6,
            //Авторизация клиента
            Autorization: 7,
            //подпись документа
            SignDocument: 8
        },
        //тип документа
        TypeDocument:{
            XML: 1,
            PDF: 2
        },
        //идентификатор плагина
        ExtensionIdFireFox: '{B01F58C6-F424-4711-9260-231A12BBEFE5}',
        ExtensionIdChrome:  'oaphoginhonideopfonmfckckbejlknn'
    };

    //-----------------------------------------------------------
    //ключ доступа(Здесь следует указать ключ доступа к функциям плагина)
    const KEY_SIGNATURE='CvPk0Lxu77F/HWld4ukn2ATN7nZE1N+HJ+mEV+Qu7o7NRPyHLSnyihq' +
    '5Z2c27f2tef/vv6V1fn6/16R3Sg6oAHNvQ+2saPyY6Xg8J8au3A18NgNe5Uya3L/OXVU0VDoeCpP+nA' +
    'PLT2ZTmD19pQtJfboLvp9D1JXcmMl3KlltykooFUsJmFl4uTxQjbbgbmu6HL27PnGv7w/QNsFBxtTIT' +
    'BMD/uFQaCByNBDHaAjyz2EGgh3DWUlTaMf6bKwOVTF6cMfAgsPj7GJLBuRjSw3nqBBxv16YigdfNvfG' +
    'f6wVFuu3e+g34qTKO28TrwiKWSE9Oxh0ih2n/9x8HABp7FczVQ==';
    //------------------------------------------
    // Браузер Mozilla FireFox
    var isFirefox = typeof InstallTrigger !== 'undefined';
    // Chrome Chrome
    var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
    //----------------------------------------------------------------------------------------
    /*
    *	отправка сообщения в запросе
    *	->base64Data - данные файла в формате base64
    *   ->fileName - имя файла без расширения
    */
    function SendMessageSignPDF(base64Data, fileName)
    {
        let message = JSON.parse('{}');
        //Наименование документа
        message.docName = fileName;
        //адрес отправителя
        message.source = window.location.href;
        //тип документа
        message.typeDocument = SignExtension.Enum.TypeDocument.PDF;
        //адрес получателя
        if(isFirefox)
        {
            message.destination = SignExtension.Enum.ExtensionIdFireFox;
        }
        else
        {
            message.destination = SignExtension.Enum.ExtensionIdChrome;
        }
        //ключ доступа
        message.domainSignature = KEY_SIGNATURE.toString();
        //тип операции
        message.typeOperation = SignExtension.Enum.TypeOperation.SignDocument;
        try
        {
            //Если по умолчанию координаты, высота и ширина не заданы, плагин будет подписывать документ по умолчанию (левый нижний угол).
            //Последующие подписи будут автоматически ставиться после предыдущих.
            //координаты по оси Х.
            message.startX = '';
            //координаты по оси Y
            message.startY = '';
            //высота
            message.height = '';
            //ширина
            message.width = '';
            //номер страницы. По умолчанию 0 - подпись будет отображаться на последней странице
            message.pageNumber = 0;
            //если есть заголовок "data:application/pdf;base64,..." удаляем его
            message.dataBlock = base64Data.substr(base64Data.indexOf(',') + 1);
            //отправка сообщения
            window.postMessage(message,"*");
        }
        catch(e)
        {
            //отображение ошибки
            alert(e.message);
            // вывод исключения в консоль
            console.error(e);
        }
    }


    //получение результата от плагина
    window.addEventListener('message', function (event) {
        if (event.source != window)
            return;
        var message = event.data;
        //id расширения
        let ExtensionId;

        if (isFirefox) {
            //Firefox id
            ExtensionId = SignExtension.Enum.ExtensionIdFireFox;
        }
        else {
            //Chrome id
            ExtensionId = SignExtension.Enum.ExtensionIdChrome;
        }
        //если есть адресс отправителя и сообщение пришло от плагина
        if (message.source && message.source === ExtensionId) {
            //тип операции
            switch (message.typeOperation) {
                //ошибка
                case SignExtension.Enum.TypeOperation.Error:
                {
                    alert('Внимание!\n' + message.dataBlock);
                    break;
                }
                //доступ
                case SignExtension.Enum.TypeOperation.Access:
                {
                    alert('Ошибка доступа!\n' + message.dataBlock);
                    break;
                }
                //проверка установленного компонента
                case SignExtension.Enum.TypeOperation.IsExist:
                {
                    alert('Проверка наличия плагина!\n' + message.dataBlock);
                    break;
                }
                //Ответ от авторизации
                case SignExtension.Enum.TypeOperation.Autorization:
                {
                    console.log('Получен ответ от Авторизации:');
                    console.log(message.dataBlock);
                    break;
                }
                //Ответ от подписи документа
                case SignExtension.Enum.TypeOperation.SignDocument:
                {
                    console.log('Получен ответ от Подписи:');
                    console.log(message);
                    break;
                }
                //Ответ от проверки подписей
                case SignExtension.Enum.TypeOperation.Verify:
                {
                    console.log('Получен ответ от Проверки подписей:');
                    console.log(message);
                    break;
                }
                default:
                {
                    alert('От content получен неизвестный тип операции');
                    break;
                }
            }
        }
    });


    /*----------- Проверка подписи -------
    * Структура JSON сообщения
    * {
    *	"source" : "адрес отправителя",
    *	"destination" : "адрес получателя",
    *	"typeDocument" : "тип документа",
    *	"typeOperation" : "тип операции",
    *   "dataBlock" : "пересылаемые приложению данные(строка данных)",
    *	"domainSignature" : "ключ доступа",
    * }
    */
    var SignExtension = SignExtension || {};
    SignExtension.Enum = {
        //Тип операции
        TypeOperation:{
            //Проверка подписи документа
            Verify: 2,
            //Ошибка, ответ приходит от плагина
            Error: 3,
            //Доступ, ответ приходит от плагина
            Access: 5,
            //Проверка, если плагин установлен. Возвращяет статусы:
            //STATE: need update - необходимо обновить компоненты
            //STATE: success - компоненты установлены, версии плагина и компонент совпадают
            //STATE: not exist - компоненты не установлены
            IsExist: 6,
            //Авторизация клиента
            Autorization: 7,
            //подпись документа
            SignDocument: 8
        },
        //тип документа
        TypeDocument:{
            XML: 1,
            PDF: 2
        },
        //идентификатор плагина
        ExtensionIdFireFox: '{B01F58C6-F424-4711-9260-231A12BBEFE5}',
        ExtensionIdChrome:  'oaphoginhonideopfonmfckckbejlknn'
    };

    //-----------------------------------------------------------
    //ключ доступа(Здесь следует указать ключ доступа к функциям плагина)
    const KEY_SIGNATURE='CvPk0Lxu77F/HWld4ukn2ATN7nZE1N+HJ+mEV+Qu7o7NRPyHLSnyihq' +
    '5Z2c27f2tef/vv6V1fn6/16R3Sg6oAHNvQ+2saPyY6Xg8J8au3A18NgNe5Uya3L/OXVU0VDoeCpP+nA' +
    'PLT2ZTmD19pQtJfboLvp9D1JXcmMl3KlltykooFUsJmFl4uTxQjbbgbmu6HL27PnGv7w/QNsFBxtTIT' +
    'BMD/uFQaCByNBDHaAjyz2EGgh3DWUlTaMf6bKwOVTF6cMfAgsPj7GJLBuRjSw3nqBBxv16YigdfNvfG' +
    'f6wVFuu3e+g34qTKO28TrwiKWSE9Oxh0ih2n/9x8HABp7FczVQ==';
    //------------------------------------------
    // Браузер Mozilla FireFox
    var isFirefox = typeof InstallTrigger !== 'undefined';
    // Chrome Chrome
    var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
    //----------------------------------------------------------------------------------------
    /*
    *	отправка сообщения в запросе
    *	->data - загруженный документ в формате base64(документ PDF)/ xml строка (документ xml)
    *	->typeDocument - SignExtension.Enum.TypeDocument.PDF (тип документа pdf)/SignExtension.Enum.TypeDocument.XML(тип документа xml)
    */
    function SendMessageVerify(data, typeDocument)
    {
        let message = JSON.parse('{}');
        //адрес отправителя
        message.source = window.location.href;
        //тип документа
        message.typeDocument = typeDocument;
        //адрес получателя
        if(isFirefox)
        {
            message.destination = SignExtension.Enum.ExtensionIdFireFox;
        }
        else
        {
            message.destination = SignExtension.Enum.ExtensionIdChrome;
        }
        //ключ доступа
        message.domainSignature = KEY_SIGNATURE.toString();
        //тип операции
        message.typeOperation = SignExtension.Enum.TypeOperation.Verify;
        try
        {
            //тип документа PDF
            if(typeDocument ===  SignExtension.Enum.TypeDocument.PDF )
            {
                message.dataBlock = data.substr(data.indexOf(',') + 1);
            }
            //тип документа XML
            else if(typeDocument === SignExtension.Enum.TypeDocument.XML)
            {
                message.dataBlock = data;
            }
            //отправка сообщения
            window.postMessage(message,"*");
        }
        catch(e)
        {
            //отображение ошибки
            alert(e.message);
            // вывод исключения в консоль
            console.error(e);
        }
    }

    //получение результата от плагина
    window.addEventListener('message', function (event) {
        if (event.source != window)
            return;
        var message = event.data;
        //id расширения
        let ExtensionId;

        if (isFirefox) {
            //Firefox id
            ExtensionId = SignExtension.Enum.ExtensionIdFireFox;
        }
        else {
            //Chrome id
            ExtensionId = SignExtension.Enum.ExtensionIdChrome;
        }
        //если есть адресс отправителя и сообщение пришло от плагина
        if (message.source && message.source === ExtensionId) {
            //тип операции
            switch (message.typeOperation) {
                //ошибка
                case SignExtension.Enum.TypeOperation.Error:
                {
                    alert('Внимание!\n' + message.dataBlock);
                    break;
                }
                //доступ
                case SignExtension.Enum.TypeOperation.Access:
                {
                    alert('Ошибка доступа!\n' + message.dataBlock);
                    break;
                }
                //проверка установленного компонента
                case SignExtension.Enum.TypeOperation.IsExist:
                {
                    alert('Проверка наличия плагина!\n' + message.dataBlock);
                    break;
                }
                //Ответ от авторизации
                case SignExtension.Enum.TypeOperation.Autorization:
                {
                    console.log('Получен ответ от Авторизации:');
                    console.log(message.dataBlock);
                    break;
                }
                //Ответ от подписи документа
                case SignExtension.Enum.TypeOperation.SignDocument:
                {
                    console.log('Получен ответ от Подписи:');
                    console.log(message);
                    break;
                }
                //Ответ от проверки подписей
                case SignExtension.Enum.TypeOperation.Verify:
                {
                    console.log('Получен ответ от Проверки подписей:');
                    console.log(message);
                    break;
                    }
                default:
                {
                    alert('От content получен неизвестный тип операции');
                    break;
                }
            }
        }
    });
Подписанный документ
Введите тестовые данные, которые будут подписаны для авторизации (максимум 40 символов):
Подписанный документ
Результат