Обновлено 01.02.2017

Добрый день уважаемые читатели и подписчики блога, сегодня я хочу вам рассказать как производится установка крипто про csp и php расширений на Centos 7. Кто не в курсе Крипто про это программный комплекс криптографических утилит, созданный на основе CA Windows, но под российские стандарты. Его основные функции, это организация структуры PKI и работа с ЭЦП (электронно-цифровыми подписями). Сама установка crypto pro csp и cadescom в операционных системах Windows дело очень простое, а вот в терминале CentOS 7, уже повеселее. Ниже мы рассмотрим подробную инструкцию, как это делать.
Ставлю расширение под Ubuntu server 14×64
Есть инструкция на сайте:
http://cpdn.cryptopro.ru/default.asp?url=content/cades/plugin-installation.html
Для сборки расширения libphpcades требуется:
Установить пакеты libboost-dev и php-dev из репозитория пакетов (сделал)
Установить КриптоПро CSP версии 4.0 или выше (сделал)
Установить пакет cprocsp-pki-2.0.0-cades.rpm и cprocsp-devel из состава КриптоПро ЭЦП SDK !!!
Вот тут затык, там только есть пакет devel а вот cades в архиве нет… что делать?
Поэтому дальше по инструкции не могу двигаться, не появились файлы для компиляции расширения.
Может кто-то ставил это расширение?
Нужно для проверки цифровых подписей.
Подписываю файл в терминале с помощью команды
csptestf -sfsign -sign -detached -add -in in.txt -out out.sgn
-base64 -my 'certificate_name' -password some_password -alg GOST94_256В результате получаю открепленную подпись.
При вызове команды в php скрипте с помощью метода shell_exec() возникает ошибка при получении сертификата, т.к. локальные сертификаты недоступны для пользователя www-data.
Есть возможность подписать файл в php скрипте сертификатом другого пользователя или сделать сертификат доступным для всех пользователей?
Сертификат установлен в личное хранилище локального пользователя uMy.
Добавлять права в /etc/sudoers на выполнение команды csptestf под sudo для пользователя www-data нельзя.
Проверял подписывания файла в bash скрипте, в котором выполняется смена пользователя и подпись файла. При вызове bash скрипта в php возникает ошибка.
При установке сертификата в хранилище mCA, mMy также возникает ошибка при подписывании файла в php скрипте.
КриптоПро ЭЦП SDK – инструментарий разработчика для создания клиентских и серверных приложений, использующих Стандарт предприятия КриптоПро ЭЦП, в соответствии с рекомендациями CAdES (“CMS Advanced Electronic Signatures”, ETSI Standard, RTS/ESI-000040, TS 101 733 V1.8.3) и с учётом использования российских криптографических алгоритмов.
КриптоПро ЭЦП SDK сертифицирован ФСБ России в составе ПАК «Службы УЦ» версии 1.5 по классам защиты КС2 и КС3.
Интерфейс программирования приложений
Предназначен для создания и проверки сообщений, подписанных усовершенствованной подписью и удовлетворяющих стандарту CAdES (ETSI TS 101 733). На настоящий момент интерфейс поддерживает создание подписей типа CAdES BES, CADES-T и CAdES-X Long Type 1.
Интерфейс клиентских приложений имеет следующие особенности:
- Поддерживаемые платформы:
- Microsoft Windows XP / 2003 / Vista / 2008 / W7 / 2008 R2 / W8 / 2012 / W8.1 / 2012 R2 / W10 / 2016,
- ОС семейства Linux, удовлетворяющих LSB 3.1 и выше,
- FreeBSD 7.x и выше,
- AIX 5.3 и 6.x,
- Solaris 10 и выше,
- Apple iOS 4.2 и выше,
- Apple MacOS 10.6 и выше.
- Содержит интерфейс языка С, спроектированный таким образом, чтобы дополнять или замещать функции Crypto API для работы с подписанными сообщениями.
- Содержит компоненту COM, расширяющую интерфейс Microsoft CAPICOM.
- Содержит КриптоПро ЭЦП Browser plug-in, предоставляющий интерфейс языка JavaScript для реализации криптографических операций в браузерах. Поддерживает создание и проверку подписи, шифрование и создание запросов на сертификат.
- Расширение для языка PHP, предоставляющее интерфейс, аналогичный КриптоПро ЭЦП Browser plug-in, для использования в серверных приложениях на языке PHP.
- Для настройки клиентских модулей в пределах организации или подразделения можно использовать групповые политики.
Данный интерфейс позволяет реализовать механизм работы с усовершенствованной подписью из прикладного программного обеспечения. Простота интерфейса дает возможность быстро расширить функциональность существующей системы, а возможность настройки с помощью групповых политик значительно упрощает процесс встраивания, развёртывания и администрирования клиентских модулей.
Подробное описание КриптоПро ЭЦП SDK приведено в Руководстве разработчика КриптоПро ЭЦП SDK.
Страница для печати
На web-сервере должен быть установлен PHP 7.2
На нашем сервере установлено Ubuntu Server 18.04.4 (64-bit)
1) Установить пакеты:
команда в терминале:
sudo apt-get install libboost-dev php-dev libxml2-dev
tar xvf linux-amd64_deb.tgz
и установить минимальный набор пакетов КриптоПро CSP:
cd linux-amd64_deb sudo ./install.sh
tar xvf cades_linux_amd64.tar.gz
и установить следующие пакеты:
cd cades-linux-amd64 # dpkg -i \ cprocsp-pki-cades_2.0.0-1_amd64.deb \ lsb-cprocsp-devel_5.0.11535-4_all.deb \ cprocsp-pki-phpcades_2.0.0-1_amd64.deb
4) В файле: /opt/cprocsp/src/phpcades/Makefile.unix
указать путь к директории с исходниками PHP в переменной PHPDIR.
5) Скопировать файл патча для PHP 7 в директорию с исходниками расширения:
# cp ./php7_support.patch /opt/cprocsp/src/phpcades
6) Установить g++-6 и сделать g++-6 версией для g++ по умолчанию:
# apt-get install g++-6 # update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-6 10 # update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 10 # update-alternatives --config g++
7) Перейти в директорию с исходниками расширения:
cd /opt/cprocsp/src/phpcades
выполнить сборку расширения:
patch -p0 < ./php7_support.patch eval `/opt/cprocsp/src/doxygen/CSP/../setenv.sh --64`; make -f Makefile.unix
9) Создать в директории с расширениями символическую ссылку на собранную библиотеку libphpcades.so:
$ ln -s файлИсточник файлСсылки
10) В файле php.ini добавить расширение:
extension=libphpcades.so
11) Перезагрузить сервер и проверить выполнение тестового скрипта (сохранить в php файл), который проверяет возможность работы с собранной библиотекой из php:
<?php
ini_set("log_errors", 1);
ini_set ('display_errors', 1);
error_reporting (E_ALL);
try
{ $sd = new CPSignedData(); $content = "test content"; $sd = new CPSignedData(); $sd->set_Content($content); printf("test init OK\n");
}
catch (Exception $e)
{ printf($e->getMessage());
}
?>sudo /opt/cprocsp/bin/amd64/certmgr -inst -store mRoot -file "/var/tmp/root_mks.cer" sudo /opt/cprocsp/bin/amd64/certmgr -inst -store mRoot -file "/var/tmp/root_guc.cer"
Или через curl:
sudo curl http://e-trust.gosuslugi.ru/Shared/DownloadCert?thumbprint=4BC6DC14D97010C41A26E058AD851F81C842415A|sudo /opt/cprocsp/bin/amd64/certmgr -inst -store mRoot -stdin sudo curl url-нужногосертификата|sudo /opt/cprocsp/bin/amd64/certmgr -inst -store mRoot -stdin


rozen
- Сообщения: 169
- Зарегистрирован: 25 мар 2015, 12:11
- Имя: Андрей
- Откуда: Красноярск
Re: КриптоПро расширение для PHP 7
Расширение заработало, но при добавлении сертификата 502 Bad Gateway
В логах сервера:
Код: Выделить всё
2020/10/28 08:58:22 [error] 1067#1067: *4188 recv() failed (104: Connection reset by peer) while reading response header from upstream,
client: 10.89.*.*, server: cto.krw.rzd, request: "POST /rukovoditel/index.php?module=users/signature_account&action=update HTTP/2.0",
upstream: "fastcgi://unix:/var/run/php/php7.4-fpm.sock:", host: "cto.krw.rzd",
referrer: "https://cto.krw.rzd/rukovoditel/index.php?module=users/signature_update"Проверка настройки показывает: test init OK
Сертификаты добавлены.
В системных логах такое:
Код: Выделить всё
Oct 29 10:03:44 10 ool www: <capi10>CryptEnumOIDInfo!failed: LastError = 0xEA
Oct 29 10:03:44 10 ool www: <capi10>CryptVerifySignatureW!failed: LastError = 0x80090006
Oct 29 10:03:44 10 ool www: <capi20>CryptVerifyCertificateSignature!failed: LastError = 0x80090006
Oct 29 10:03:44 10 ool www: <capi20>CertOpenStore!failed: LastError = 0x2
Oct 29 10:03:44 10 ool www: <capi20>CertOpenStore!failed: LastError = 0x2
Oct 29 10:03:49 10 ool www: <capi10>CryptEnumOIDInfo!failed: LastError = 0xEA
Oct 29 10:03:49 10 ool www: <capi10>CryptVerifySignatureW!failed: LastError = 0x80090006
Oct 29 10:03:49 10 ool www: <capi20>CryptVerifyCertificateSignature!failed: LastError = 0x80090006
Oct 29 10:03:49 10 ool www: <capi20>CertOpenStore!failed: LastError = 0x2
Oct 29 10:03:49 10 ool www: <capi20>CertOpenStore!failed: LastError = 0x2Решил проверить хранилище сертификатов: с нем пусто.
Но добавление проходит без ошибок. Вот только куда?
Код: Выделить всё
/opt/cprocsp/bin/amd64/certmgr -list
Certmgr 1.1 (c) "КРИПТО-ПРО", 2007-2020.
Программа для работы с сертификатами, CRL и хранилищами.
=============================================================================
Список сертификатов пуст
Требуемый сертификат не существует.
rozen
- Сообщения: 169
- Зарегистрирован: 25 мар 2015, 12:11
- Имя: Андрей
- Откуда: Красноярск
Re: КриптоПро расширение для PHP 7
Сообщение
rozen » 30 окт 2020, 04:06
Сейчас так: сертификатов больше. Показал один.
Код: Выделить всё
sudo /opt/cprocsp/bin/amd64/certmgr -list -store mRoot
[sudo] password for rozen:
Certmgr 1.1 (c) "КРИПТО-ПРО", 2007-2020.
Программа для работы с сертификатами, CRL и хранилищами.
=============================================================================
1-------
Издатель : E=dit@minsvyaz.ru, C=RU, S=77 Москва, L=г. Москва, STREET="улица Тверская, дом 7", O=Минкомсвязь России, OGRN=1047702026701, INN=007710474375, CN=Минкомсвязь России
Субъект : E=uc@mil.ru, OGRN=1037700255284, INN=007704252261, C=RU, S=77 г. Москва, L=Москва, STREET="ул. Знаменка, д. 19", OU=4 центр (удостоверяющий) войсковой части 31659, O=Министерство обороны Российской Федерации, CN=Министерство обороны Российской Федерации
Серийный номер : 0x3252B37400000000044E
Хэш SHA1 : 1e4977c9cad2358853391267d4e5d47e4ca7ba6f
Идентификатор ключа : 650b083aa72a8dc7a6449682b97df99d6b8e2aa8
Алгоритм подписи : ГОСТ Р 34.11-2012/34.10-2012 256 бит
Алгоритм откр. кл. : ГОСТ Р 34.10-2012 (512 бит)
Выдан : 31/07/2020 11:15:02 UTC
Истекает : 31/07/2035 11:15:02 UTC
Ссылка на ключ : Нет
URL сертификата УЦ : http://reestr-pki.ru/cdp/guc_gost12.crt
URL списка отзыва : http://reestr-pki.ru/cdp/guc_gost12.crl
URL списка отзыва : http://company.rt.ru/cdp/guc_gost12.crl
URL списка отзыва : http://rostelecom.ru/cdp/guc_gost12.crlЧто не работает – не понимаю. Либо модуль сбоит, но проверку проходит. Либо … либо.
Кстати, тест от КриптоПро не проходит.
Код: Выделить всё
Cannot find object or property. (0x80092004)TEST FAIL Код: Выделить всё
PHP Fatal error: Uncaught Error: Class 'CPStore' not found 
rozen
- Сообщения: 169
- Зарегистрирован: 25 мар 2015, 12:11
- Имя: Андрей
- Откуда: Красноярск
Re: КриптоПро расширение для PHP 7
Сообщение
rozen » 30 окт 2020, 07:22
Выполнение через командную строку кода:
Код: Выделить всё
<?php
ini_set("log_errors", 1);
ini_set ('display_errors', 1);
error_reporting (E_ALL);
try
{ $sd = new CPSignedData(); $content = "test content"; $sd = new CPSignedData(); $sd->set_Content($content); printf("test init OK\n");
}
catch (Exception $e)
{ printf($e->getMessage());
}
?>Ответ:
Код: Выделить всё
Fatal error: Uncaught Error: Class 'CPSignedData' not found in /var/www/html/site/csp.php:6
rozen
- Сообщения: 169
- Зарегистрирован: 25 мар 2015, 12:11
- Имя: Андрей
- Откуда: Красноярск
Re: КриптоПро расширение для PHP 7
Сообщение
rozen » 02 ноя 2020, 12:38
Продолжу:
Сделал:
Код: Выделить всё
php -i|grep php.ini
Configuration File (php.ini) Path => /etc/php/7.4/cli
Loaded Configuration File => /etc/php/7.4/cli/php.iniЭто странно, так как phpinfo показывает
Код: Выделить всё
Loaded Configuration File /etc/php/7.4/fpm/php.iniЯ вносил extension=libphpcades.so в файл /etc/php/7.4/fpm/php.ini
Сейчас внес в /etc/php/7.4/cli/php.ini
Делаю проверку:
Код: Выделить всё
sudo php -f /opt/cprocsp/src/phpcades/test_extension.php
[sudo] password for rozen:
Cannot find object or property. (0x80092004)TEST FAILОтвет поддержки КриптоПро:
Код: Выделить всё
>>sudo php -f /opt/cprocsp/src/phpcades/test_extension.php
>>[sudo] password for rozen:
>>Cannot find object or property. (0x80092004)TEST FAILРасширение корректно работает.
Если Вы запускаете проверочный скрипт через sudo, то под пользователем root у Вас должен быть установлен личный сертификат с привязкой к соответствующему ключевому контейнеру с указанной строкой (по умолчанию в скрипте – “Test”) в поле “Субъект” сертификата.
Вы можете сменить строку в скрипте или пользователя для прохождения проверки с помощью тестового скрипта.

Евгений
- Сообщения: 446
- Зарегистрирован: 11 июл 2016, 13:21
- Имя: Евгений
- Откуда: Петропавловск-Камчатский
Re: КриптоПро расширение для PHP 7
Сообщение
Евгений » 12 апр 2022, 02:18
rozen писал(а): ↑
20 июл 2020, 11:42
Добрый день!
Кто-то установил расширение для PHP от КриптоПро?
Подскажите пожалуйста, какой версией php у вас получилось работать с ЭЦП на сервере Руководитель?
У меня PHP Version 7.3.31-1~deb10u1
Я настроил модуль ЭЦП, сертификаты видны в списке выбора, но при нажатии на кнопку “Выбрать” сертификат не подключается, выпадает ошибка: “при проверке токена, некорректные данные: []”
Как установить Крипто про и расширения для языка PHP
И так, напоминаю, что мы с вами уже слегка знакомились с crypto pro, точнее с его последствиями, после установки, а именно решалась ошибка 80072EE2 при обновлении Windows, где приходилось его удалять и вычищать систему, сегодня задача обратная, установка, да не просто, а в терминале Centos 7. Ставить мы будем специальное расширение. Расширение для языка PHP предназначено для встраивания криптографических операций в серверные приложения на языке PHP с использованием сертифицированного СКЗИ КриптоПро CSP.
Расширение предоставляет программный интерфейс, аналогичный КриптоПро ЭЦП Browser plug-in, для выполнения следующих криптографических операций:
- работа с сертификатами;
- создание и проверка подписи форматов CAdES BES, CAdES-T, CAdES-X Long Type 1;
- шифрование и расшифрование данных.
Вот по этой ссылке http://cpdn.cryptopro.ru/default.asp?url=content/cades/phpcades.html, выложен алгоритм установки крипто про csp на CentOS 7, но в очень сжатом виде, прочитав его у меня осталось очень много вопросов, я если честно был не приятно удивлен, что на этот вопрос, практически нет никакой информации, особенно на официальном сайте.
Собираем libphpcades
Для того, чтобы собрать libphpcades, у вас во первых, должна быть установлена CentOS 7. Далее мы должны установить пакеты boost-devel и php-devel, приступаем, добавляем репозиторий и ставим boost-devel.
sudo wget http://repo.enetres.net/enetres.repo -O /etc/yum.repos.d/enetres.repo
sudo yum install boost-devel
Следующим шагом, мы ставим пакет php-devel с помощью команды.
Далее ставим lsb пакет (Linux Standard Base)
Далее переходим в папку root, если вы не в ней, с помощью команды
И скачиваем дистрибутив крипто про csp 4
wget https://www.cryptopro.ru/sites/default/files/private/csp/40/9842/linux-amd64.tgz
Остальные версии можно посмотреть на официальном сайте Крипто ПРО. Для скачивания вам нужно будет зарегистрироваться.
Далее распаковываете архив с помощью tar и даете возможность запускать скрипт install.sh
Все теперь, можно устанавливать самый главный компонент libphpcades, сам крипто про csp 4
Далее после установки, прописываем переменные окружения, или перемещаемся в папку /opt/cprocsp/
export PATH=”$PATH:$(ls -d /opt/cprocsp/{s,}bin/*|tr ‘\n’ ‘:’)”
Затем до установим, еще два пакета cprocsp-rdr-gui-gtk и lsb-cprocsp-devel
yum install cprocsp-rdr-gui-gtk-64-4.0.0-4.x86_64.rpm yum install lsb-cprocsp-devel-5.0.0-4.noarch
Затем следует установить пакет cprocsp-pki-2.0.0-cades.rpm из состава КриптоПро ЭЦП SDK. Скачиваем архив, лтбо вручную и потом через ssh передаем, либо скачиваем через wget. Скачивайте КриптоПро ЭЦП SDK 2.0, именно ее, так как она содержит пакет cprocsp-pki-2.0.0-cades.rpm.

https://www.cryptopro.ru/sites/default/files/products/cades/current_release_2_0/cades_linux_amd64.tar.gz
Посмотреть список пакетом, можно командой
- lsb-cprocsp-kc1-64-4.0.0-4.x86_64
- cprocsp-pki-cades-2.0.0-1.x86_64
- lsb-cprocsp-base-4.0.0-4.noarch
- lsb-cprocsp-capilite-64-4.0.0-4.x86_64
- cprocsp-curl-64-4.0.0-4.x86_64
- lsb-cprocsp-devel-5.0.0-4.noarch
- lsb-cprocsp-rdr-64-4.0.0-4.x86_64
- cprocsp-rdr-gui-gtk-64-4.0.0-4.x86_64
- cprocsp-pki-plugin-2.0.0-1.x86_64
Далее делаем следующее.
- В файле /opt/cprocsp/src/phpcades/Makefile.unix указать путь к исходным текстам нужной версии PHP в переменной PHPDIR, но перд этим вы должны скачать исходные файлы php, нужной версии. Смотрим какая версия php у вас установлена.
PHP 5.6.30 (cli) (built: Jan 19 2017 08:09:42)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
You have mail in /var/spool/mail/root

Затем идете на официальный сайт php http://php.net/releases/ и находите там нужную вам версию, у меня это 5.6.3

У меня файл Makefile.unix выглядит вот так:

Теперь находясь в /opt/cprocsp/src/phpcade в зависимости от разрядности системы выполнить:
Для 64 битной системы
eval `/opt/cprocsp/src/doxygen/CSP/../setenv.sh –64`; make -f Makefile.unix
или для 32 битной системы
eval `/opt/cprocsp/src/doxygen/CSP/../setenv.sh –32`; make -f Makefile.unix
У вас должна начаться собираться libphpcades, но бывают и грабли как в моем случае. Были вот такого типа:
или вот такое
[root@bx1 phpcades]# eval `/opt/cprocsp/src/doxygen/CSP/../setenv.sh –64`; make -f Makefile.unix
No compiler specified… trying to guess
/opt/cprocsp/src/doxygen/CSP/../setenv.sh: line 107: type: g++: not found
/opt/cprocsp/src/doxygen/CSP/../setenv.sh: line 125: type: clang++: not found
Nothing is found
g++ -DLINUX -DUNIX -DHAVE_LIMITS_H -I/ -I/cpcsp -I/pki -I/pki/atl -I/pki/cppcades -I/pki/cplib -I/root/php -I/root/php/main -I/root/php/Zend -I/root/php/TSRM -DSIZEOF_VOID_P= -fPIC -DPIC -c -o PHPCadesCPSigners.o PHPCadesCPSigners.cpp
make: g++: Command not found
make: *** [PHPCadesCPSigners.o] Error 127
Error 127 решается установкой yum install gcc-c++
Еще может быть ошибка error: expected constructor, destructor, or type conversion before, тут есть синтаксическая ошибка смотрите файл.
- Узнать путь к расширениям в вашей системе:
php -i | grep extension_dir
- Cоздать в директории с расширениями символическую ссылку на собранную libphpcades
- В файле php.ini добавить расширение:
Теперь давайте посмотрим лицензию Крипто ПРО CSP с помощью команды
Установить лицензию Крипто ПРО CSP в CentOS 7, можно вот так.
cpconfig -license -set ваша_лицензия






