openssl php extension docker

Docker-образы с поддержкой ГОСТ-сертификатов в openssl, curl, php, nginx

В этой статье я расскажу о том, как я решал задачу об интеграции в тестовом режиме с сервисами, которые работают с использованием алгоритмов, определенных ГОСТ Р 34.10-2001 (устарел) и ГОСТ Р 34.10-2012. Приведу примеры некоторых проблем, с которыми столкнулся при решении задачи, дам ссылки на готовое решение и покажу несколько примеров их использования.

Причины

Рабочим решением оказалась сборка OpenSSL 1.1.0g + вынесенный в отдельно подключаемый динамический движок GOST-engine. В интернете часто встречается упоминание, что некая российская компания приложила усилия по его разработке, но в самом репозитории нет сведений об авторах продукта. Пользуясь случаем, выражаю авторам благодарность за движок в open source. На этой странице сказано, что до OpenSSL 1.1.0 использовался встроенный движок GOST, сейчас для GOST используется сторонний от OpenSSL продукт. Судя по конфигурации, скорее всего, это одна и та же библиотека.

Сборка OpenSSL, GOST-engine, cURL

Сборка стороннего продукта для тех, кто делает это редко, может быть нетривиальной задачей. Для сборки OpenSSL, GOST-engine и cURL пришлось разобраться с кучей опций и перепробовать несколько комбинаций версий. Если в Dockerfile вы заметите странное, то, скорее всего, это осталось от таких экспериментов.

Я зафиксировал все версии проектов для сборки, чтобы исключить ситуацию, что из-за обновления что-то перестанет работать. Например, я собирал OpenSSL 1.1.0h + GOST-engine и команда openssl ciphers не содержала GOST-алгоритмов, хотя openssl engine показывала GOST-engine в списке. Указав предыдущую версию OpenSSL 1.1.0g, все работало, как ожидалось. Это было очень странно, я повторил это еще раз, потом пытался выяснить причины, но в итоге решил остаться на 1.1.0g.

Собирая сам GOST-engine, я не сразу обратил внимание на наличие файла INSTALL.md в master-ветке, потому что собирал из ветки openssl_1_1_0 по неизвестно откуда взятой документации. Та версия собиралась с кастомной сборкой OpenSSL командой

Но master-ветка так собираться перестала, появились ошибки об отсутствии DOPENSSL_ROOT_DIR и подобное. В итоге решение было найдено и зафиксировано.

Для сборки cURL с кастомной сборкой OpenSSL гораздо больше документации, тем не менее, документация успевала устаревать, и с опциями пришлось много экспериментировать.
Результат работы выложен здесь.
Образ запушен в Docker Hub.

Примеры использования OpenSSL + GOST-engine

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

Для начала можно убедиться, что алгоритмы GOST2012-GOST8912-GOST8912 и GOST2001-GOST89-GOST89 есть в списке поддерживаемых:

Если вам известен хост, который работает по HTTPS на основе ГОСТ-алгоритмов, то посмотреть его сертификат и попробовать подключиться можно командой:

Создать закрытый ключ и сертификат по ГОСТ Р 34.10-2012:

Подписать файл ранее созданными сертификатами:

Извлечь содержимое подписанного файла, сертификатом, который был подписан самим собой:

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

Программа cURL в использовании не изменилась, просто поддерживает хосты с ГОСТ-сертификатами.

Использование образа в работе с языками программирования

Если язык программирования позволяет исполнять установленные в системе программы, то задача использования ГОСТ-алгоритмов проще всего решается копированием бинарников собранных openssl и curl в конце Dockerfile языка программирования с использованием multi-stage build. Например:

Поддержка ГОСТ-алгоритмов в PHP

Поддержка ГОСТ-сертификатов в nginx

Возможность работать из языков программирования это уже много, но хотелось еще две возможности:

Заключение

Мной изучена проблема работы с ГОСТ-алгоритмами в системах Linux, предоставлено решение в виде docker-образов, все это сопровождено документацией и примерами. Решение оформлено в виде репозитория на GitHub.

Собирая образ самостоятельно, вы можете убедиться, что в код не попали злонамеренные правки, потому что сборка происходит только из открытого кода, который доступен для просмотра всем желающим. Тем не менее, это не гарантирует, что в нем нет ошибок и уязвимостей. Использование проприетарных сертифицированных средств так же не гарантирует отсутствие ошибок и уязвимостей, но к тому же их код от вас закрыт.

Источник

Openssl php extension docker

openssl php extension docker. Смотреть фото openssl php extension docker. Смотреть картинку openssl php extension docker. Картинка про openssl php extension docker. Фото openssl php extension docker

Easy installation of PHP extensions in official PHP Docker images

This repository contains a script that can be used to easily install a PHP extension inside the official PHP Docker images.

The script will install all the required APT/APK packages; at the end of the script execution, the no-more needed packages will be removed so that the image will be much smaller.

You have two ways to use this script within your Dockerfile s: you can download the script on the fly, or you can grab it from the mlocati/php-extension-installer Docker Hub image. With the first method you are sure you’ll always get the very latest version of the script, with the second method the process is faster since you’ll use a local image.

For example, here are two Dockerfile s that install the GD and xdebug PHP extensions:

Downloading the script on the fly

Copying the script from a Docker image

When building locally, be sure you have the latest version of the mlocati/php-extension-installer image by running:

otherwise the COPY instruction could use a previously downloaded, outdated version of the image stored in the local docker cache.

Installing specific versions of an extension

The script also supports resolving compatible versions by prefixing the version with a caret ( ^ ). For example:

TIP: When the latest version available on PECL is not stable, and you want to keep the last stable version, force it by suffixing the extension’s name with the stable state. For example:

You can also install composer, and you also can specify a major version of it, or a full version.

Supported PHP extensions

ExtensionPHP 5.5PHP 5.6PHP 7.0PHP 7.1PHP 7.2PHP 7.3PHP 7.4PHP 8.0PHP 8.1
amqp
apcu
apcu_bc
ast
bcmath
blackfire
bz2
calendar
cmark
csv
dba
decimal
ds
enchant
ev
event
excimer
exif
ffi
gd
gearman
geoip
geospatial
gettext
gmagick
gmp
gnupg
grpc
http
igbinary
imagick
imap
inotify
interbase
intl
ioncube_loader
jsmin
json_post
ldap
lzf
mailparse
maxminddb
mcrypt
memcache
memcached
mongo
mongodb
mosquitto
msgpack
mssql
mysql
mysqli
oauth
oci8
odbc
opcache
opencensus
parallel*
pcntl
pcov
pdo_dblib
pdo_firebird
pdo_mysql
pdo_oci
pdo_odbc
pdo_pgsql
pdo_sqlsrv*
pgsql
propro
protobuf
pspell
pthreads*
raphf
rdkafka
recode
redis
seaslog
shmop
smbclient
snmp
snuffleupagus
soap
sockets
solr
spx
sqlsrv*
ssh2
stomp
swoole
sybase_ct
sysvmsg
sysvsem
sysvshm
tensor
tidy
timezonedb
uopz
uploadprogress
uuid
vips*
wddx
xdebug
xhprof
xlswriter
xmldiff
xmlrpc
xsl
yac
yaml
yar
zip
zookeeper
zstd

Number of supported extensions: 113

PS: the pre-installed PHP extensions are excluded from this list. You can list them with the following command (change php:7.2-cli to reflect the PHP version you are interested in):

You can configure the behavior of the script, as well as fine-tune some extensions in order fit your needs, by using environment variables.

Here’s the list of all the supported environment variables:

Some extensions have special requirements:

ExtensionRequirements
parallelRequires images with PHP compiled with thread-safety enabled ( zts ).
pdo_sqlsrv• Not available in alpine3.7 docker images
• Not available in alpine3.8 docker images
• Not available in bullseye docker images
pthreadsRequires images with PHP compiled with thread-safety enabled ( zts ).
sqlsrv• Not available in alpine3.7 docker images
• Not available in alpine3.8 docker images
• Not available in 7.1-alpine3.9 docker images
• Not available in 7.1-alpine3.10 docker images
• Not available in bullseye docker images
vips• Not available in alpine3.7 docker images
• Not available in alpine3.8 docker images
• Not available in alpine3.9 docker images
• Not available in jessie docker images

How do I know which Linux distribution I am using?

You can run this command:

When submitting a pull request, a GitHub Action is executed to check if affected PHP extensions actually work (see below).

Furthermore, we also check that new versions of extensions in the PECL repository will still work. This is done on a scheduled basis with another GitHub Action.
In case of failure, a message is sent to a Telegram Channel.
Feel free to subscribe to it to receive failure notifications.

Before submitting any pull request, you should execute the lint script in the scripts directory (or lint.bat on Windows).

If you don’t do that, and if there’s a coding style error, you’ll see that the Check shell coding style and/or the Check PHP coding style GitHub Actions will fail.

The error will be something like this:

Adding support to a new PHP extension?

See this pull request for an example.

Changing the supported PHP versions for an already supported PHP extension?

See this pull request for an example.

Improving code for an already supported extension?

If you change some code that affects one or more extensions, please add a line with Test: extension1, extension2 to the message of one of the pull request commits. That way, the test jobs will check the extension even if you don’t touch the data/supported-extensions file.

Here’s an example of a commit message:

Tests only check the installation of a single PHP extension at a time. If you want to test installing more PHP extensions at the same time, use a commit message like this:

See this pull request for an example.

PHP requirements and configure options

Источник

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

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