Debian 9の例を使用して、NginxでTLS v1.3サポートを有効にします

すべての人に良い一日を!



この記事は、疲労、眠気、 金曜日の夜にビールの別のボトルをノックオーバーする誘惑の底に到達したいという欲求の勝利のために書かれました NginxにTLS v1.3を含めるだけで、非常に複雑なことは何も明らかにしていません。



画像






確かにHabréには既にこれを100回行っている人がいるので、この記事は初心者や、たとえば私のように検索に多くの時間を費やすことなく、マニュアルの形で既製のソリューションを見つけたい人向けです。 長い間Habréに書き込みがなかったことを思い出し、記事タグ「チュートリアル」を付けたことで、仕事に取り掛かりました。



Habréで簡単に検索したところ、このトピックに関する投稿はありませんでしたが、質問者が「馬鹿自身」のスタイルでコメントで回答された「トースター」に関するトピックがありました。



少なくとも私が作業マニュアルを見つけられなかったパブリックドメインでは、質問は未回答のままであることが判明しました。 良くない、あなたは状況を修正する必要があります:)



すべては、LetsencryptからSSL証明書をセットアップするという事実から始まりました(この記事のフレームワークでは、証明書の発行者は絶対に重要ではありません)。

画像

(ssllabs.comでSSL証明書のセットアップをテスト、レビュー)



そして、Jiraのタスクを静かに閉じて帰宅することは可能ですが、私の視線はTLS 1.3のサポートのポイントを引き付けました。 より正確には、TLS 1.3のこの非常にサポートが存在しないだけであることが指摘されました!



画像

(ssllabs.comでのSSL証明書のセットアップのテスト、詳細)



まあ、彼らが言うように、



画像



もちろん、この点は以前に見ましたが、どういうわけか重要性を付け加えませんでした。 そして今回、彼は精神的に「これで十分だ!」と言いました。新しいプロトコルを有効にする方法を理解する必要があります。



背景のビット。 TLS v1.3のリリースは最近のニュースではなく、新しいバージョンの作業は長年にわたって継続されています。 TLS v1.2の発表からほぼ10年が経過しました。 したがって、 2017年4月に、 TLS v1.3をサポートするnginxバージョン1.13.0がリリースされました。



尊敬されている読者がnginx> = 1.13.0を設定してそれを書くだけで十分だと思ったら



ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
      
      





バーチャルホストの設定では、結論を出して発散するために急いではいけません、私はこの「離婚」のためにも落ちました:)



nginx> = 1.13.0のインストールされたバージョンで、設定に上記の行がある場合



 nginx -t
      
      





エラーは発生しませんが、これはプラスですが、 ssllabsテストではTLS 1.3がまだオンになっていないことが示されており、これは大きなマイナスです。



後に、要件を検討した後、現在開発中のopenssl> = 1.1.1サポートでnginx> = 1.13.0をコンパイルすることでプロトコルの新しいバージョンを動作させることができることに気付きました。プロトコルのドラフトバージョンは厳密に18です。結果は異なります。 私は詳細には触れませんでしたが、現時点では、ドラフトの18番目のバージョンが基礎として採用されましたが、ssllabsによってテスト結果の免責事項で親切に報告されています



画像

(ssllabs.comでのSSL証明書のセットアップのテスト、詳細)



手続き



1. / etc / nginxの内容を/ backupのどこかに保存します。その前に、必要な仮想ホストをすでにセットアップして、それを繰り返しないようにします。 すぐにできる



 apt-get remove --purge nginx
      
      





2. openssl 1.1.1 tls1.3 draft 18のソースをダウンロードして解凍します



 wget https://github.com/openssl/openssl/archive/tls1.3-draft-18.zip
      
      





3. opensslの準備作業



 apt-get install build-essential libpcre3 libpcre3-dev zlib1g-dev checkinstall
      
      





4. opensslを収集します。



opensslアーカイブの解凍されたコンテンツがあるディレクトリに移動します



 cd openssl-tls1.3-draft-18
      
      





 ./config
      
      





 make && make install
      
      





5. nginxの準備作業



 apt-get build-dep nginx
      
      





 apt-get install libossp-uuid-dev
      
      





 apt-get install libxml2 libxml2-dev
      
      





 apt-get install libxslt-dev
      
      





 apt-get install libgd-dev
      
      





 apt-get install libgeoip-dev
      
      





 wget http://nginx.org/download/nginx-1.13.7.tar.gz
      
      





 tar xvf nginx-1.13.7.tar.gz
      
      





 cd nginx-1.13.7
      
      





 ./configure --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-file-aio --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_secure_link_module --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module --with-ld-opt=-lossp-uuid --with-cc-opt=-I/usr/include/ossp --with-openssl=/root/openssl-tls1.3-draft-18 --with-openssl-opt='enable-tls1_3'
      
      





nginx configuratorを起動するとき、必要なバージョンの展開されたopensslソースへの正しいパスを指定することが重要です。 /ssl/openssl-tls1.3-draft-18があります。opensslソースを含むディレクトリへの別のパスがある場合は、-with-openssl =オプションを変更します。



opensslおよび/またはnginxコンフィギュレーターの実行段階で、エラーが表示される場合があります。主に通常のgoogleで処理されます。 原則として、一部のライブラリは見逃されますが、特別なものはありません。

90%は、コンフィギュレーターが見つけられなかったコンポーネント/パッケージの名前を取得して実行することで解決されます。



 apt-get install [ ]-dev
      
      





そして、コンフィギュレータを再度実行します。 コンフィギュレーターがエラーなしで機能するまで、この手順を繰り返します。



それから



 gawk -i inplace '/pthread/ { sub(/-lpthread /, ""); sub(/-lpthread /, ""); sub(/\\/, "-lpthread \\"); print } ! /pthread/ { print }' "objs/Makefile"
      
      





最後のコマンドは、nginxのコンパイルのバグを修正します。 これは、openssl v1.1.1が現在開発段階にあるだけであり、nginx では現時点では何も考慮されいないためです。



6. nginxのコンパイル



打ち上げ



 make
      
      





コンパイルが成功した後、 make installを急いではいけません。すべてを美しく行う方が良いです。



 mkdir /usr/lib/nginx
      
      





 mkdir /var/log/nginx/
      
      





 mkdir -p /var/lib/nginx/body
      
      





 checkinstall --pkgname=nginx --pkgversion=1.13.7 --nodoc
      
      





checkinstallを実行する前にディレクトリを作成する必要があります。debパッケージをビルドした後、システムにインストールしようとするため、一部のディレクトリが十分でないと失敗するためです。



この時点で、nginxをシステムにインストールする必要がありますが、実行する場合



 nginx -t
      
      





そのnginxが表示されます-そのようなコマンド/バイナリはありません。 動揺するのを急がないでください、それは標準のPATHパスではなく、ここにインストールされているということです-/ usr / share / nginx / sbin / nginx



したがって、実行する必要があります



 /usr/share/nginx/sbin/nginx -t
      
      





美しくするために



 ln -s /usr/share/nginx/sbin/nginx /usr/sbin/nginx
      
      





そして、実行します



 nginx -t
      
      





あなたの健康とエラーなし。



小さなマイナス-nginxをインストールした後、init.dスクリプト、systemdの設定はありません。

次のように扱われます(方法の1つ)。



 vim /lib/systemd/system/nginx.service
      
      





これは新しいファイルです。自分で作成し、内容を入力します



 [Unit] Description=A high performance web server and a reverse proxy server After=network.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/share/nginx/sbin/nginx -t -q -g 'daemon on; master_process on;' ExecStart=/usr/share/nginx/sbin/nginx -g 'daemon on; master_process on;' ExecReload=/usr/share/nginx/sbin/nginx -g 'daemon on; master_process on;' -s reload ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid TimeoutStopSec=5 KillMode=mixed [Install] WantedBy=multi-user.target
      
      





それから



 systemctl enable nginx.service
      
      





nginxディレクトリーを/ backupから/ etcに戻します。checkinstallおよびdpkg -iを実行した後に何かがそこに置かれているため、この前に/ etc / nginxを削除することをお勧めします。



nginxを実行する準備ができました



 systemctl start nginx
      
      





すべてが上昇するはずですが、そうでない場合は、少しのトラブルシューティングが役立ちます。



別の小さなタッチ。 nginx仮想ホストを設定し、新しい暗号セットをアクティブにする必要があります。



正確には覚えていませんが、暗号が言及されたソースを見つけるのに1時間以上かかり、TLS 1.3では次のようになります。



 ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:ECDHE:!COMPLEMENTOFDEFAULT;
      
      





一般的に、私が得たnginxの設定はこれです:



 server { listen 443 ssl http2; server_name tls1.3.netforce.ua; access_log /var/log/nginx/tls1.3.netforce.ua_access.log combined; error_log /var/log/nginx/tls1.3.netforce.ua_error.log; ssl on; ssl_dhparam /etc/nginx/dhparam.pem; ssl_certificate "/etc/nginx/ssl/server.crt"; ssl_certificate_key "/etc/nginx/ssl/server.key"; add_header Strict-Transport-Security "max-age=31536000"; ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:ECDHE:!COMPLEMENTOFDEFAULT; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; root /var/www/tls1.3; index index.html; } server { listen 80; server_name tls1.3.netforce.ua; rewrite ^(.*)$ https://tls1.3.netforce.ua$1 permanent; }
      
      





これは、本番環境の既製の構成ではありません。キャッシュ、圧縮、またはその他の有用で重要なものはありません。 この記事の目的は、TLS 1.3以上を有効にすることです。



編集後、すべてが正常であることを確認します



 nginx -t
      
      





その場合、nginxを再起動して、ssllabsテストを実行します。 こんな感じ



画像



など



画像



ローカルマシンで新しいプロトコルを直接テストできるように、Chromeブラウザー、FirefoxでTLS 1.3サポートを有効にする方法については、 こちらをご覧ください。



これで落ち着いて家に帰ることができます:)



誰かが助けてくれることを願っています。 よろしくお願いします!



All Articles