こんにちは、新型コロナウイルス感染症対策のためテレワーク勤務中の山田です。
テレワーク勤務に伴い通勤で運動をしなくなった分、定時後から日の入りまでちょくちょく近くの河川公園を歩いています。
ソーシャルディスタンスを保ちつつ、マスクを防備していますので息苦しいですが仕方ありません...
目次
前置き
さて、日本では新型コロナウイルスの話題が飛び交う毎日ですが、コロナの話題が出る1ヶ月ほど前主要ブラウザの「TLS1.0」と「TLS1.1」サポートが終了しようとしていたのは、ご存知でしょうか。
この業界に詳しい方であれば、既に対策済みの方がほどんどではないかと思いますが、新型コロナウイルスの世界的流行に伴い各主要ブラウザは、サポート終了時期が延期もしくは再有効化がなされています。
CentOS5系は、サポート終了しておりますOSになりますため、TLS1.2サポートの対策には6系以降のOSにリプレイスされることを強くおすすめいたしますが、5系でどうしてもTLS1.2サポートを有効化したい方向けの記事になります。
自分のサイトがTLS1.2に対応しているか確認するには?
容易に行える確認方法としては、"Qualys SSL labs"のチェックサイトにご自身のサーバ情報を入力してチェックするのが早いかと思います。
その中で、"Configuration"にある"Protocols"にある、"TLS1.2"もしくは"TLS1.3"が"No"であった場合は、今後の「TLS1.0」と「TLS1.1」のサポート終了に伴いブラウザで閲覧が出来なくなる恐れがあります。
Qualys SSL labs
なぜ、サポート終了するのか?
「TLS1.0」と「TLS1.1」については、IETF(Internet Engineering Task Force)が非推奨とする予定で、脆弱性が発見されても修正を行わないと発表したことが起因していると言われております。
どんな影響が出るのか?
「TLS1.0」と「TLS1.1」について対応していない場合、主要ブラウザからアクセスした際に、警告が表示されてアクセスできなくなるなどが予定されているとのことです。
前置きが非常に長くなってしまいましたが、実際のアップデート方法を書いていきます。
検証を含めてアップデートを進めてみる
検証環境
- CentOS 5.8 64bit
- Apache 2.2.3-63.el5.centos
- OpenSSL 0.9.8e-22.el5
- PHP 5.1.6-32.el5
事前確認
# openssl s_client -connect ${MYHOST}:443 -tls1_2 < /dev/null > /dev/null 2>&1 ; echo $?
※${MYHOST}には、ご自分のサーバのIPアドレスを指定ください
TLS1.2に対応しているサイトの場合
0
※TLS1.2に対応していた場合は、このように表示されます。
TLS1.2に対応していないサイトの場合
1
※TLS1.2に対応していない場合は、このように表示されます。
こういったスクリプトも用意してみましたので、OpenSSLコマンドよくわからない方はご利用ください
#!/bin/bash ## 引数があるかチェック if [ $# -eq 1 ] ; then IPADDRESS=$1 echo "TLSが有効なバージョンをチェックします" echo "対象となるIPアドレスは、${IPADDRESS}" openssl s_client -connect ${IPADDRESS}:443 -tls1 < /dev/null > /dev/null 2>&1 && echo " ●TLS1.0は有効" || echo " ×TLS1.0は無効" sleep 1 openssl s_client -connect ${IPADDRESS}:443 -tls1_1 < /dev/null > /dev/null 2>&1 && echo " ●TLS1.1は有効" || echo " ×TLS1.1は無効" sleep 1 openssl s_client -connect ${IPADDRESS}:443 -tls1_2 < /dev/null > /dev/null 2>&1 && echo " ●TLS1.2は有効" || echo " ×TLS1.2は無効" else echo "引数がありません" echo "引数に対象サーバのIPアドレスを入力してください" fi
アップデート作業
TLS1.2に対応したOpenSSLのソースファイルをダウンロードする
# curl -k https://ftp.openssl.org/source/old/1.0.2/openssl-1.0.2s.tar.gz -o /usr/local/src/openssl-1.0.2s.tar.gz
ソースデータを展開する
# cd /usr/local/src/ # tar xvzf openssl-1.0.2s.tar.gz
コンパイルを行う
# cd openssl-1.0.2s # ./config shared enable-ssl2 enable-ssl3 enable-md2 --prefix=/usr/local/openssl-1.0.2s # make # make install
※enable-md2は、下記にある通りPHPのバージョンによっては指定しないとエラーになるので注意が必要です。
PHP 5.2.13 以降および PHP 5.3.2 以降は、この定数が使えるのは PHP のコンパイル時に MD2 サポートを有効にした場合だけになりました。
MD2 サポートを有効にするには、PHP のコンパイル時に -DHAVE_OPENSSL_MD2_H CFLAG を渡し、かつ OpenSSL 1.0.0 以降のコンパイル時にenable-md2 を指定する必要があります。
ライブラリシンボリックリンクを作成する
# cd /usr/local/openssl-1.0.2s/lib/ # ln -s libssl.so.1.0.0 libssl.so.6 # ln -s libcrypto.so.1.0.0 libcrypto.so.6
Apacheの起動ファイルに手を加える
# cp -p /etc/init.d/httpd /etc/init.d/httpd_bak # sed -i -e "s/LANG=\$HTTPD_LANG /LANG=\$HTTPD_LANG LD_LIBRARY_PATH=\/usr\/local\/openssl-1.0.2s\/lib /g" /etc/init.d/httpd # diff /etc/init.d/httpd_bak /etc/init.d/httpd ------------------------------ 63c63 < LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS --- LANG=$HTTPD_LANG LD_LIBRARY_PATH=/usr/local/openssl-1.0.2s/lib daemon --pidfile=${pidfile} $httpd $OPTIONS 82c82 < if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then --- if ! LANG=$HTTPD_LANG LD_LIBRARY_PATH=/usr/local/openssl-1.0.2s/lib $httpd$OPTIONS -t >&/dev/null; then ------------------------------
Apacheの再起動を行う
# /etc/init.d/httpd restart
動作確認
# openssl s_client -connect ${MYHOST}:443 -tls1_2 < /dev/null > /dev/null 2>&1 ; echo $?
※${MYHOST}には、ご自分のサーバのIPアドレスを指定ください
0
※うまく差し変わっていれば、TLS1.2に対応しているはずです。
まとめ
標準では、TLS1.2に対応していないOpenSSLが用いられている5系OSですが、OS標準のApacheであればOpenSSLをソースでインストールして動的にライブラリを付け替えることで、TLS1.2に対応させることが出来ました。
備考
OS標準ではないApacheのインストール方法と用いているものであったりすると上記の方法ではうまく差し替えできなかったケースもございましたので、あくまで参考程度と捕らえていただければ幸いです。
今回使用しました、OpenSSL1.0.2sにつきましてもOpenSSL Projectではサポート切れとなっておりますので、あくまで延命措置とお考えいただき最新OSへのリプレイスをぜひともご検討をお願いいたします。
ありがとうございます!
途方に暮れていたところ大変助かりました。