Apache2.4.37 + OpenSSL1.1.1aをソースからインストール

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

リンクが含まれる投稿はサイト管理者の承認後に表示されます(スパム対策)