SSLをGoogleと同じ暗号化方式で高速化!

福田です。
最近、Googleでは暗号化方式に「ChaCha20-Poly1305」という個人的に名前が面白いものが採用されているようです。
こちらは、複数のサイトによりますと、一般的に用いられているECDHE-RSAなどよりもおよそ処理速度が1/3~1/4程度になることが確認されています。しかし、OpenSSL 1.1以降は対応していますが、未だtestでFAILが多く出るなど、バグが多く、またOpenSSL 1.0.2では標準では対応していません。また、日本語の資料も数少ないです。
そこで、NginxでのChaCha20-Poly1305への対応方法を日本語でわかりやすく解説していこうと思います。

                       

対応させるまでのフロー

  1. OpenSSLのソースをダウンロード
  2. パッチをダウンロード
  3. パッチを当てる
  4. Nginxをオプション付きでコンパイルなどをする
  5. Nginxの設定を変更する

慣れていれば所要時間は大体5分(待ち時間は除く)程度です。
なお、事前準備の「Nginxをダウンロードする」、また「あらかじめNginxを削除しておく」などは本題ではないため省略させていただきます。

1.OpenSSLをダウンロードする

まず、OSの環境にこの暗号化方式が必要か否かでいえば基本必要ないので(SSL/TLS以外では基本的にChaCha20ではなくSalsa20という方式が用いられます)、Nginxに組み込むためにダウンロードします。
今回は、nginxソース/vendor/というフォルダを作成し、そこにダウンロードしました。
記事執筆時最新版は1.0.2fでした。
コマンドは次の通り。

sudo mkdir vendor
cd vendor
wget -O- https://www.openssl.org/source/openssl-1.0.2f.tar.gz | sudo tar xz
cd openssl-1.0.2f

すると、OpenSSLディレクトリ(openssl-1.0.2f/)に移動していると思います。

2.パッチをダウンロード

パッチは米国CloudFlare社が作ったGitHubのリポジトリからCloneしてきます。

sudo git clone https://github.com/cloudflare/sslconfig.git

3.パッチを当てる

パッチを当てます。パッチファイルを見たところ、オプションには「-p1」をつけるべきであると判断しました。
よって、次の通りとなります。

sudo patch -p1 < ./sslconfig/patches/openssl__chacha20_poly1305_cf.patch

これでエラーが出なければパッチあては完了です。

4.Nginxをオプション付きでコンパイルする

ここまでくればあと一息。Nginxをオプション付きでコンパイルしましょう。
今あなたがお使いのNginxのオプションは次のコマンドで確認可能です。

nginx -V

出力された中で「configure arguments: 」に続くものをメモしておいてください。
なお、この中にもし「--with-openssl=」から始まるオプションがあれば、それは取り除いてください。
ではコンパイルしましょう。

cd ../../
sudo ./configure (先ほどの出力されたオプション) --with-openssl=`pwd`/vendor/openssl-1.0.2f
sudo make
sudo make test

これでエラーが特にでなければ、コンパイル完了です。私はここで、ソースからコンパイルした際に使えるパッケージマネージャ「paco」を使い、インストールしました。インストールされていない方は#no use paco以下のコマンドを、pacoをご利用されている方はそれより上のコマンドを実行ください。

sudo paco -ua
sudo paco -lp nginx "make install"
#no use paco
sudo make install

インストール完了です。

5.設定を変更する

さて、これからNginxのSSL暗号化設定を変更します。
あなたが設定した設定ファイルの中で、「ssl_ciphers」の設定項目があるファイルを開いて、その設定値の最初に次のものを追記してください。

EECDH+CHACHA20:EECDH+CHACHA20-draft:

例としては、このような感じです(できればそのままコピーしない方がいいと思います):

ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

あとは、設定をテストし、Nginxを再起動するのみです。
もし、すでに起動していれば

sudo nginx -t && sudo nginx -s reload

を実行すれば、即時反映されます。
起動をまだしていない、あるいは止めた場合は

sudo nginx -t && sudo service nginx start

あるいは(上でエラーが出た場合も)

sudo nginx -t && sudo nginx

で起動できます。
設定でエラーが出た場合はそれを確認の上、直して起動にこぎつけてみてください。

参考資料

CloudFlare/SSLConfig | GitHub
Poly1305 | Wikipedia
Do ChaCha Better Mobile Performance With CryptoGraphy(英語) | CloudFlare Blog

この記事は最終編集から一年以上経過しております。この記事に書かれた内容をご利用・実践される際は十分ご注意ください。

Sponsored link

コメントは受け付けていません。