CentOS7のNginxをTLS1.3に対応させてyumでインストールする

CentOS7のNginxをTLS1.3に対応させてyumでインストールする サーバー

CentOS 7のNginxをTLS 1.3に対応させたいが、ソースからビルド等せずに出来るだけ簡単にyumでTLS 1.3対応済みのNginxをインストール(又はアップデート)したい。

そんな要望が多いと思いますのでその方法を解説します。

※動作確認環境
CentOS 7.7
Nginx 1.16.1
OpenSSL 1.1.1d

スポンサーリンク

現状

OpenSSL 1.1.1が2018年秋に公開されてTLS 1.3に正式対応したが、CentOS 7に標準で入っているOpenSSLのバージョンは1.0.2なのでそのままではTLS 1.3を利用できない。

CentOS 7のOpenSSL自体を1.1.1に上げてしまうのが手っ取り早く思えるが、そんなことをしたらNginx以外の他のパッケージも巻き込んで非常にややこしいことになる。

それならNginxだけにOpenSSL 1.1.1を対応させるという手もあるが、ソースからビルドするのは手間がかかるし、依存関係の処理や、その後のNginxのアップデートなども面倒だ。

スポンサーリンク

対策案

CentOS 7でパッケージ管理をするならyumでやるのが一番簡単。

それならyumで手軽に管理できるOpenSSL 1.1.1及びTLS 1.3に対応済みのNginxを作って、自作リポジトリを作成してそこに登録してしまえば良い。以降はyumで簡単に管理できる。

というわけで、以下の手順で行っていきます。

  1. 現在のNginxのバージョンをチェック
  2. 作業用の仮想環境作成
  3. 必要パッケージのインストール
  4. CentOS 7用のNginxのPRMパッケージとOpenSSL 1.1.1をゲット
  5. RPMパッケージをOpenSSL 1.1.1に対応させてリビルド
  6. 自作リポジトリを作成してRPMパッケージを設置
  7. 自作リポジトリからyumでNginxをインストール(又はアップデート)
  8. Nginxの設定(TLS 1.3有効化や暗号スイート等の設定)
  9. 動作確認
スポンサーリンク

現在のNginxのバージョンをチェック

TLS 1.3に対応させたいサーバにSSHで接続します。
そして以下のコマンドで現在のNginxのバージョンを確認しておいてください。

「nginx-1.16.1-2.el7.ngx.x86_64」が現在のNginxのバージョンだと確認できました。

これを覚えておきます。

作業用の環境作成

VirtualBoxに作業用CentOS 7の仮想環境を作る。

詳細は省きますが、要点は以下の二つ。

  • yumとcurlで外部に接続できる。
  • SSHでログインできる。

単に最新のRPMパッケージを取得してリビルドするだけなので余分な機能は不要です。(※VirtualBoxでなくてもyumとcurlとSSHが利用できれば何でもOKです。)

以下の手順でサクッと仮想環境を作成します。

  1. VirtualBoxのインストール
  2. VirtualBoxの「新規」→「仮想マシンの作成」でウィザードに従ってCentOS 7のMinimal ISOから最小インストール
  3. 仮想マシンの「ネットワーク」の設定で、標準のNATの他にホストオンリーアダプターも追加して有効化
  4. 「ip addr」でIPアドレスを確認してSSHでログイン
  5. 「yum update」でアップデートして最新にする。

※詳しい手順は以下のページで解説していますのでご利用ください。

VirtualBoxにCentOS7をインストールしてSSHでyumを実行までの手順
VirtualBoxを利用すると、サーバーのテスト環境が手軽に構築・複製できて便利です。 今現在、多くのサーバーで使われているCentOS 7をサクッとVirtualBoxにインストールして、SSHで仮想環境内のCentOS 7に接続...

必要パッケージのインストール(作業用サーバ)

作業用サーバが完成したら、作業に必要な基本的なパッケージをインストールします。

epelリポジトリのenabledを0に変更

epelから必要なパッケージをインストールします。

「Development Tools」をグループインストールします。

最新のNginxとOpenSSLをゲット(作業用サーバ)

作業用ユーザー作成

まず、作業用のユーザーを作成します。

作業用ユーザーに変更(スイッチ)します。

作業用のディレクトリを設定します。

NginxとOpenSSLの最新バージョンをチェック

NginxとOpenSSLの公式サイトで最新バージョンをチェックします。

■Nginx公式サイト
https://nginx.org/packages/centos/7/SRPMS/

※Nginxの最新バージョン(CentOS 7用)「nginx-1.16.1-1.el7.ngx.src.rpm 」
【ダウンロードURL】
https://nginx.org/packages/centos/7/SRPMS/nginx-1.16.1-1.el7.ngx.src.rpm

■OpenSSL公式サイト
https://www.openssl.org/source/

※OpenSSL 1.1.1系の最新バージョン「openssl-1.1.1d.tar.gz」
【ダウンロードURL】
https://www.openssl.org/source/openssl-1.1.1d.tar.gz

ダウンロードおよび展開

Nginxのダウンロードおよびインストール

OpenSSLのダウンロードおよび展開

RPMパッケージをリビルド(作業用サーバ)

RPMパッケージの設定ファイルを編集

「nginx.spec」ファイルを編集して上書き保存します。

■変更点(1)
opensslの記述がある部分を全てコメントアウトします。

■変更点(2)※任意で変更
作成されるNginxのバージョンナンバーを確認して必要であれば変更します。

3%{?dist}.ngx」のはじめの数字ですが、一番はじめに調べた現在のNginxのバージョンが「nginx-1.16.1-2.el7.ngx.x86_64」だったので、リビルド時にこの数字を1つカウントアップして「3」にすることにより「nginx-1.16.1-3.el7.ngx.src.rpm」というパッケージが新規作成されてパッケージ名の重複を防ぎ、更に新しいバージョンのパッケージとして認識されるのでyumでアップデートが出来るようになります。

■変更点(3)
--with-openssl=/home/builder/openssl-1.1.1d」を末尾に追加し、OpenSSL 1.1.1を含めてNginxをリビルドします。

RPMパッケージをリビルド

OpenSSL 1.1.1系を内部に含んだNginxのRPMパッケージをリビルド(再構築)します。

結構な時間が掛かりますが、RPMパッケージのリビルド(再構築)が成功すると以下の場所にrpmファイルが作成されます。

/home/builder/rpmbuild/RPMS/x86_64/nginx-1.16.1-3.el7.ngx.x86_64.rpm

RPMパッケージをダウンロード

SSHターミナルのSCP機能やSFTP機能等で仮想環境からRPMパッケージ(nginx-1.16.1-3.el7.ngx.x86_64.rpm)をダウンロードします。※当方はRLoginを利用しています。

SFTP機能でRPMパッケージをダウンロード

以上で作業用の仮想環境での作業は終了です。

作成した作業用の仮想環境は今後のNginxやOpenSSLのアップデートの際にも使うので、また使えるようにディスクイメージは削除せずに保存しておきましょう。

自作リポジトリを作成(本番環境)

実際にTLS 1.3に対応したNginxを利用するサーバーにSSHで接続します。

まずはじめに、現在利用しているNginxのリポジトリを無効化します。

次に、新しいリポジトリ(orgMyRepo)を作成するのでcreaterepoをインストールします。

リポジトリ用のPRM配置ディレクトリを作成します。

先ほど作成してダウンロードしたTLS 1.3対応済みNginxのRPMファイルをSSHターミナルのSCP機能やSFTP機能等で「/tmp/orgMyRepo」内にアップロードします。

SSHのSFTP機能でNginxのRPMファイルをアップロード

リポジトリを作成します。

repoファイルを作成します。

リポジトリ情報を再読み込みします。

自作リポジトリが完成しました。

yumでNginxをインストール又はアップデート(本番環境)

満を持してNginxをインストールします。

インストールが完了しました。

Nginxの設定ファイル変更(本番環境)

ssl_protocolsに「TLSv1.3」を追加し、ssl_ciphersの先頭に以下の3つの暗号スイートを追加します。

  • TLS-AES-256-GCM-SHA384
  • TLS-CHACHA20-POLY1305-SHA256
  • TLS-AES-128-GCM-SHA256

Nginxを再起動します。

ブラウザで動作確認

全ての変更が終わったのでChromeのデベロッパーツールで動作確認します。

デベロッパーツールでTLS1.3を確認

ちゃんとTLS 1.3になってますね。

SSL Server Testも実行してみます。

SSL Test – SSL Server Test (Powered by Qualys SSL Labs)
https://www.ssllabs.com/ssltest/

SSL LabsのSSL Checkを実行(1)

SSL Testのスコア

SSL LabsのSSL Checkを実行(2)

プロトコルとCipher Suites

SSL CheckのプロトコルとCipher Suites

問題ありません。

おまけ(NginxやOpenSSLのアップデートが公開された場合)

NginxやOpenSSLのアップデートが公開されたときの作業内容を説明します。

まず、今回利用した作業用仮想環境を立ち上げてSSHでログインし、yum updateを実行して環境を最新にします。

その後のRPMパッケージのリビルド作業は、「su builder -」で作業用ユーザーに変更(スイッチ)するところからは今回と全く同じです。最新バージョンのNginxまたはOpenSSLをダウンロードして設定ファイルを書き換えてリビルドしてください。

リビルドが完了したら新しいRPMファイルをダウンロードし、本番サーバーにSSH接続して「/tmp/orgMyRepo」にその新RPMファイルをアップロードします。

次のステップだけ少々違います。
既にorgMyRepoリポジトリは作成されているので、今回はcreaterepoの「--update」オプションで更新してリポジトリ情報を再読み込みします。

あとは通常のyumでアップデートが可能です。

まとめ

CentOS 7用のRPMパッケージをリビルドしてNginxをTLS 1.3に対応させることができました。

Nginxをアップデートする際は、今回作成した作業用の仮想環境でまた同じ処理を行って自作リポジトリにアップするだけ良いので、今後もyumで簡単にパッケージ管理ができてメンテナンスも楽です。

以上で解決です。