セキュリティ

無料でVPSに構築したWebサイトをSSL(https)化する方法

無料でVPSに構築したWebサイトをSSL(https)化する方法のイメージ

こんにちは、ベトナムに居を移して初投稿となります。
日本と違って常夏の国なので、寒くて指先が痺れるということもなく快適です。

今日は昨今のサイトには必須とまで言われるサイトのSSL化について紹介します。
SSL化とはURLバーに表示されるURLがhttpsから始まるもので、主にサイトのセキュリティを高める効果があります。

ただ、WordPressでブログを始めた、という場合にセキュリティのことまで考えるのは難しいかもしれません。
しかしながら、実際のところSSL化はただセキュリティを向上させるだけではなく、Googleの検索エンジンからの評価もよくなるためSEOにも確実に効果を表します。

なお、簡単に1クリックでSSL化できるレンタルサーバではなく、Let’s encryptを利用して自分でSSL化する手順となりますので、ご容赦ください。
サーバOSはUbuntu 18.10です。

無料でSSL(https)化できるLet’s encryptとは何か

Let’s encryptとは、2016年4月に開始されたHTTPSを普及させるためのプロジェクトです。
いくつもの大手企業がスポンサーに入り活発に活動しています。

無料で証明書を発行することによってSSL化の敷居がだいぶ低くなったため、多くの個人サイトやブログでも利用されているので、もはや標準的な存在といえます。

Let’s encryptの基本方針

  1. 無料であること
  2. 運用を自動化できること -> 証明書の更新のたびにサーバでの作業をしなくて済みます
  3. 安全であること -> 最先端のTLS実装
  4. 透明性があること -> 発行&失効が公式に記録されるのでユーザーに対しても透明性を保っています
  5. オープンであること -> プロトコルが公表されています。
  6. 協力のもと成り立つこと -> 企業の独占的な取り組みではありません。

Let’s encryptでドメインを認証する流れ

Let’s encryptがドメインを認証する流れを簡単に説明すると、

  1. Let’s encryptを実行しているサーバでドメインを所有していることを証明
  2. 証明されたことによって認証局により認可されSSL通信が可能になる

といった形になっています。

ざっくりした説明となりますが、詳しく知りたい場合は総合ポータルを参考にしてみてください。
証明書を購入してそれを設置して、といった従来の流れを考えると非常に画期的です。

新規WebサイトをLet’s encryptでSSL化

それでは実際にLet’s encryptでSSL化にトライしてみましょう。
※環境はUbuntu 18.10, WebサーバはNginx 1.15.5 (Ubuntu)です。

Let’s encryptとCertbotのインストール

Let’s encryptはパッケージ管理一発なので特に迷うことはないと思います。
CertbotはLet’s encryptのクライアントソフトウェアで、証明書の発行や更新といったアクションを自動化してくれます。

$ sudo apt-get -y install letsencrypt

つづいてCertbotのインストールです。
Ubuntu 18.04までは2018年12月4日現在、PPAより取得できるようですが、Ubuntu 18.10 Cosmic用のPPAは取得できないので手動で入れます。

$ cd /usr/local/src
$ sudo wget https://dl.eff.org/certbot-auto
$ sudo chmod a+x certbot-auto
$ sudo mv certbot-auto /usr/local/bin/

これで certbot-auto コマンドを利用できるようになります。

証明書の取得

証明書の取得に際して、Nginxで認証局からドメインを所有していることをわかるように設定しておきます。
あらかじめDNSが設定されている前提です。

$ sudo mkdir -m 777 -p /var/www/vhosts/tmp
$ sudo emacs /etc/nginx/conf.d/something.conf
# /etc/nginx/conf.d/something.conf
server {
  listen 80;
  server_name ドメイン名;
  root /var/www/vhosts/tmp;
  index index.html;
}

これを行う理由として、認証局が http://ドメイン/.well-known/acme-challenge/ハッシュ値 というリクエストを送ってくるので、それを受けられるようにしなければならないのです。
以下のコマンドで証明書を取得しますが、途中でWebサーバに設定するかスタンドアロンで設定するかwebrootにファイルを置くことで設定するかを選べるので、3のwebrootを選びましょう。

$ certbot-auto certonly -m メールアドレス -d ドメイン --rsa-key-size 4096 -w /var/www/vhosts/tmp
Requesting to rerun /usr/local/bin/certbot-auto with root privileges...
Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Nginx Web Server plugin (nginx)
2: Spin up a temporary webserver (standalone)
3: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-3] then [enter] (press 'c' to cancel): 3
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for ドメイン名
Using the webroot path /var/www/vhosts/tmp for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/ドメイン名/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/ドメイン名/privkey.pem
   Your cert will expire on 2019-03-04. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:

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

Congratulations!が出たらOKです。

/etc/letsencrypt/live/ドメイン名/ に証明書が作成されました。

ちなみにcertbot-autoのサブコマンドとオプションの説明をすると、

  • certainly = 証明書の取得のみを行う。今回はインストールも自分で行います。
  • -m = メールアドレス。更新時期が近づくとメールで知らせてくれます。
  • -d = ドメイン。
  • —rsa-key-size = デフォルトで2046に設定されているRSAの鍵長です。
  • -w = webrootを選んだ際のルートディレクトリです。

実際はcertbot-autoだけでも対話形式で入力できるのですが、面倒なので最初にオプションで渡してしまっています。

証明書のインストール&Webサーバの設定

証明書のインストールというと大それた雰囲気ですが、結局のところWebサーバに設定してあげるだけです。
ドキュメントルートをWordPressを置いているディレクトリにすればそのままWordPressがそのままSSL化されます。
以下はWordPressが置かれているsomethingディレクトリに設定した例です。

$ sudo emacs /etc/nginx/conf.d/something.conf

# /etc/nginx/conf.d/something.conf
server {
  listen 443 ssl http2;
  server_name ドメイン;
  root /var/www/vhosts/something;
  index index.php;

  resolver 8.8.8.8 8.8.4.4 valid=300s;
  resolver_timeout 5s;
  ssl_trusted_certificate /etc/letsencrypt/live/ドメイン/fullchain.pem;
  ssl_session_cache shared:SSL:50m;
  ssl_session_tickets off;
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
  ssl_stapling on;
  ssl_stapling_verify on;
  ssl_protocols  TLSv1.3;
  ssl_certificate /etc/letsencrypt/live/ドメイン/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/ドメイン/privkey.pem;
  include /etc/letsencrypt/options-ssl-nginx.conf;
  add_header Strict-Transport-Security 'max-age=31536000;' always;

  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}

server {
  listen 80;
  server_name ドメイン;
  return 301 https://ドメイン;
}

Certbot-autoで証明書を取得した際にデフォルトで作られる /etc/letsencrypt/options-ssl-nginx.conf もそのまま使うと上記のような設定になります。 ついでなのでhttpでアクセスされた際のリダイレクト設定も入れてあります。

なお、新規格であるhttp2やTLS1.3への対応も兼ねている設定となっておりますが、nginxやOpenSSLのバージョンによってはTLS1.3は利用できませんので注意してください。

すべて終わったら以下のSSL Labsでテストしてみると良いです。
ここでA+になっていれば、SSL化としては上々の結果といえます。
Qualys SSL Labs

無料SSL化でユーザーと資産を守る必要性

無料とはいえど、SSL化については昨今のWeb業界ではほぼマストとなってきています。
少し前はどうしてもSSL証明書が比較的高額だったため、個人では導入を迷うものでしたがLet’s encryptであればSSLを導入することにためらう必要性もなくなりました。

大切なユーザーとWeb上につくりあげてきた資産を守るためにも、Webサイトをhttps対応にして防御力をあげておくことを強くオススメします。

ABOUT ME
UOT合同会社 / SOT Co.,Ltd 合同開発部
UOT合同会社 / SOT Co.,Ltd 合同開発部
UOT合同会社 / SOT Co.,Ltd開発部の合同公式ブログ。 代表がITエンジニア出身のデジタルノマド→日本とベトナム・ホーチミンでIT企業設立。 海外デジタルノマドやエンジニアのリモートワーク、プログラミング、オフショア開発やミニラボ情報などをまとめていきます。