Dockerでlamp環境を構築しようとする場合、個人の方が公開されている情報が多くとても助かります。 案件によっては、phpで暗号化、複合化が必要になるケースも出てきます。
実現する方法を探していると、Dockerfileに下記と追加すればmcrypt
が使えるという情報も見受けられます。
RUN docker-php-ext-install -j$(nproc) mcrypt
しかし、PHP7.2以降では、次のようなエラーで有効に出来ません。
error: /usr/src/php/ext/mcrypt does not exist
今回はその理由も踏まえて、暗号化を有効にする方法を記載します。
PHP7.2以降での暗号化について
PHPのバージョン7.2以降は、暗号化の処理をOpenSSLで実装する事が推奨されています。
それは次のような回答によるものだと思われます。
mcrypt 拡張モジュールは十年近くにわたって放置されており、極めて使いづらいものです。 そこで、この拡張モジュールを非推奨にしました。かわりに OpenSSL を使いましょう。 mcryptは PHP 7.2 でコアから削除されて、PECL に移る予定です。
mcrypt自体がアップデートされていない古いモジュールのため、利便性も(恐らく)安全性に問題があるようです。
PHP: PHP 7.1.x で推奨されなくなる機能 - Manual
PECLとは
PHPの拡張モジュールを管理するリポジトリです。
PHPユーザーには馴染みがある、PEARのラッパーのような扱いのようです。
PHP: PECL インストール入門 - Manual
PECL :: The PHP Extension Community Library
本来は、php.ini
に追加します。
Dockerのコンテナの場合は、docker-php-ext-enable
で追加したモジュールを有効にする事で使えるようになります。
適用用法
方法は2種類あります。
- OpenSSLで暗号化する(推奨)
- PECLでmcryptモジュールを追加する
今回はPHPコンテナの7.2-appache
を使用します。
コンテナ内のOSはDebian
系のようですので、他のディストリビューションの場合は別途合わせて下さい。
OpenSSLで暗号化する
linuxにapt-get
でopensslをインストールします。
Dockerfile
RUN apt-get update RUN apt-get install -y openssl
PECLでmcryptモジュールを追加する
peclでmcryptモジュールをインストールします。
18年12月時点では、peclで管理するmcryptモジュールの安定板は1.0.1
なので、インストール時に安定板のバージョンを指定しています。
Dockerfile
RUN pecl install mcrypt-1.0.1 RUN docker-php-ext-enable mcrypt