TLSv1.0やTLSv1.1は既知の脆弱性があるために、各種ブラウザでも対応が打ち切られています(参考「ついにTLS 1.0/1.1の無効化が決定!影響や確認・対応方法とは? | さくらのSSL」)。なので、もうサーバー側で対応する理由はないわけで、無効化する必要があるのですが、nginxの設定をなんぼいじっても無効化できないと思ったら、certbotでLet's Encrypt使っている場合そっちの対応もあって半日ハマっていました。
TLSv1.0とTLSv1.1が使えるせいで、ssllabs.com のテストでB評価と言われる。実際、ほとんどのブラウザで無効化されるし、もはやサポートする理由がないので切りたい。
作業に入る前に、先に確認の仕方を見ておく。
簡易的に見るならば、以下のコマンドを実行するとよい。
TLS1.1
openssl s_client -connect example.com:443 -no_tls1_2
TLS1.2
openssl s_client -connect example.com:443 -no_tls1_2
それぞれ実行するとずらずら表示される。対応していなければ SSL handshake has read 7 bytes and written 0 bytes というようなバイト表示がされる。ので、-no_tls1_2オプションをつけた時にそうなればよい。
時間がかかるので最初と最後だけ受ければいいと思うが、SSL Server Test (Powered by Qualys SSL Labs) でテストを受けて確認する。TLSv1.0、v1.1をサポートしていると、Protocol Support の項目で怒られる。
よければこんな感じ。
nginxの設定ファイルと、certbotでLet's Encrypt使っている場合はそちらのファイルも見る。むしろそっちだけでもいい。
nginxの設定ファイルの基本については過去記事「nginxの設定ファイル nginx.conf の読み方 超入門 – 或る阿呆の記」を参照。
httpディレクティブ内にある、ssl_protocolsの項目を以下のように記述する。
ssl_protocols TLSv1.2;
もしかしたらserverディレクティブに記述しているかもしれないが、その場合は /etc/nginx/sites-available/* の設定ファイルの記述を確認する。
TLSv1.3も対応しているならそれも書いておく。ただしTLSv1.3対応については本記事ではスコープ外。
そして文法チェックしてOKだったら再起動。
sudo nginx -t
sudo systemctl restart nginx.service
で、だいたいどこのサイトもこれでOK!とあるのだが、実際にやってみると相変わらずTLSv1.0とTLSv1.1が一向に無効化されなかった。他の設定も色々試したが駄目。
結局たどり着いたのはここ「How to remove TLSv1.0 / 1.1 and enable TLS 1.3 in Nginx – libre-software.net」で、certbot + Let's Encryptで証明書発行している場合は、こちらの設定があるのだという。
具体的には、/etc/letsencrypt/options-ssl-nginx.conf について、ssl_protocolsを確認する。TLSv1.1とかの記述があったらそれが原因なので、removeしておく。
ssl_protocols TLSv1.2;
これでnginxを再起動して、確認したらいけるはず。
むしろこちらの設定だけで、nginxの設定はしなくてもよかった。このサイトのサーバーがそうで、nginxの設定ファイル見たらTLSv1.0、TLSv1.1切ってないのに実際には使えなくて、変だなーと思っていたら、こっちの設定で切っていたという。
まぁでも、nginxの設定もちゃんとしておくにこしたことはないね。
ありがとうございました!
IoT関係で技術者としてお仕事しています。 趣味のブログは9年目に突入しました。 16性格診断はINFP-T。どんな心理テストでも高い内向性を叩き出せます。 友人とWebサービス開発してます。https://qnqtree.com
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント