NginxでSSLを設定するには

Googleがhttps接続を推奨すると宣言しており、SSLの設定を行いたいと思っている人が増えているのではないかと思います。そのタイミングで常時SSL化というキーワードも注目されるようになりました。

SSLを設定するという時に想定されるのは、既に稼働しているサービスがあり、それをSSL化したいというニーズです。

以下では、既存のWordpress環境をSSL化する作業手順を記載しています。環境はCentOS、Nginx環境。

備考:SSLとは何か

Secure Socket Layerの略です。サーバと閲覧中のWebブラウザ間の通信を暗号化し、セキュアな接続を実現します。

[一番簡単]Let's Encryptを使ってSSL証明書をインストールする

セキュリティ証明書はかつては高価な代物でした。数万円するなんて当たり前みたいな時代がありました。時代は変わり、有料のものでも数千円。無料のセキュリティ証明書発行を行うサービスも登場しました。

ここでは、最近話題になっている、Let's Encryptを使ったSSL証明書のインストール方法を紹介します。

では、早速サーバにログインしてから

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt

Nginxが稼働中だとエラーがでますので一度止めます。

service nginx stop

こちらのコマンドでセキュリティ証明書を作りましょう。

./letsencrypt-auto certonly -a standalone --server https://acme-v01.api.letsencrypt.org/directory --agree-dev-preview -d あなたのドメイン

あなたのドメイン部分はドメインに置き換えてくださいね。こちらのサイトの場合は cui.tokyo

メアドを入力してEnterを押すと、承諾画面になります。

agreement

Agreeだと思いますので、Enterキーを押すと、セキュリティ証明書が作られます。

IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through
   e-mails sent to 入力したメールアドレス
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/あなたのドメイン/fullchain.pem. Your cert will
   expire on 2016-05-06. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - Your account credentials have been saved in your Let's Encrypt
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Let's
   Encrypt so making regular backups of this folder is ideal.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

セキュリティ証明書の位置は/etc/letsencrypt/live/

ls -l /etc/letsencrypt/live/

とやると、出力コマンドで入力したあなたのドメインのフォルダが掘られていると思います。

Cloudflare使っていてエラーが出る場合

Cloud flareに限らないと思うのですが、コンテンツデリバリーネットワーク(CDN)を使っていると恐らくエラーが出ると思います。

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: cui.tokyo
   Type:   tls
   Detail: Failed to connect to host for DVSNI challenge

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A record(s) for that domain
   contain(s) the right IP address. Additionally, please check that
   you have an up-to-date TLS configuration that allows the server to
   communicate with the Let's Encrypt client.

こんな感じで。こうなったら、一度cloudflareに入って、キャッシュの設定を解除しましょう。
cfoff
雲マークをおしてグレーになればOKです。その状態でコマンド打ってみてください。

nginxの設定ファイルを編集する

Nginxのconfファイルをいじります。
cui.tokyo の場合は、管理画面のみSSL化し、フロント部分はhttpのままです。
その為、confファイルには、serverブロックをhttp部分に加えて、ssl部分を加える事で運用しています。
以下のコードを /etc/nginx/conf.d/あなたのドメイン-proxy.conf に追記してください。

server {
    listen 443 ssl;
    
    # example.com、example.com/wordpress、wp.example.comなどを指定する。
    server_name あなたのドメイン; #例:cui.tokyo
    # ドキュメントルートの設定
    root        /var/www/html/あなたのドメイン; #私の場合はhtml以下にcui.tokyo というフォルダを掘ってそこにWordpressのファイルを入れています
    index       index.html index.htm;
    charset     utf-8;

    access_log  /var/log/nginx/$host.access.log  main;
    error_log   /var/log/nginx/$host.error.log;

    # アクセスログ、not foundログを無効にするための設定を読み込みます
    include     /etc/nginx/conf.d/common/drop.conf;

	#セキュリティ証明書へのパス
    ssl_certificate /etc/letsencrypt/live/あなたのドメイン/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/あなたのドメイン/privkey.pem;

# poodle対応
    ssl_protocols tlsv1 tlsv1.1 tlsv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    rewrite /wp-admin$ $scheme://$host$uri/ permanent;

    # 変数の初期化
    set $mobile '';

    location ~* ^/wp-(content|admin|includes) {
        index   index.php index.html index.htm;
        if ($request_filename ~ .*\.php) {
            break;
            proxy_pass http://backend;
        }
        # expiresヘッダー用の設定を読み込みます。
        include /etc/nginx/conf.d/common/expires.conf;
    }

    location / {
        # phpファイルへのアクセスの場合バックエンドに処理が投げられる。
        if ($request_filename ~ .*\.php) {
            break;
            proxy_pass http://backend;
        }
        # expiresヘッダー用の設定を読み込みます。
        include /etc/nginx/conf.d/common/expires.conf;

        # デフォルトではキャッシュするように変数に0をセットする。
        set $do_not_cache 0;
        # postアクセスの場合もキャッシュしないように変数に1をセットする。
        if ($request_method = post) {
            set $do_not_cache 1;
        }
        proxy_no_cache     $do_not_cache;
        proxy_cache_bypass $do_not_cache;

        proxy_redirect     off;
        proxy_cache        czone;
        proxy_cache_key    "$scheme://$host$request_uri$mobile";
        proxy_cache_valid  200 0m;
        # do_not_cacheの値が1の場合バックエンドに処理が投げられる。
        proxy_pass http://backend;
    }

        proxy_set_header host                   $host;
        proxy_set_header x-forwarded-proto      https;
        proxy_set_header x-forwarded-server     $host;
        proxy_set_header x-forwarded-for        $proxy_add_x_forwarded_for;

    # 50x系のページ設定/usr/share/nginx/htmlにあるファイルが使用される
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

追記後、nginxを起動しましょう。

service nginx start

これで完了です。お手軽すぎる!!

これまでstartssl使っていたのですが、こちらのほうが楽ですね。

無料:StartSSLを使って設定するには

StartSSL:https://www.startssl.com

Let's Encryptの方が100倍簡単なので、簡単な手順だけ紹介いたします。

StartSSLでやること

  1. アカウントの作成と、自分のPCへのStartSSLのセキュリティ署名のインストール。Macの場合はキーチェインに登録します
  2. ドメインの認証
  3. セキュリティ証明書の発行
  4. 自分のサーバにセキュリティ証明書を転送してLet's Encryptと同様にNginxのconfファイルを設定する

StartSSLで面倒なこと

ドメインの認証では、[email protected]あなたのドメイン や、 [email protected]あなたのドメインというメールアドレスを作成し、そこに来るメールに書かれたPINコードを使ってドメインの認証をする必要があります。若干ではありますが手間です。

StartSSLで面倒なこと2

セキュリティ証明書は一度ローカルにダウンロードする必要があるので、それを転送する必要があります。Let's Encryptが手軽すぎるというのがそもそもの問題だと思うのですが、これも若干面倒です。

StartSSLで良いこと

昔は違ったのですが、StartSSLでセキュリティ証明書を発行すると、Webサーバ毎(Apache,Nginx等)のキーを自動で生成してくれます。必要なファイルだけアップロードしてzipファイルを展開すれば、中間証明書もchainした状態で作ってくれているのでそれはめちゃめちゃ楽だと思います。有料サービスなんかでは、普通に自分でやれよという場合があるので、初心者にはあまり優しい作りとは言えません。

とはいえ

Let's Encryptが出るまでは、僕もこちらを使っておりましたので、より良いサービスになっていく事を期待。出てきた当初よりは、Webサイトも綺麗になったし、ファイルの自動生成も出来たし、確実に進化してます。頑張れStartSSL。

有料SSLとは何のためにあるのか

さて、ここまでは無料SSLの話をしたのですが(恐らく当サイトの読者層にはそちらのほうがニーズがあるでしょう)、ここでは有料SSLについて紹介します。

なぜ有料なのか

良くある勘違いに、有料SSLの方が暗号化レベルが高いというものなのですが、通信の暗号化という意味では仕組みが一緒なので同レベルです。
違いは、SSL発行事業者が、SSL取得者の事をどれだけ認証しているのかという違いです。

安い順から

  • 何も確認しない
  • メールアドレスの認証を行う
  • 電話の認証を行う
  • 会社の登記簿謄本の認証を行う

というイメージで、事業者の認証作業が重たくなっていきます。
当然、申請者側が用意するものも増えていきます。
会社等の存在認証までやると、Chromeではこんな感じで組織名が表示されるようになります。

twitterssl

お金のやり取りを行うようなサービスを立ち上げる場合は、組織の認証は個人的には必要だよねと感じます。
SSLの証明書自体は、上にも書いたとおり誰でも行うことが出来ます。
通信経路の暗号化は出来ますが、そもそものフィッシングサイトがSSL化されていたとしたら、信頼もへったくれもありません。
組織認証があるということは、その組織の存在が証明されるという事です。
何か事件になれば、然るべき対応が出来るという事を意味することになるでしょう。
どちらかと言うとユーザー側のリテラシーの問題という気もしますが、ビジネスに直結するようなサービスであればあるほど、そういった認証をするべきだと思います。

有料SSL代表的な事業者

参考:NginxでWordpressのSSL化をすると無限ループに陥るのを回避するには

オススメNginx本

nginx実践入門 (WEB+DB PRESS plus) 単行本(ソフトカバー) – 2016/1/16

nginxを現場で活用するための知識を、実践的なノウハウを交えて解説した書籍です。nginxのインストール方法や基本的な設定方法からはじめ、nginxを利用した「静的コンテンツ配信サーバ」「HTTPSサーバ」「Webアプリケーションサーバ」「大規模コンテンツ配信システム」の構築方法をそれぞれ詳しく紹介しています。後半ではnginxサーバのモニタリングやログの収集、そして軽量スクリプト言語Luaでnginxを拡張する方法について解説しているので、nginxをこれから使う方はもちろん、さらに活用したい方にもお勧めです。

公開日:
最終更新日:2016/03/01