無料SSL証明書を利用して簡単な設定で自動的にサイトをHTTPS化

無料SSL証明書を利用して簡単な設定で自動的にサイトをHTTPS化

安全なHTTP:HTTP Secure

HTTPSはSSL/TLSを用いてHTTPデータを暗号化したプロトコルです。デフォルトポートは443。
HTTPSはインタネット通信の内容を暗号化して、パスワードやカード情報といった機密情報を漏洩を防ぐことができ、さらにサーバー認証もできるため、フィッシングサイトなどのなりますし対策にも有効です。

HTTPSで通信する際にまずサーバーのシグネチャー認証と暗号化キーの共有を行います:

  1. クライアントがHTTPSサーバーに接続リクエストを送信します。
  2. サーバーが自分のSSLバージョンと公開鍵Aをクライアントに送信し、クライアントが共通鍵Zを生成して、サーバーの公開鍵AでZを暗号化したZ'をサーバーに返します。
  3. サーバーが自分の秘密鍵でZ'を復号して、共通鍵Zを取得します。
  4. これからは共通鍵Zで通信内容を暗号化して通常のGET/POSTを行います。

この流れで、サーバーとクライアントしかZをもっていないのと、Z自体も通信セッション毎に異なりますので、従来のHTTPにあった通信内容が第三者に漏洩するリスクを解消しました。
また、フィッシングサイトなど、「本物」のサーバーでなければ秘密鍵がないため、通信用の共通鍵Zを復号することができず、クライアントとの通信ができないできません。

HTTPS対応は推奨ではなく、必須になりました。

  • HTTPSのセキュリティ面のメリットが大きいため、Googleは2010年からHTTPSを導入。
  • 2014年、GoogleはHTTPSを推奨し、HTTPSのサイトを優先的に表示するようにしました。
  • 2017年、ChromeブラウザがHTTPサイトを開く際にセキュリティ警告を出すようになりました。
  • 2019年から、ChromeブラウザがHTTPを全般的に禁止し、HTTPSサイト内のHTTPコンテンツに対しても表示しないようにマスクを行うことになりました。

この時代のながれから、以前は推奨と言われているHTTPSの対応が段々必須になってきました。
HTTPSを導入するためのSSL証明書の発行費用とサーバーへの配置が個人ブロガーにとって敷居が高かったかもしれませんが、実は無料で証明書を発行して、自動的にサーバーへ配置する方法が存在しています。

無料なSSL証明書

2016年4月から、HTTPSの利用を推進するため、無料でSSL証明書を発行するLet's Encryptという認証局が設立されました。
無料SSL証明書だけではなく、Let's EncryptはCertbotという自動的に証明書を取得して、サーバーに配置するオープンソースツールも同時に提供しています。
これからは無料でウェブサイトをHTTPSかする手順を紹介します。

Certbotをインストール

  1. CertbotがUbuntu serverの標準ライブラリに含まれていないので、まずは手動でapt-getにPPAを追加します。
    sudo apt-get update
    sudo apt-get install software-properties-common
    sudo add-apt-repository ppa:certbot/certbot
  2. NginxバージョンのCertbotをインストールします。
    sudo apt-get update
    sudo apt-get install python-certbot-nginx
  3. Certbotを起動し、Nginxのコンフィグを任せます。
    sudo certbot --nginx

    --nginxオプションを付けることで、certbotが自動的にNginxのコンフィグを認識し、自動でNginxのコンフィグにHTTPSかするための記述を追加します。
    このコマンドを実行するといくつかの案内があり、案内に従ってHTTPSかするドメインを選択し、HTTPからのアクセスをHTTPSにリダイレクトするように設定して、最後は更新の通知を受け取るメールアドレスを入力すれば設定完了です。

これだけでウェブサイトのHTTPS化が完成しました。

証明書自動更新

Let's Encryptが発行する証明書の有効期限が90日。短めですが、certbotを利用して自動的に更新することが可能です。
まずは自動更新が正常に動作しているかをテストします。

sudo certbot renew --dry-run

正常に更新できることを確認出来たら、crontabでタスクを追加して、毎日更新を実行するようにします。
bashを作って期限切れの直前に更新するようにしても構いませんが、プログラムであればバグる可能性がありますし、certbot内部でも証明書の有効期限をチェックして、更新不要であれば更新作業を行わないようにしているので、Let's Encryptが毎日実行するという一番シンプルな方法を推奨しています。

sudo crontab -eでcronの編集モードに入って、タスクを追加します。

0 0 * * * certbot renew

これで毎日0:00に更新を実行するように設定しました。自分の好きな時間設定にして保存してください。
そしてcrontabを再起動して先ほどの設定を発行させます。

sudo service cron restart

これで簡単に無料でHTTPSを導入しました。