Apache 2.2.15 → 2.4.25   PHP 5.6 → 7 へアップデート on CentOS 6.9

Apache 2.2.15 → 2.4.25 PHP 5.6 → 7 へアップデート on CentOS 6.9

概要

PHP5 利用していますか?

PHP5.6 のセキュリティサポート期限は 31 Dec 2018
Supported Versions 参考

Apache/PHP アップデート、腰が重かったのですが
個人契約サーバなら誰にも迷惑かけないしいいか ♪

ということで
放置気味にされた Apache2.2.15/PHP5.6 の個人のサーバを
アップデートすべく実施した内容をまとめました。

三行まとめ

  • SoftwareCollection を利用し現存 Apache/PHP を残したまま、アップデート版を共存させ切り替え。のち古い Apache/PHP 削除
  • 必要モジュール (MySQLi, PHPRedis)インストール
  • PHP 7 で廃止された PHP5.6 機能やシンタックスを修正

SoftwareCollection とは?

公式サイト によると
以下の様に説明されています。

  • 英語

    Software Collections give you the power to build, install, and use multiple versions of software on the same system, without affecting system-wide installed packages.

  • 日本語

    ソフトウェアコレクションは、システム全体でインストールされたパッケージに影響を与えることなく、同じシステム上に複数のバージョンのソフトウェアを構築、インストール、使用する能力を提供します。

同じシステム上に複数バージョンのソフトウェアをインストールできる様になる、
ということです。

SoftwareCollection インストール

1
$ sudo yum install centos-release-scl

httpd24 関連のモジュールインストール

1
2
3
4
$ sudo yum-config-manager --enable rhel-server-rhscl-6-rpms
$ sudo yum install httpd24-httpd httpd24-httpd-devel httpd24-mod_proxy_html httpd24-mod_session httpd24-mod_ssl
$ sudo scl enable httpd24 bash
$ sudo service httpd graceful
1
2
3
$ httpd -v
Server version: Apache/2.4.25 (Red Hat)
Server built: Apr 12 2017 06:35:50

RHSCL リポジトリ利用可設定

1
$ sudo yum-config-manager --enable rhel-server-rhscl-7-rpms

php7 関連モジュールをインストール

1
2
3
4
5
6
7
8
# yum install -y scl-utils
# yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm
# yum install -y php70
# yum install -y php70-php-mysqlnd
# yum install -y php70-php-curl
# yum install -y php70-php-simplexml
# yum install -y php70-php-devel php70-php-gd php70-php-json php70-php-mcrypt php70-php-mbstring php70-php-opcache php70-php-pear php70-php-pecl-apcu php70-php-pecl-geoip php70-php-pecl-imagick php70-php-pecl-json-post php70-php-pecl-memcache php70-php-pecl-xmldiff php70-php-pecl-zip php70-php-pspell php70-php-soap php70-php-tidy php70-php-xml php70-php-xmlrpc

mysqli インストール

1
# yum --enablerepo=remi-php70 install php-mysqli

PHP7 用 phpredis インストール

1
2
3
4
5
6
7
8
9
# cd /usr/local/src
# git clone https://github.com/phpredis/phpredis.git
# cd phpredis
# git checkout php7
# phpize
# ./configure
# make
# make install
# echo 'extension=redis.so' > /etc/opt/rh/rh-php70/php.d/redis.ini

php-fpm 再起動

1
# /etc/init.d/php70-php-fpm restart

httpd 再起動

1
# /etc/init.d/httpd24-httpd restart

ここまでで PHP7 で動作する環境が整っているかと思います。
エラーログを見ながら修正に当たってください。

PHP 7 で廃止された構文を修正

PHP Parse error: syntax error, unexpected ‘new’ (T_NEW)

  • &= new <クラス名> の指定が不可となり、 = new <クラス名> にする必要があります。
1
2
3
&= new Class

= new Class

PHP Fatal error: Cannot use ‘String’ as class name as it is reserved

  • PHP7 では class String, Int と型名の Class を作成できなくなりました。

自分は以下の様に修正しました。
※ 適宜プロジェクトのコーディングルールに則ってご変更ください。

1
2
3
class String {

class Stringer {
1
2
3
class Int {

class Intger {

プロジェクトによってはもっと色々出てくると思いますので
適宜修正ください。

総評

放置されがちになるミドルウェアのアップデートは小まめにやっておきたいですね。
脆弱性の定期的な棚卸しせねば

業務でアップデートするのであれば
アップデートする環境を別途用意してアップデートする、
そこでミドルウェア、アプリケーションのコードレベルでのアップデート手順をまとめ
本番環境で実施。

機能(url)毎に正しく動いたものだけプロキシで PHP7 へ流す
というのもアリかなと思います。

以上です。

参考

Install PHP7, PECL, PEAR on MacOS

Install PHP7, PECL, PEAR on MacOS

備忘録です。
忘れない為の自分への一筆。

PHP 7 インストール

1
2
3
4
$ brew update
$ brew install homebrew/php/php70
$ echo 'export PATH="$(brew --prefix homebrew/php/php70)/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
1
2
3
4
5
$ php -v

PHP 7.0.19 (cli) (built: May 21 2017 11:56:11) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

PHP 7 で Pecl, Pear インストール

1
$ curl -O http://pear.php.net/go-pear.phar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
$ sudo php -d detect_unicode=0 go-pear.phar

Below is a suggested file layout for your new PEAR installation. To
change individual locations, type the number in front of the
directory. Type 'all' to change all of them or simply press Enter to
accept these locations.

1. Installation base ($prefix) : /usr/local/Cellar/php70/7.0.19_11
2. Temporary directory for processing : /tmp/pear/install
3. Temporary directory for downloads : /tmp/pear/install
4. Binaries directory : /usr/local/Cellar/php70/7.0.19_11/bin
5. PHP code directory ($php_dir) : /usr/local/Cellar/php70/7.0.19_11/share/pear
6. Documentation directory : /usr/local/Cellar/php70/7.0.19_11/docs
7. Data directory : /usr/local/Cellar/php70/7.0.19_11/data
8. User-modifiable configuration files directory : /usr/local/Cellar/php70/7.0.19_11/cfg
9. Public Web Files directory : /usr/local/Cellar/php70/7.0.19_11/www
10. System manual pages directory : /usr/local/Cellar/php70/7.0.19_11/man
11. Tests directory : /usr/local/Cellar/php70/7.0.19_11/tests
12. Name of configuration file : /usr/local/etc/php/7.0/pear.conf

// インストール先指定
1-12, 'all' or Enter to continue: (「1」と入力しEnter)

(Use $prefix as a shortcut for '/usr/local/Cellar/php70/7.0.19_11', etc.)
Installation base ($prefix) [/usr/local/Cellar/php70/7.0.19_11] : (「/usr/local/pear」と入力しEnter)




Below is a suggested file layout for your new PEAR installation. To
change individual locations, type the number in front of the
directory. Type 'all' to change all of them or simply press Enter to
accept these locations.

1. Installation base ($prefix) : /usr/local/pear
2. Temporary directory for processing : /tmp/pear/install
3. Temporary directory for downloads : /tmp/pear/install
4. Binaries directory : /usr/local/pear/bin
5. PHP code directory ($php_dir) : /usr/local/pear/share/pear
6. Documentation directory : /usr/local/pear/docs
7. Data directory : /usr/local/pear/data
8. User-modifiable configuration files directory : /usr/local/pear/cfg
9. Public Web Files directory : /usr/local/pear/www
10. System manual pages directory : /usr/local/pear/man
11. Tests directory : /usr/local/pear/tests
12. Name of configuration file : /usr/local/etc/php/7.0/pear.conf

// バイナリディレクトリ指定
1-12, 'all' or Enter to continue: (「4」と入力しEnter)

(Use $prefix as a shortcut for '/usr/local/pear', etc.)
Binaries directory [$prefix/bin] : /usr/local/bin


Below is a suggested file layout for your new PEAR installation. To
change individual locations, type the number in front of the
directory. Type 'all' to change all of them or simply press Enter to
accept these locations.

1. Installation base ($prefix) : /usr/local/pear
2. Temporary directory for processing : /tmp/pear/install
3. Temporary directory for downloads : /tmp/pear/install
4. Binaries directory : /usr/local/bin
5. PHP code directory ($php_dir) : /usr/local/pear/share/pear
6. Documentation directory : /usr/local/pear/docs
7. Data directory : /usr/local/pear/data
8. User-modifiable configuration files directory : /usr/local/pear/cfg
9. Public Web Files directory : /usr/local/pear/www
10. System manual pages directory : /usr/local/pear/man
11. Tests directory : /usr/local/pear/tests
12. Name of configuration file : /usr/local/etc/php/7.0/pear.conf

// 以上で基本設定が済んだのでインストールを開始する
1-12, 'all' or Enter to continue: (何も入力せずEnter)

// インストールが開始されます。
Beginning install...
Configuration written to /usr/local/etc/php/7.0/pear.conf...
Initialized registry...
Preparing to install...
installing phar:///Users/kenzo.tanaka/azure/go-pear.phar/PEAR/go-pear-tarballs/Archive_Tar-1.4.2.tar...
installing phar:///Users/kenzo.tanaka/azure/go-pear.phar/PEAR/go-pear-tarballs/Console_Getopt-1.4.1.tar...
installing phar:///Users/kenzo.tanaka/azure/go-pear.phar/PEAR/go-pear-tarballs/PEAR-1.10.4.tar...
installing phar:///Users/kenzo.tanaka/azure/go-pear.phar/PEAR/go-pear-tarballs/Structures_Graph-1.1.1.tar...
installing phar:///Users/kenzo.tanaka/azure/go-pear.phar/PEAR/go-pear-tarballs/XML_Util-1.4.2.tar...
install ok: channel://pear.php.net/Archive_Tar-1.4.2
install ok: channel://pear.php.net/Console_Getopt-1.4.1
install ok: channel://pear.php.net/Structures_Graph-1.1.1
install ok: channel://pear.php.net/XML_Util-1.4.2
install ok: channel://pear.php.net/PEAR-1.10.4
PEAR: Optional feature webinstaller available (PEAR's web-based installer)
PEAR: Optional feature gtkinstaller available (PEAR's PHP-GTK-based installer)
PEAR: Optional feature gtk2installer available (PEAR's PHP-GTK2-based installer)
PEAR: To install optional features use "pear install pear/PEAR#featurename"

The 'pear' command is now at your service at /usr/local/bin/pear

** The 'pear' command is not currently in your PATH, so you need to
** use '/usr/local/bin/pear' until you have added
** '/usr/local/bin' to your PATH environment variable.

Run it without parameters to see the available actions, try 'pear list'
to see what packages are installed, or 'pear help' for help.

For more information about PEAR, see:

http://pear.php.net/faq.php
http://pear.php.net/manual/

Thanks for using go-pear!

PECL インストール確認

1
2
3
4
5
6
7
8
$ which pecl
/usr/local/bin/pecl

$ pecl version
PEAR Version: 1.10.4
PHP Version: 7.0.19
Zend Engine Version: 3.0.0
Running on: Darwin pc-12-332.local 16.5.0 Darwin Kernel Version 16.5.0: Fri Mar 3 16:52:33 PST 2017; root:xnu-3789.51.2~3/RELEASE_X86_64 x86_64

PEAR インストール確認

1
2
3
4
5
6
7
$ which pear
/usr/local/bin/pear

PEAR Version: 1.10.4
PHP Version: 7.0.19
Zend Engine Version: 3.0.0
Running on: Darwin pc-12-332.local 16.5.0 Darwin Kernel Version 16.5.0: Fri Mar 3 16:52:33 PST 2017; root:xnu-3789.51.2~3/RELEASE_X86_64 x86_64

以上です。

PHP 検証フィルタで Email アドレス検証 を検証する

概要

Email アドレスのフォーマットチェックとして PHP には検証フィルタが用意されています。

こんな使い方しますね。

1
2
3
4
5
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo '(^-^) OK Email アドレスフォーマットとして妥当';
} else {
echo '(>_<) NG';
}

以下 php.net ではこのように記述されている。

http://php.net/manual/ja/filter.filters.validate.php

値が妥当な e-mail アドレスであるかどうかを検証します。
この検証は、e-mail アドレスが RFC 822 に沿った形式であるかどうかを確かめます。 ただし、コメントおよび空白の折り返し (whitespace folding) には対応していません。

検証

結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
[OK (^-^) EMAIL LIST]
abc@gmail.com
a!bc@gmail.com
a#bc@gmail.com
a$bc@gmail.com
a%bc@gmail.com
a&bc@gmail.com
a`bc@gmail.com
a=bc@gmail.com
a~bc@gmail.com
a~bc@gmail.com
a|bc@gmail.com
a^bc@gmail.com
a*bc@gmail.com
a+bc@gmail.com
a?bc@gmail.com
a`bc@gmail.com
a{bc@gmail.com
a}bc@gmail.com
a}bc@gmail.com
!abc@gmail.com
#abc@gmail.com
$abc@gmail.com
%abc@gmail.com
&abc@gmail.com
=abc@gmail.com
~abc@gmail.com
|abc@gmail.com
^abc@gmail.com
*abc@gmail.com
+abc@gmail.com
?abc@gmail.com
`abc@gmail.com
{abc@gmail.com
}abc@gmail.com
a__bc@gmail.com
abc_@gmail.com
abc@vwx.yz

[NG (>_<) EMAIL LIST]
a"bc@gmail.com
a@bc@gmail.com
a(bc@gmail.com
a)bc@gmail.com
a\bc@gmail.com
a:bc@gmail.com
a;bc@gmail.com
a<bc@gmail.com
a>bc@gmail.com
a>bc@gmail.com
a,bc@gmail.com
a[bc@gmail.com
a]bc@gmail.com
¥abc@gmail.com
"abc@gmail.com
@abc@gmail.com
(abc@gmail.com
)abc@gmail.com
\abc@gmail.com
:abc@gmail.com
;abc@gmail.com
<abc@gmail.com
>abc@gmail.com
,abc@gmail.com
[abc@gmail.com
]abc@gmail.com
a..bc@gmail.com
abc.@gmail.com
abc@@vwx.yz

NGとしたいような Emailアドレス を通してしまいます。

&abc@xyz.ab

これまでの評価

PHP 検証フィルタ FILTER_VALIDATE_EMAIL によるバリデーションは
社内システムで利用するアカウントでのEmailアドレス検証程度であれば利用可能か。

商用サービスとして検証フィルタのみでバリデーションするのは危険かなと思いました。

マイ Email バリデーション

  • 検証フィルタ FILTER_VALIDATE_EMAIL はベーシックに利用
  • 利用できる文字を 半角英数字 . _ - に制限
  • Qiita 記事を参照しDNS 検証チェック入れました。 (ShibuyaKosuke さんありがとうございます!)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function checkEmailwithDNS($email, $check_dns = false) {
switch (true) {
case !filter_var($email, FILTER_VALIDATE_EMAIL):
case !preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $email):
case !preg_match('/@([\w.-]++)\z/', $email, $m):
return false;
case !$check_dns:
case checkdnsrr($m[1], 'MX'):
case checkdnsrr($m[1], 'A'):
case checkdnsrr($m[1], 'AAAA'):
return true;
default:
return false;
}
}

if (checkEmailDNS($email, true)) {
echo '(^-^) OK Email アドレスフォーマットとして妥当';
} else {
echo '(>_<) NG';
}

マイ Email バリデーション検証

結果

ほぼ弾いてくれます〜

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
[OK (^-^) EMAIL LIST]
abc@gmail.com
a__bc@gmail.com
abc_@gmail.com

[NG (>_<) EMAIL LIST]
a!bc@gmail.com
a"bc@gmail.com
a@bc@gmail.com
a#bc@gmail.com
a$bc@gmail.com
a%bc@gmail.com
a&bc@gmail.com
a`bc@gmail.com
a(bc@gmail.com
a)bc@gmail.com
a=bc@gmail.com
a~bc@gmail.com
a~bc@gmail.com
a|bc@gmail.com
a\bc@gmail.com
a^bc@gmail.com
a:bc@gmail.com
a;bc@gmail.com
a*bc@gmail.com
a+bc@gmail.com
a?bc@gmail.com
a<bc@gmail.com
a>bc@gmail.com
a>bc@gmail.com
a,bc@gmail.com
a`bc@gmail.com
a[bc@gmail.com
a]bc@gmail.com
a{bc@gmail.com
a}bc@gmail.com
a}bc@gmail.com
¥abc@gmail.com
!abc@gmail.com
"abc@gmail.com
@abc@gmail.com
#abc@gmail.com
$abc@gmail.com
%abc@gmail.com
&abc@gmail.com
(abc@gmail.com
)abc@gmail.com
=abc@gmail.com
~abc@gmail.com
|abc@gmail.com
\abc@gmail.com
^abc@gmail.com
:abc@gmail.com
;abc@gmail.com
*abc@gmail.com
+abc@gmail.com
?abc@gmail.com
<abc@gmail.com
>abc@gmail.com
,abc@gmail.com
`abc@gmail.com
[abc@gmail.com
]abc@gmail.com
{abc@gmail.com
}abc@gmail.com
a..bc@gmail.com
abc.@gmail.com
abc@@vwx.yz
abc@vwx.yz

参照

そろそろメールアドレスを正規表現だけでチェックするのは終わりにしませんか?

以上です。

PHP エンジニアであれば必ずやるべき 1 ライナー

PHP エンジニアであれば必ずやるべき 1 ライナー

みんなが幸せになれるhiraku さんの究極の 1 ライナーです。

1
$ composer config -g repositories.packagist composer http://packagist.jp

composer による インストールが劇的に早くなります。

遅い理由は 特に packagist.org が フランスにある からとのこと

問題発生

早速上記 1 ライナーを実行!!

すると…

1
2
You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug
Do not run Composer as root/super user! See https://getcomposer.org/root for details

xdeug が enabled になっているぞと怒られている。。

xdebug 設定箇所を探す

1
2
3
4
5
6
7
$ php -i | grep xdebug

/etc/php.d/xdebug.ini,
xdebug
xdebug support => enabled
...
...

/etc/php.d/xdebug.ini で 設定していた。

※環境によっては php.ini で設定している等あるので注意

xdebug を disabled に設定変更

自分の PHP 実行環境では xdebug を利用する必要性がなかった為、
/etc/php.d/xdebug.ini 退避

1
mv /etc/php.d/xdebug.ini /etc/php.d/xdebug.ini.org

再度実行

あれ… また出てきた… 今度は、

1
Do not run Composer as root/super user! See https://getcomposer.org/root for details

root ユーザで実行するなと怒られている。。

root ユーザ以外の通常ユーザへ変更

1
# su - <user>

再度実行

成功した!

1
2
$ composer config -g repos.packagist composer https://packagist.jp
$

設定確認

packagist url が https://packagist.jp になっていることを確認

1
2
3
4
5
6
7
8
9
10
11
$ cat .composer/config.json

{
"config": {},
"repositories": {
"packagist": {
"type": "composer",
"url": "https://packagist.jp"
}
}
}

良き PHP ライフを!

参照

http https 混在サイトでの Cookie Secure 属性の扱い方
Jenkins + SonarQube で PHPコードメトリクス計測!

Jenkins + SonarQube で PHPコードメトリクス計測!

前回

Jenkins とは別のサーバ上に
SonarQube をインストールし
アクセスできるまでをまとめました。

今回は Jenkins からソースを解析し
SonarQube でのメトリクス情報を表示までの実行方法をまとめます。

言語は どれでも良いですが、 今回は PHP とします。

Overview

以下概要になります。

SonarQube 側事前準備

プロジェクトを作成しプロジェクトキーを発行します。

1. ログインページへアクセス

http://:9000/sessions/new

デフォルトでは以下 admin:admin アカウントでログイン

Item Value
ID admin
PW admin

2. プロジェクト作成

  • ヘッダーメニュー Administration クリックし Administration ページへ遷移
  • Projects > Management クリック
  • Create ボタンクリック
  • Name, Key 入力し
  • プロジェクトが追加されたことがわかります。

3. PHP Plugin インストール

  • Administration ページ System > Update Center クリック
  • Available 選択 → 検索窓で「PHP」と入力 → 表示された PHP Plugin で Install クリック
  • Restart で SonarQube に PHP Plugin インストール
  • Installed タブで PHP Plugin がインストールされていることを確認

4. authentication token 発行

  • Security > User クリック
  • TOKENS クリックしポップアップ表示
  • 任意の文字列を入力し create
  • token コピー
    Jenkins 側の設定時に利用します。

以上で SonarQube 側の事前準備は終了です。

Jenkins 側準備

1. SonarQube Plugin インストール

Jenkins の管理 > Plugin の管理
にて SonarQube Plugin インストール

2. SonarQube Scanner インストール

以下オフィシャルダウンロードページからリンク取得

Analyzing+with+SonarQube+Scanner

1
2
3
4
$ cd /var/lib/jenkins
$ wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-2.6.1.zip
$ unzip sonar-scanner-2.6.1.zip
$ ln -s sonar-scanner-2.6.1 sonar-scanner

3. Jenkins システム設定

  • Jenkins の管理 > システムの設定 へアクセス

  • JenkinsQube servers に必要項目入力

  • SonarQube Scanner に先ほどインストールした sonar-scanner パスを設定

上記入力後保存

4. ジョブ新規作成

「sonarqubeTest」という名前のジョブを新規作成します。

  • git リポジトリより PHP プロジェクト取得設定
  • SonarScanner 実行設定

以上で Jenkins 側の設定完了です。

SonarQube 反映確認

ちなみにこちら EC-CUBE 1.1 のプロジェクトでした。

EC-CUBE のコード重複率が多く
無駄が如何に多いかがわかります。

以上です。

とにかくシンプルにPHPでLineBotApiを書きました

とにかくシンプルにPHPでLineBotApiを書きました

概要

話題の Line bot Api 用スクリプトを PHP で書きました。

とにかくシンプルに = カスタマイズしやすさ

という所で
修正する場所を限って利用できるようにしたつもりです。

作ったもの

適当に文字を打つと →「hello」
perfect と打つと → 「human」

と返すようにした本当にシンプルなものです。

そのロジック部分をカスタマイズすれば
マイ bot ができますね。

環境

  • さくらレンタルサーバ VPS CentOS release 6.7 (Final)
  • PHP 5.6.16

SSL は無料の StartSSL を利用しました。取得・設定は以下参照してください。

スクリプト

function getMessage で bot に返信させたいメッセージを決定しています。

そこで他 API を呼んだり、サイトからスクレイプしたり情報をとってきて返してあげると
簡易的なメッセージ返信 Line bot できあがりです。

こんな感じです!

PHP+OpenSSLバージョンアップ

PHP+OpenSSLバージョンアップ

概要

ベリトランスモジュールのバージョンアップに際して
2016 年以内にSSL v3.0/TLS 1.0 無効化処理が必須となりました。

世界的なセキュリティ対策の一環として必須事項なので
ベリトランス以外の決済も、また決済以外でもシステムの対策必須です。

Google、SSL 3.0 の脆弱性「POODLE」を公表、SSL 3.0 は今後サポート廃止の意向

EC-CUBE でベリトランスの決済モジュールでは
PHP から OpenSSL ライブラリを利用して決済へ通信を実施しています。

その PHP の OpenSSL ライブラリを 1.0.1i 以上(最新が推奨)に
バージョンアップする必要があります。

対応する ToDo としては以下になります。

TLS1.1 以上を利用するには openssl 1.0.1i 以上を利用する必要アリ
→ openssl バージョンアップ (1.0.1i 以上)
→ PHP の再コンパイルし OpenSSL ライブラリ(1.0.1i 以上)をバージョンアップ

上記対応をまとめました。

※ Apache の SSL v3.0/TLS1.0 利用不可設定は別途
ググればすぐ出てきます ♪

環境

  • CentOS release 6.6 (Final)
  • PHP 5.3.9
  • openssl 1.0.1g

手順

PHP で利用している OpenSSL のライブラリバージョン確認

これから PHP をコンパイルし直すので
OpenSSL support が disable でも問題ないです。

※今回では既にインストール済みであるというケースを想定しています。

1
2
3
4
5
6
# php -i | grep OpenSSL

OpenSSL support => enabled
OpenSSL Library Version => OpenSSL 1.0.1g 28 Jan 2016
OpenSSL Header Version => OpenSSL 1.0.1g 28 Jan 2016
OpenSSL support => enabled

PHP でで利用される OpenSSL Library, Header Version が 1.0.1g であることが確認できました。

既存 openssl バックアップ

既にインストール済みかと思いますので
現行バージョンを一旦退避します。

1
2
3
4
5
6
7
8
# openssl version
1.0.1g

# which openssl
/usr/local/bin/openssl

// 名前変更でバックアップとして残す
# mv /usr/local/bin/openssl /usr/local/bin/openssl1.0.1g

何か不具合が発生した場合にまきもどせるように、念のためバックアップをとりました。

openssl バージョンアップ

ソースからビルドします。

1
2
3
4
5
6
7
# cd /usr/local/src
# wget http://www.openssl.org/source/openssl-1.0.2f.tar.gz
# tar xzvf openssl-1.0.2f.tar.gz
# cd openssl-1.0.2f
# ./config --prefix=/usr/local shared -fPIC
# make
# make install

-fPIC は 動的共有オブジェクト(DSO)として mod_ssl をビルドし
PHP のバイナリ実行ファイルからフックして利用する為に必要、
と言ったところでしょうか。

openssl バージョンアップ確認

正しくバージョンアップされていることを確認しました。

1
2
3
# openssl version

OpenSSL 1.0.2f 28 Jan 2016

PHP 再コンパイル

  • 既存 PHP がどのように configure されているか確認
1
2
3
# php -i | grep config

Configure Command => './configure' '--enable-mbstring' '--enable-zend-multibyte' '--with-mysql' '--with-mysqli' '--enable-mbregex' '--with-gd' '--with-jpeg-dir=/usr/lib' '--with-png-dir=/usr/lib' '--with-freetype-dir=/usr/lib' '--with-zlib-dir' '--with-libdir=lib64' '--enable-soap' '--with-apxs2=/etc/httpd/bin/apxs' '--with-openssl=/usr/local'

--with-openssl がない場合は上記のように追加します。
今回は既に指定済みです。

上記の conigure 情報を利用して
–with-openssl があることを確認した上で
再コンパイルします。

  • 再コンパイル
1
2
3
4
# cd /usr/local/src/php-5.3.9
# ./configure --enable-mbstring --enable-zend-multibyte --with-mysql --with-mysqli --enable-mbregex --with-gd --with-jpeg-dir=/usr/lib --with-png-dir=/usr/lib --with-freetype-dir=/usr/lib --with-zlib-dir --with-libdir=lib64 --enable-soap --with-apxs2=/etc/httpd/bin/apxs --with-openssl=/usr/local
# make
# make install

以下のようなエラーが出る場合は、手順)「openssl バージョンアップ」をご確認下さい。
新たに openssl をソースからコンパイルしてビルドしたときなどに出るエラーです。

1
configure: error: Cannot find OpenSSL's <evp.h>

PHP で利用する OpenSSL ライブラリのバージョン確認

1
2
3
4
5
6
# php -i | grep OpenSSL

OpenSSL support => enabled
OpenSSL Library Version => OpenSSL 1.0.2f 28 Jan 2016
OpenSSL Header Version => OpenSSL 1.0.2f 28 Jan 2016
OpenSSL support => enabled

OpenSSL Library, Header Version が共に指定通りとなりました。

以上です。