CentOS 7

CentOS 7.4でnginxにhttp/2とHTTPS対応設定をする

今回はさくらVPSでテンプレートOS(CentOS 7.4)のnginxに
http/2とhttps通信の設定を施します。
設定が本当に完了したのか、確認をする手順まで書いてます。

nginx.confの設定をhttp/2対応にする

早速nginxの設定を変更していこうと思います。
デフォルトだとhttpで動作するようになっていると思いますが
以下のように変更していきましょう。

    server {
        listen       80;
        server_name  www.serverbuild.net;
        return 301   https://www.serverbuild.net$request_uri;
    }
    server {
        listen       443 ssl http2;
        server_name  www.serverbuild.net;
        root         /var/www;
        index        index.php;

httpで来たリクエストにはhttps://~で始まるURLにリダイレクトする処理を書いてます。
こうすることで、強制的にHTTPS通信に切り替えられます。
また、listenの項目でhttp2を指定することにより、
サーバ再起動後にhttp/2が有効になります。

よりセキュアにするための設定

上記設定ではまだ中途半端な状態です。
特に、listenでHTTPSの設定を入れていますが、
証明書の設定やその他の最適化設定が入ってません。
ここからはよりセキュアなサーバとするための設定を解説します。

HTTPS化全体概要

HTTPSで通信させるには、ご存知かと思いますが証明書を取得し
適切に設定する必要があります。
手順としては、
・証明書取得
・取得した証明書のパスをnginxの設定ファイルに記述
・nginx再起動
・動作確認
このようになります。

証明書取得

ということで、まずは証明書を取得していきましょう。
ネットで調べるとLet’s Encrypt?なる無料のサービスがありますが、
私はオススメしません。
理由は、3ヶ月に1回証明書の更新を行わなければならないためです。
定期的に証明書の有効期限を気にしないといけないのは精神衛生的に?よろしく無い気がします。
なので、可能であればできる限り安いところで証明書取得しちゃいましょう!
私が自宅サーバ用に使っている証明書はネットオウルのものです。

ネットオウル

ちなみに、無料証明書は利用しないと言ってますが、
このサイトを公開しているサーバがX-SERVERなので
管理画面から簡単に証明書を発行できました(Let’s Encrypt w)
自前でサーバのセットアップをし、証明書も適用するという場合には無料版をオススメしないだけなので
レンサバとか使われている方は気にしなくてもいいですね。

証明書をconfig内で指定する

さて、どうにか証明書を取得できましたら、
以下のような設定をすることで、httpsに対応したサーバとすることができます。

    server {
        listen       443 ssl http2;
        server_name  www.serverbuild.net;
        root         /var/www;
        index        index.php;
        ssl_certificate       /opt/certificate.pem;
        ssl_certificate_key   /opt/server.key;
        ssl_dhparam     /opt/dhparam.pem;
        ssl_ciphers  EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout 5m;
        ssl_trusted_certificate  /opt/int.pem;
        add_header Strict-Transport-Security "max-age=15768000; includeSubdomains";

ssl_certificate / ssl_certificate_key

ssl_certificateについては結合した証明書を指定してください。
ちなみに、nginxはサーバ証明書と中間証明書を結合する必要があります。
以下のコマンドで結合しておきましょう。

 # cat server.pem int.pem ca.pem >> certificate.pem

server.pemがサーバ証明書、int.pemが中間証明書、ca.pemは必要に応じてCA証明書を指定します。
ちなみにネットオウルではca.pemが必要ありません。
中間証明書の中にCA証明書も含まれていますので。。。
ということで、上記のコマンドから生成されたcertificate.pemをssl_certificateに指定します。
ssl_certificate_keyはサーバの秘密鍵です。
サーバ証明書ではないので、ご注意ください。

ssl_dhparam

ssl_dhparamについては、Diffie_Helmanの鍵交換アルゴリズムに関する設定となります。
以下のコマンドを叩いておきましょう。

# openssl dhparam -out /opt/dhparam.pem 2048

その他ssl_となっている設定項目については特に解説しませんが、
あったらいいと思われるものを設定しているかんじです。

add_header

この項目についてはHSTSというものを使う設定で、
サーバ側がTLS通信を強制するための設定となります。
Googlebotが巡回するときに、最初からTLS通信を行うようになるみたいなので、
リソースを無駄に使わずに済むようです。
以上の設定でnginxのhttp/2,https化が完了しました。
ようやく安心してWebアプリ開発ができるようになりましたねw
ひとまず安心です。

SSL設定が安全な状態に最適化されているか確認

googlesearch ssllab
検索キーワード:ssllab
上記のように検索をしてみると一番最初に「Qualys SSL Labs」というサイトが出てきます。
早速アクセスしてみましょう。
ssllab-top
トップページが表示されたら、写真の赤枠部分「Test your server >>」をクリックします。
ssllab-hostname-input-field
ページが移動したら、「Hostname:」の部分に自サイトのFQDNを入力します。
当サイトもチェックしてみます。
ssllab-pleasewait
しばらく待ちます。。。
ssllab-result
結果は「A-」でした。
A以上あればとりあえず問題ないので、問題がある部分については調べて直してみてくださいね。

HTTP/2(SPDY)の確認をする方法

HTTP/2の確認を行うには、Google Chromeを利用する必要があります。
Chromeを使っていない方はインストールから実施してくださいね。
google-search-http2
Chromeを立ち上げたら以下のように検索します。
検索キーワード:google extension http2
検索結果の一番上に出てくるリンクをクリックして、
次のページから拡張機能を追加します。
※私はすでにインストール済みのため、ボタンが違います。
extension-http2
完了したら、右上の閉じるボタンの下あたりに稲妻マークのアイコンが追加されます。
当サイトは以下のように表示されます。
HTTP/2-enabled-h2
ちなみに、先ほど確認していた「SSL Lab」のサイトでは、
以下のようになりました。
NOT-SPDY-enabled
以上、設定および設定確認の方法を紹介しました。

関連記事

CentOS 7 firewalldを無効化する手順
さくらVPSのCentOS 7.4にhttp/2対応nginxを構築した話

-CentOS 7
-, , ,

© 2021 サーバ構築.net Powered by AFFINGER5