Квалифицированная электронная подпись под macOS / Хабр

Что нужно для работы с кэп под macos:

  1. КЭП на USB-токене Рутокен Lite или Рутокен ЭЦП
  2. криптоконтейнер в формате КриптоПро
  3. со встроенной лицензией на КриптоПро CSP
  4. открытый сертификат должен храниться в контейнере закрытого ключа

Поддержка 
eToken и JaCarta в связке с КриптоПро под macOS под вопросом. Носитель Рутокен Lite – оптимальный выбор, стоит недорого, шустро работает и позволяет хранить до 15 ключей.

Криптопровайдеры VipNet, Signal-COM и ЛИССИ в macOS не поддерживаются. Преобразовать контейнеры никак не получится. КриптоПро – оптимальный выбор, стоимость сертификата в себестоимости от 500= руб. Можно выпустить сертификат с встроенной лицензией на КриптоПро CSP, это удобно и выгодно. 
Если лицензия не зашита, то необходимо купить и активировать полноценную лицензию на КриптоПро CSP.

Обычно открытый сертификат хранится в контейнере закрытого ключа, но это нужно уточнить при выпуске КЭП и попросить сделать как нужно. Если не получается, то импортировать открытый ключ в закрытый контейнер можно самостоятельно средствами КриптоПро CSP под Windows.

Выясняем название контейнера КЭП

На usb-токене и в других хранилищах может храниться несколько сертификатов, и нужно выбрать правильный. При вставленном usb-токене получаем список всех контейнеров в системе командой в terminal:

/opt/cprocsp/bin/csptest -keyset -enum_cont -fqcn -verifycontext

Команда должна вывести минимум 1 контейнер и вернуть

[ErrorCode: 0x00000000]

Нужный нам контейнер имеет вид

.Aktiv Rutoken liteXXXXXXXX

Если таких контейнеров выводится несколько – значит значит на токене записано несколько сертификатов, и вы в курсе какой именно вам нужен. Значение XXXXXXXX после слэша нужно скопировать и подставить в команду ниже.

Выясняем хэш сертификата КЭП

На токене и в других хранилищах может быть несколько сертификатов. Нужно однозначно идентифицировать тот, которым будем впредь подписывать документы. Делается один раз.Токен должен быть вставлен. Получаем список сертификатов в хранилищах командой из terminal:

/opt/cprocsp/bin/certmgr -list

Команда должна вывести минимум 1 сертификат вида:

Необходимое программное обеспечение:

Минимальные требования: 

Операционная система: Mac OS X 10.9.Наличие учетной записи с правами администратора.

Ссылки на необходимое программное обеспечение:

Смена PIN командой из terminal

/opt/cprocsp/bin/csptest -passwd -qchange -container "XXXXXXXX"

где XXXXXXXX – название контейнера, полученное на шаге 1 (обязательно в кавычках).

Появится диалог КриптоПро с запросом старого PIN-кода для доступа к сертификату, затем еще один диалог для ввода нового PIN-кода. Готово.

1. Удаляем все старые ГОСТовские сертификаты

Если ранее были попытки запустить КЭП под macOS, то необходимо почистить все ранее установленные сертификаты. Данные команды в terminal удалят только сертификаты КриптоПро и не затронут обычные сертификаты из Keychain в macOS.

sudo /opt/cprocsp/bin/certmgr -delete -all -store mroot
sudo /opt/cprocsp/bin/certmgr -delete -all -store uroot
/opt/cprocsp/bin/certmgr -delete -all

В ответе каждой команды должно быть:

No certificate matching the criteria

или

Deleting complete

2. Устанавливаем корневые сертификаты

Корневые сертификаты являются общими для всех КЭП, выданных любым удостоверяющим центром. Скачиваем со страницы загрузок УФО Минкомсвязи:

Устанавливаем командами в terminal:

sudo /opt/cprocsp/bin/certmgr -inst -store mroot -f ~/Downloads/4BC6DC14D97010C41A26E058AD851F81C842415A.cer
sudo /opt/cprocsp/bin/certmgr -inst -store mroot -f ~/Downloads/8CAE88BBFD404A7A53630864F9033606E1DC45E2.cer
sudo /opt/cprocsp/bin/certmgr -inst -store mroot -f ~/Downloads/0408435EB90E5C8796A160E69E4BFAC453435D1D.cer

Каждая команда должна возвращать:

Installing:

[ErrorCode: 0x00000000]

3. Скачиваем сертификаты удостоверяющего центра

Далее нужно установить сертификаты удостоверяющего центра, в котором вы выпускали КЭП. Обычно корневые сертификаты каждого УЦ находятся на его сайте в разделе загрузок.

4. Устанавливаем сертификат с Рутокен

Команда в terminal:

/opt/cprocsp/bin/csptestf -absorb -certs

Команда должна вернуть:

OK.
[ErrorCode: 0x00000000]

1. Заходим на тестовую страницу КриптоПро

В адресной строке Chromium-Gost набираем:

3. Заходим на Госуслуги

При авторизации выбираем “Вход с помощью электронной подписи”. В появившемся списке “Выбор сертификата ключа проверки электронной подписи” будут отображены все сертификаты, включая корневые и УЦ, нужно выбрать ваш с usb-токена и ввести PIN.

Ввод лицензии криптопро

     1. Откройте Terminal .

Запуск приложения macOS Терминал (Terminal).

Открыть стандартное приложение macOS Терминал (Terminal) возможно одним из способов:

  • Выберите Spotlight (кнопка лупы в правом верхнем углу экрана) и введите в строку поиска «Терминал».
  • Сверните все запущенные приложения, в верхнем меню выбирайте вкладку «Переход», в открывшемся меню нажимаете раздел «Утилиты».

В окне Терминала необходимо будет вводить команды.

!!!ВАЖНО при вводе команд возможно придется вводить пароль «Password» как на изображении выше, при вводе символы НЕ БУДУТ отображаться. После ввода символов пароля необходимо нажать клавишу «Enter».

     2. Введите команду: sudo /opt/cprocsp/sbin/cpconfig -license -set серийный_номер_лицензии_с_дефисами.

Читайте также:  Как заменить эцп в криптопро

!!!ВАЖНО: номер лицензии необходимо вводить с дефисами. Для подтверждения ввода необходимо ввести пароль администратора. Ввод пароля не отображается в окне терминала. После ввода пароля нажмите Enter.

Криптопро эцп browser plug-in

     1. КриптоПро ЭЦП Browser plug-in скачиваете по данной ссылке.

     2. Запустите файл установщика cprocsp-pki-2.0.14071.pkg.

     3. Начнется установка КриптоПро ЭЦП Browser Plug-in. Нажмите Продолжить.

     4. Ознакомьтесь с информацией о продукте и нажмите Продолжить.

     5. Ознакомьтесь с Лицензионным соглашением и нажмите Продолжить.

     6. Чтобы продолжить установку, потребуется принять условия Лицензионного соглашения. Для этого в появившемся окне нажмите Принять.

     7. Для продолжения установки, нажмите Установить. Не рекомендуется изменять директорию установки КриптоПро ЭЦП Browser plug-in.

     8. Если потребуется, разрешите Установщику установить КриптоПро ЭЦП Browser plug-in. Для этого необходимо ввести пароль.

     9. Дождитесь окончания установки. После ее завершения нажмите Закрыть, чтобы выйти из программы установки.

Настройка браузера chromium-gost

     1. Запускаем браузер Chromium-Gost и в адресной строке набираем:

chrome://extensions/

     2. Включаем оба установленных расширения, с помощью выключателя  Квалифицированная электронная подпись под macOS / Хабр(включен).

  • CryptoPro Extension for CAdES Browser Plug-in
  • Расширение для плагина Госуслуг

     3. Настраиваем расширение КриптоПро ЭЦП Browser plug-in, для этого в адресной строке Chromium-Gost набираем:

/etc/opt/cprocsp/trusted_sites.html

     4. На появившейся странице в список доверенных узлов по очереди добавляем сайты:

Плагин для госуслуг

     1. Скачиваем корректный конфигурационный файл для расширения Госуслуг для поддержки macOS и новых ЭЦП в стандарте ГОСТ2021 по ссылке 

     2. Запустите файл установщика IFCPlugin.pkg с помощью контекстного меню (правая кнопка мыши), выбрав Открыть.

     3. Для начала установки нажимаете Установить.

     4. Начнется установка, необходимо действовать, согласно сообщениям программы. 

     5. Если потребуется, разрешите Установщику установить плагин. Для этого необходимо ввести пароль.

     6. Дождитесь окончания установки. После ее завершения нажмите Закрыть, чтобы выйти из программы установки.

     7. Конфигурационный файл плагина Госуслуг ifc.cfg доступен по данной ссылке.

     8. Скачиваем и оставляем его в папке Download/Загрузки.

     9. Открываем стандартное приложение macOS Терминал (Terminal) (см. раздел Запуск приложения macOS Терминал (Terminal)).

     10. Вводим последовательно команды:

sudo rm /Library/Internet Plug-Ins/IFCPlugin.plugin/Contents/ifc.cfg

sudo cp ~/Downloads/ifc.cfg /Library/Internet Plug-Ins/IFCPlugin.plugin/Contents

sudo cp /Library/Google/Chrome/NativeMessagingHosts/ru.rtlabs.ifcplugin.json /Library/Application Support/Chromium/NativeMessagingHosts

Подписание pdf на js и вставка подписи на c#, используя крипто про

Итак. Пришла задача. Используя браузер предложить пользователю подписать PDF электронной подписью (далее ЭП). У пользователя должен быть токен, содержащий сертификат, открытый и закрытый ключ. Далее на сервере надо вставить подпись в PDF документ. После этого надо проверить подпись на валидность. В качестве back-end используем ASP.NET и соответственно C#.

Вся соль в том, что надо использовать подпись в формате CAdES-X Long Type 1, и российские ГОСТ Р 34.10-2001, ГОСТ Р 34.10-2021 и т.п. Кроме того подписей может быть более одной, то есть пользователи могут по очереди подписывать файл. При этом предыдущие подписи должны оставаться валидными.

В процессе решения задачу решили усложнить для нас, и уменьшить объем передаваемых данных на клиент. Передавать только hash документа, но не сам документ.

В исходниках буду опускать малозначимые для темы моменты, оставлю только то что касается криптографии. Код на JS приведу только для нормальных браузеров, JS-движки которых поддерживают Promise и function generator. Думаю кому нужно для IE напишут сами (мне пришлось «через не хочу»).

Что нужно:

  1. Пользователь должен получить пару ключей и сертификат.
  2. Пользователь должен установить plug-in от Крипто ПРО. Без этого средствами JS мы не сможем работать с криптопровайдером.

Замечания:

  1. Для тестов у меня был сертификат выданный тестовым ЦС Крипто ПРО и нормальный токен, полученный одним из наших сотрудников (на момент написания статьи ~1500р с годовой лицензией на Крипто ПРО и двумя сертификатами: но «новому» и «старому» ГОСТ)
  2. Говорят, plug-in умеет работать и с ViPNet, но я не проверял.

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

Добавляем на страницу скрипт от Крипто ПРО:

<script src="/Scripts/cadesplugin_api.js" type="text/javascript"></script>

Дальше нам надо дождаться пока будет сформирован объект cadesplugin

window.cadespluginLoaded = false;
cadesplugin.then(function () {
    window.cadespluginLoaded = true;
});

Запрашиваем у сервера hash. Предварительно для этого нам ещё надо знать каким сертификатом, а значит и алгоритмом пользователь будет подписывать. Маленькая ремарка: все функции и «переменные» для работы с криптографией на стороне клиента я объединил в объект CryptographyObject.

Читайте также:  Оформление электронной цифровой подписи - ключ эцп в Москве

Метод заполнения поля certificates объекта CryptographyObject:

    fillCertificates: function (failCallback) {

            cadesplugin.async_spawn(function*() {
                try {
                    let oStore = yield cadesplugin.CreateObjectAsync("CAPICOM.Store");

                    oStore.Open(cadesplugin.CAPICOM_CURRENT_USER_STORE,
                        cadesplugin.CAPICOM_MY_STORE,
                        cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

                    let certs = yield oStore.Certificates;
                    certs = yield certs.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_TIME_VALID);
                    let certsCount = yield certs.Count;
                    for (let i = 1; i <= certsCount; i  ) {
                        let cert = yield certs.Item(i);
                        CryptographyObject.certificates.push(cert);
                    }
                    oStore.Close();
                } catch (exc) {
                     failCallback(exc);
                }
            });
    }

Комментарий: пробуем открыть хранилище сертификатов. В этот момент система пользователя выдаст предупреждение, что сайт пытается что-то сделать с сертификатами, криптографией и прочей магической непонятной ерундой. Пользователю тут надо будет нажать кнопку «Да»

Далее получаем сертификаты, валидные по времени (не просроченные) и складываем их в массив certificates. Это надо сделать из-за асинхронной природы cadesplugin (для IE всё иначе 😉 ).

Метод получения hash:

getHash: function (certIndex, successCallback, failCallback, какие-то ещё параметры) {
        try {
            cadesplugin.async_spawn(function*() {
                let cert = CryptographyObject.certificates[certIndex];
                let certPublicKey = yield cert.PublicKey();
                let certAlgorithm = yield certPublicKey.Algorithm;
                let algorithmValue = yield certAlgorithm.Value;
                let hashAlgorithm;
                //определяем алгоритм подписания по данным из сертификата и получаем алгоритм хеширования
                    if (algorithmValue === "1.2.643.7.1.1.1.1") {
                        hashAlgorithm = "2021256";
                    } else if (algorithmValue === "1.2.643.7.1.1.1.2") {
                        hashAlgorithm = "2021512";
                    } else if (algorithmValue === "1.2.643.2.2.19") {
                        hashAlgorithm = "3411";
                    } else {
                        failCallback("Реализуемый алгоритм не подходит для подписания документа.");
                        return;
                    }

                $.ajax({
                    url: "/Services/SignService.asmx/GetHash",
                    method: "POST",
                    contentType: "application/json; charset=utf-8 ",
                    dataType: "json",
                    data: JSON.stringify({
                        //какие-то данные для определения документа
                        //не забудем проверить на сервере имеет ли пользователь нужные права
                        hashAlgorithm: hashAlgorithm,
                    }),
                    complete: function (response) {
                        //получаем ответ от сервера, подписываем и отправляем подпись на сервер
                        if (response.status === 200) {
                            CryptographyObject.signHash(response.responseJSON,
                                function(data) {
                                    $.ajax({
                                        url: CryptographyObject.signServiceUrl,
                                        method: "POST",
                                        contentType: "application/json; charset=utf-8",
                                        dataType: "json",
                                        data: JSON.stringify({
                                            Signature: data.Signature,
                                            //какие-то данные для определения файла
                                            //не забудем про серверную валидацию и авторизацию
                                        }),
                                        complete: function(response) {
                                            if (response.status === 200)
                                                successCallback();
                                            else
                                                failCallback();
                                        }
                                    });
                                },
                                certIndex);
                        } else {
                            failCallback();
                        }
                    }
                });
            });
        } catch (exc) {
            failCallback(exc);
        }
    }

Комментарий: обратите внимание на cadesplugin.async_spawn, в нее передаётся функция-генератор, на которой последовательно вызывается next(), что приводит к переходу к yield.

Таким образом получается некий аналог async-await из C#. Всё выглядит синхронно, но работает асинхронно.

Теперь что происходит на сервере, когда у него запросили hash.

Во-первых необходимо установить nuget-пакет iTextSharp (на момент написания стать актуальная версия 5.5.13)

Во-вторых нужен CryptoPro.Sharpei, он идёт в нагрузку к Крипто ПРО .NET SDK

Теперь можно получать hash

                //определим hash-алгоритм
                HashAlgorithm hashAlgorithm;

                switch (hashAlgorithmName)
                {
                    case "3411":
                        hashAlgorithm = new Gost3411CryptoServiceProvider();
                        break;
                    case "2021256":
                        hashAlgorithm = new Gost3411_2021_256CryptoServiceProvider();
                        break;
                    case "2021512":
                        hashAlgorithm = new Gost3411_2021_512CryptoServiceProvider();
                        break;
                    default:
                        GetLogger().AddError("Неизвестный алгоритм хеширования", $"hashAlgorithmName: {hashAlgorithmName}");
                        return HttpStatusCode.BadRequest;
                }
                //получим hash в строковом представлении, понятном cadesplugin
                string hash;
                using (hashAlgorithm)
                //downloadResponse.RawBytes - просто массив байт исходного PDF файла
                using (PdfReader reader = new PdfReader(downloadResponse.RawBytes))
                {
                    //ищем уже существующие подписи
                    int existingSignaturesNumber = reader.AcroFields.GetSignatureNames().Count;
                    using (MemoryStream stream = new MemoryStream())
                    {
                        //добавляем пустой контейнер для новой подписи
                        using (PdfStamper st = PdfStamper.CreateSignature(reader, stream, '', null, true))
                        {
                            PdfSignatureAppearance appearance = st.SignatureAppearance;
                            //координаты надо менять в зависимости от существующего количества подписей, чтоб они не наложились друг на друга
                            appearance.SetVisibleSignature(new Rectangle(36, 100, 164, 150), reader.NumberOfPages,
                                //задаём имя поля, оно потом понадобиться для вставки подписи
                                $"{SignatureFieldNamePrefix}{existingSignaturesNumber   1}");
                            //сообщаем, что подпись придёт извне
                            ExternalBlankSignatureContainer external =
                                new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
                            //третий параметр - сколько места в байтах мы выделяем под подпись
                            //я выделяю много, т.к. CAdES-X Long Type 1 содержит все сертификаты по цепочке до самого корневого центра
                            MakeSignature.SignExternalContainer(appearance, external, 65536);
                            //получаем поток, который содержит последовательность, которую мы хотим подписывать
                            using (Stream contentStream = appearance.GetRangeStream())
                            {
                                //вычисляем hash и переводим его в строку, понятную cadesplugin
                                hash = string.Join(string.Empty,
                                    hashAlgorithm.ComputeHash(contentStream).Select(x => x.ToString("X2")));
                            }
                        }
                        //сохраняем stream куда хотим, он нам пригодиться, что бы вставить туда подпись
                    }
                }

На клиенте, получив hash от сервера подписываем его

    //certIndex - индекс в массиве сертификатов. На основании именно этого сертификата мы получали алгоритм и формировали hash на сервере
    signHash: function (data, callback, certIndex, failCallback) {
        try {
            cadesplugin.async_spawn(function*() {
                certIndex = certIndex | 0;

                let oSigner = yield cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");

                let cert = CryptographyObject.certificates[certIndex];

                oSigner.propset_Certificate(cert);
                oSigner.propset_Options(cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN);
                //тут надо указать нормальный адрес TSP сервера. Это тестовый от Крипто ПРО
                oSigner.propset_TSAAddress("https://www.cryptopro.ru/tsp/");

                let hashObject = yield cadesplugin.CreateObjectAsync("CAdESCOM.HashedData");

                let certPublicKey = yield cert.PublicKey();
                let certAlgorithm = yield certPublicKey.Algorithm;
                let algorithmValue = yield certAlgorithm.Value;

                if (algorithmValue === "1.2.643.7.1.1.1.1")  {
                    yield hashObject.propset_Algorithm(cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2021_256);
                    oSigner.propset_TSAAddress(CryptographyObject.tsaAddress2021);
                } else if (algorithmValue === "1.2.643.7.1.1.1.2") {
                    yield hashObject.propset_Algorithm(cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2021_512);
                    oSigner.propset_TSAAddress(CryptographyObject.tsaAddress2021);
                } else if (algorithmValue === "1.2.643.2.2.19") {
                    yield hashObject.propset_Algorithm(cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411);
                    oSigner.propset_TSAAddress(CryptographyObject.tsaAddress2001);
                } else {
                    alert("Невозможно подписать документ этим сертификатом");
                    return;
                }
                //в объект описания hash вставляем уже готовый hash с сервера
                yield hashObject.SetHashValue(data.Hash);

                let oSignedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");
                oSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);
                //результат подписания в base64
                let signatureHex =
                    yield oSignedData.SignHash(hashObject, oSigner, cadesplugin.CADESCOM_CADES_X_LONG_TYPE_1);

                data.Signature = signatureHex;
                callback(data);
            });
        } catch (exc) {
            failCallback(exc);
        }
    }

Комментарий: полученную подпись отправляем на сервер (см. выше)

Читайте также:  Как получить электронную подпись?

Ну и наконец вставляем подпись в документ на стороне сервера


//всякие нужные проверки
                //downloadResponse.RawBytes - ранее созданный PDF с пустым контейнером для подписи
                using (PdfReader reader = new PdfReader(downloadResponse.RawBytes))
                {
                    using (MemoryStream stream = new MemoryStream())
                    {
                        //requestData.Signature - собственно подпись от клиента
                        IExternalSignatureContainer external = new SimpleExternalSignatureContainer(Convert.FromBase64String(requestData.Signature));
                    //lastSignatureName - имя контейнера, которое мы определили при формировании hash
                        MakeSignature.SignDeferred(reader, lastSignatureName, stream, external);
                        
                    //сохраняем подписанный файл
                    }
                }

Комментарий: SimpleExternalSignatureContainer — это простейший класс, реализующий интерфейс IExternalSignatureContainer

        /// <summary>
        /// Простая реализация контейнера внешней подписи
        /// </summary>
        private class SimpleExternalSignatureContainer : IExternalSignatureContainer
        {
            private readonly byte[] _signedBytes;

            public SimpleExternalSignatureContainer(byte[] signedBytes)
            {
                _signedBytes = signedBytes;
            }

            public byte[] Sign(Stream data)
            {
                return _signedBytes;
            }

            public void ModifySigningDictionary(PdfDictionary signDic)
            {

            }
        }

Собственно с подписанием PDF на этом всё. Проверка будет описана в продолжении статьи. Надеюсь, она будет…

Внёс исправления из комментария о получении Oid алгоритма подписи. Спасибо

Подпись файла командой из терминал (terminal)

     1. В Терминал (Terminal) переходим в каталог с файлом для подписания и выполняем команду:

/opt/cprocsp/bin/cryptcp -signf -detach -cert -der -strict -thumbprint ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ FILE

где ХХХХ… – хэш сертификата, полученный на шаге 1, а FILE – имя файла для подписания (со всеми расширениями, но без пути).

     2. Команда должна вернуть:

Signed message is created.[ErrorCode: 0x00000000]Будет создан файл электронной подписи с расширением *.sgn – это отсоединенная подпись в формате CMS с кодировкой DER.

Подпись файлов в macos

В macOS файлы можно подписывать в ПО КриптоАрм (стоимость лицензии 2500= руб.), или несложной командой через terminal – бесплатно.

Руководство по настройке компьютера для работы с электронной подписью в браузере.

     1. ОСНОВНЫЕ ПОНЯТИЯ (если есть аббревиатуры, понятия и т.д.):

  • Криптопровайдер – средство защиты криптографической защиты информации. Программа с помощью которой генерируется закрытая часть электронной подписи и которая позволяет производить работу с электронной подписью. Данная галочка проставляется автоматически. 
  • Плагин (модуль) — это программный блок, который встраивается в браузер и расширяет его возможности. В отличие от дополнений плагин, как правило, не имеет интерфейса. Плагины используются для проигрывания видео и аудио в браузере, просмотра PDF-документов, улучшения работы веб-служб, организующих совместную работу в интернете и т. д.

Смена pin-кода контейнера

Пользовательский PIN-код на Рутокен по-умолчанию 12345678, и оставлять его в таком виде никак нельзя. Требования к PIN-коду Рутокен: 16 символов max., может содержать латинские буквы и цифры.

Устанавливаем сертификат с рутокен

     1. Подключаем usb-токен, переходим в  Терминал (Terminal) и выполняем команду:

/opt/cprocsp/bin/csptest -card –enum

     2. Устанавливаем сертификат КЭП с помощью команды в Терминал (Terminal):

/opt/cprocsp/bin/csptestf -absorb -certs

Конфигурируем CryptoPro для работы c сертификатами ГОСТ Р 34.10-2021

Установка apple automator script

Чтобы каждый раз не работать с терминалом, можно один раз установить Automator Script, с помощью которого подписывать документы можно будет из контекстного меню Finder. Для этого 

Установка специального браузера chromium-gost

     1. Для работы с государственными порталами потребуется браузер – Chromium-GOST.

По ссылке скачивается определенная сборка браузера (71.0.3578.98), так как в более новых версиях не гарантируется корректная работа в ЛК ФНС.

     2. После скачивания файл браузера появится в папке Downloads (Загрузки), запускать его не требуется, просто перетаскиваем на панель уведомлений для удобства.

     3. Переходим к настройке плагинов ниже.

Устранение сбоев

     1. Переподключаем usb-токен и проверяем что он виден с помощью команды в Терминал (Terminal):

sudo /opt/cprocsp/bin/csptest -card -enum

     2. Очищаем кеш браузера за все время, для чего в адресной строке Chromium-Gost набираем:

chrome://settings/clearBrowserData

     3. Переустанавливаем сертификат КЭП с помощью команды в Терминал (Terminal):

/opt/cprocsp/bin/csptestf -absorb –certs

     4. Проверить статус лицензии КриптоПро CSP можно командой:

/opt/cprocsp/sbin/cpconfig -license –view

     5. Активировать лицензию КриптоПро CSP можно командой:

sudo /opt/cprocsp/sbin/cpconfig -license -set серийный_номер_лицензии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector