SSLをGoogleと同じ暗号化方式で高速化!
福田です。
最近、Googleでは暗号化方式に「ChaCha20-Poly1305」という個人的に名前が面白いものが採用されているようです。
こちらは、複数のサイトによりますと、一般的に用いられているECDHE-RSAなどよりもおよそ処理速度が1/3~1/4程度になることが確認されています。しかし、OpenSSL 1.1以降は対応していますが、未だtestでFAILが多く出るなど、バグが多く、またOpenSSL 1.0.2では標準では対応していません。また、日本語の資料も数少ないです。
そこで、NginxでのChaCha20-Poly1305への対応方法を日本語でわかりやすく解説していこうと思います。
対応させるまでのフロー
- OpenSSLのソースをダウンロード
- パッチをダウンロード
- パッチを当てる
- Nginxをオプション付きでコンパイルなどをする
- 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
この記事は最終編集から一年以上経過しております。この記事に書かれた内容をご利用・実践される際は十分ご注意ください。