CentOS7にApache2.4.37+OpenSSL1.1.1a+PHP7.3.0をソースからインストール
そのうちOpenSSL 1.1.1を入れてTLS 1.3に対応したいなぁと思いながらも、OpenSSLはいろいろな環境との結びつきが強すぎて難易度が高く諦めていたのですが、せっかくなのでAWSを使っているメリットを生かし、本番環境のスナップショットからクローンインスタンスを作り、開発環境としていじり倒してみました。今回はSTEP3に挑戦です。
STEP1. OS標準リポジトリからyumで環境を作る
STEP2. IUSやRemi等の拡張リポジトリからyumで環境を作る
STEP3. ソースからビルドして環境を作る
最悪いつでも戻せるように、もともと動かしているSTEP2のWebサーバ環境は「httpd」として残しつつつ(これが大事)、STEP3の環境として新たに追加で/usr/local配下に「httpd2」を作ってみることにします。
1. OpenSSL 1.1.1a を /usr/local/ssl にインストール
$ sudo -i # yum -y groupinstall base # yum -y groupinstall development # yum -y update # yum -y install zlib-devel # yum -y install perl-core # cd /usr/local/src/ # wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz # tar xvfz openssl-1.1.1a.tar.gz # cd openssl-1.1.1a # ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib # make depend # make # make test # make install # ln -s /usr/local/ssl/lib/libcrypto.so.1.1 /lib64/libcrypto.so.1.1 # ln -s /usr/local/ssl/lib/libssl.so.1.1 /lib64/libssl.so.1.1 # /usr/local/ssl/bin/openssl version # echo /usr/local/ssl/lib > /etc/ld.so.conf.d/openssl111a.conf # ldconfig # /usr/local/ssl/bin/openssl ciphers -v TLSv1.3
2. Apache 2.4.37 を /usr/local/httpd2 にインストール
aprとapr-utilもソースから入れられますが、今回はyumで入れちゃいます。ついでにnghttp2も入れてHTTP/2にも対応しておきます。
# yum -y install libnghttp2-devel # yum -y install apr-devel apr-util-devel
–with-ssl=[dir]を指定することで、ApacheとOpenSSLを結びつけます。
# cd /usr/local/src/ # wget http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.4.37.tar.gz # tar xvzf httpd-2.4.37.tar.gz # cd httpd-2.4.37/ # ./configure \ --prefix=/usr/local/httpd2 \ --enable-http2 \ --enable-ssl \ --with-ssl=/usr/local/ssl \ --enable-so \ --enable-mods-shared=reallyall \ --enable-mpms-shared=all # make # make install
インストールされたらApacheの設定。httpd.confの該当箇所を有効化、追記・修正します。
# cd /usr/local/httpd2/conf # vi httpd.conf ----------------------------------------- # for HTTP/2 MPM worker(なぜかeventが無い・・・) #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so LoadModule mpm_worker_module modules/mod_mpm_worker.so # for HTTPS LoadModule ssl_module modules/mod_ssl.so LoadModule socache_shmcb_module modules/mod_socache_shmcb.so # for HTTP/2 LoadModule http2_module modules/mod_http2.so # for VirtualHost LoadModule vhost_alias_module modules/mod_vhost_alias.so # for Rewrite LoadModule rewrite_module modules/mod_rewrite.so # for php-fpm LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so LoadModule proxy_module modules/mod_proxy.so . . User apache Group apache . . <IfModule dir_module> # index.php追加(WordPressに必要) #DirectoryIndex index.html DirectoryIndex index.html index.php </IfModule> . . # php追加 AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps . . Include conf/extra/httpd-mpm.conf . . # Virtual hosts(http用、https用は分けて設定します) #Include conf/extra/httpd-vhosts.conf Include conf/extra/httpd-vhosts-http.conf Include conf/extra/httpd-vhosts-https.conf . . Include conf/extra/httpd-ssl.conf ----------------------------------------- :wq
HTTPSの設定。httpd-ssl.confを以下のように追記・修正します。せっかくなのでより安全なTLS 1.2、TLS 1.3だけに対応します。
# cd extra # vi httpd-ssl.conf ----------------------------------------- . . # 常時SSL Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure Header always set X-Frame-Options SAMEORIGIN Header always set X-Content-Type-Options nosniff . . # 明示的にSSL圧縮をOFF SSLCompression off . . SSLCipherSuite "TLS_AES_256_GCM_SHA384 \ TLS_CHACHA20_POLY1305_SHA256 \ ECDHE-RSA-AES128-GCM-SHA256 \ ECDHE-RSA-AES256-GCM-SHA384 \ ECDHE-RSA-AES256-SHA \ ECDHE-RSA-AES256-SHA384 \ DHE-RSA-AES256-GCM-SHA384 \ DHE-RSA-AES256-SHA \ DHE-RSA-AES256-SHA256" SSLProxyCipherSuite "TLS_AES_256_GCM_SHA384 \ TLS_CHACHA20_POLY1305_SHA256 \ ECDHE-RSA-AES128-GCM-SHA256 \ ECDHE-RSA-AES256-GCM-SHA384 \ ECDHE-RSA-AES256-SHA \ ECDHE-RSA-AES256-SHA384 \ DHE-RSA-AES256-GCM-SHA384 \ DHE-RSA-AES256-SHA \ DHE-RSA-AES256-SHA256" . . SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLProxyProtocol all -SSLv3 -TLSv1 -TLSv1.1 . . # for OCSP SSLUseStapling on SSLStaplingResponderTimeout 5 SSLStaplingReturnResponderErrors off SSLStaplingCache shmcb:/var/run/ocsp(128000) . . #ServerName www.example.com:443 #ServerAdmin you@example.com . . SSLEngine on #Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/ji0vwl.net/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/ji0vwl.net/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/ji0vwl.net/chain.pem . . #SSLCertificateFile "/usr/local/httpd2/conf/server.crt" . . #SSLCertificateKeyFile "/usr/local/httpd2/conf/server.key" ----------------------------------------- :wq
HTTPバーチャルホストの設定
# vi httpd-vhosts-http.conf ----------------------------------------- <VirtualHost *:80> DocumentRoot /var/www/html ServerName test.ji0vwl.net <Directory "/var/www/html/"> Options FollowSymlinks Includes AllowOverride All AddType text/html .html Require all granted </Directory> # HTTPSにリライトする場合はコメントアウト解除 #RewriteEngine on #RewriteCond %{SERVER_NAME} =test.ji0vwl.net #RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] </VirtualHost> ----------------------------------------- :wq
HTTPSバーチャルホストの設定
# vi httpd-vhosts-https.conf ----------------------------------------- <IfModule mod_ssl.c> <VirtualHost *:443> DocumentRoot /var/www/html ServerName test.ji0vwl.net # HTTP/2有効化(h2追加) Protocols h2 http/1.1 <Directory "/var/www/html/"> Options FollowSymlinks Includes AllowOverride All AddType text/html .html Require all granted </Directory> # SSL証明書 #Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/ji0vwl.net/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/ji0vwl.net/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/ji0vwl.net/chain.pem </VirtualHost> </IfModule> ----------------------------------------- :wq
3. Apache 2.4.37 を httpd2.service に登録
STEP2では「systemctl start httpd」とやって起動していましたが、追加で入れたApache2.4.37も同様に「systemctl start httpd2」で起動できるように、httpd2 という名前のサービスとして登録します。reload=graceful動作です。
# vi /etc/systemd/system/httpd2.service ----------------------------------------- [Unit] Description=The Apache HTTP Server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking ExecStart=/usr/local/httpd2/bin/apachectl start ExecReload=/usr/local/httpd2/bin/apachectl graceful ExecStop=/usr/local/httpd2/bin/apachectl stop [Install] WantedBy=multi-user.target ----------------------------------------- :wq
# systemctl daemon-reload # systemctl list-unit-files | grep httpd2
4. PHP 7.3.0 を /usr/local/php にインストールする
–with-apxs2=[dir]でPHPとApacheを、–with-openssl=[dir]でPHPとOpenSSLを、–with-mysql-sock=[dir]でPHPとmySQLを結びつけます。じつはOpenSSLよりもPHPの方が他との結合が多く、難関でした。。
# cd /usr/local/src # yum -y install libxml2-devel systemd-devel libpng-devel # wget http://jp2.php.net/get/php-7.3.0.tar.gz/from/this/mirror -O /usr/local/src/php-7.3.0.tar.gz # tar -xvzf php-7.3.0.tar.gz # cd php-7.3.0 # ./configure \ --prefix=/usr/local/php \ --with-apxs2=/usr/local/httpd2/bin/apxs \ --with-openssl=/usr/local/ssl \ --with-mysql-sock=/var/lib/mysql/mysql.sock \ --with-mysqli \ --with-pdo-mysql \ --enable-mbstring \ --with-gd \ --with-zlib \ --with-fpm-systemd \ --with-fpm-user=apache \ --with-fpm-group=apache \ --enable-fpm # make # make install
5. STEP2のhttpdを停止し、今入れたSTEP3のhttpd2を起動して完成!
# systemctl stop httpd # systemctl disable httpd # systemctl start httpd2 # systemctl enable httpd2
httpd2を起動してSSL LabsでHTTPSの検証を行ったところ。まだ開発環境での動作確認レベルですが、Apache 2.4.37/OpenSSL 1.1.1a/PHP 7.3.0の環境にて、今現在最新のTLS 1.3の対応が確認できました!
Apache-OpenSSL-PHPの結びつきが強固すぎて、OpenSSLを入れ替えるとApacheやPHPもビルドし直さなければならず、動作させるのに非常に苦労しました。もう少しいじってみて、安定動作が確認できたら本番環境にも入れてみようかと思います。
今まではVPS1台だったので危ない橋(yum以外のインストール)は渡れませんでしたが、AWSなら好きに開発環境を作って、誤って壊しちゃっても潰して作り直せば良いのでとても気が楽になりました。サーバの勉強には最適ですね。
追記
本番環境に反映させる場合は、Let’s EncryptのSSL証明書更新後のreloadをhttpd2に変更するのを忘れずに!
# vi /etc/cron.d/dailyjobs ------------------------------- . . # run-parts 0 3 1 * * root /bin/certbot renew --force-renew --rsa-key-size 4096 --post-hook "systemctl reload httpd2" . . ------------------------------- :wq
# systemctl restart crond