Nginx(Ubuntu)で「Let’s Encrypt」無料SSL証明書を設定する方法

プライバシーのヒントに関する多くの記事を読んできたなら、「HTTPS everywhere」拡張機能をインストールするように勧められることがあるでしょう。この拡張機能は、可能な限り自動的にウェブサイトのHTTPS版にリダイレクトします。しかし、悪いことに、HTTPS everywhere拡張機能は、訪問しているウェブサイトがSSLを実装している場合にのみ機能します。実際、多くのウェブマスターにとって、その実装は難しく(お金がかかる)タスクです。幸運なことに、Let’s Encryptの運動により、ウェブマスターが自分のサイトにSSL証明書を追加するのが容易になりました。

過去(および現在)、SSL証明書を設定するには、まずサーバー上でプライベートキーを生成し、その後証明書発行機関からSSL証明書を購入(これには高額な費用がかかることがあります)し、最後にそれをサーバーに設定する必要があります。このプロセスには多くの技術的要素が関与しており、正しく行わなければSSL証明書は無効になってしまいます。しかし、Let’s Encryptプロジェクトを利用すれば、コストなしで簡単にSSL証明書を自サイトに追加できます。Mozilla、Akamai、Cisco、EFF、およびGoogleなどの大手企業が後ろ盾となっており、ほとんどのブラウザとオペレーティングシステムでサポートされています。

このチュートリアルでは、NginxサーバーにLet’s Encrypt SSL証明書を設定する手順を説明します。このチュートリアルではUbuntu 14.04サーバーを使用し、稼働中のNginx Ubuntuサーバーを前提としています。指示はUbuntu 16.04サーバーでは異なる場合があります。

Let’s Encryptのインストール

まず、Let’s Encryptをインストールするために、gitを使用してそのgitリポジトリからクローンする必要があります。次のコマンドでgitをインストールします:

sudo apt-get install git

インストールが完了したら、Let’s Encryptのリポジトリをクローンします:

sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

環境の設定

SSL証明書のインストールと設定を進める前に、ウェブルートディレクトリ内の.well-knownフォルダーにアクセスできるようにすることが重要です。デフォルトでは、ファイル名の前に「.」が付くすべてのファイルとフォルダーは隠されており、一般にはアクセスできません。しかし、このケースでは、Let’s Encryptが検証用の特別なファイルを保存するために.well-knownフォルダーへのアクセスを公に許可する必要があります。

Nginxサイトの設定フォルダーに移動し(カスタム設定ファイルがある場合はそれを開き)、またはデフォルトを使用します:

cd /etc/nginx/sites-available  
sudo nano default

サーバーブロック内に次の行を追加します:

location ~ /\.well-known {  
    allow all;  
}

設定ファイルを保存(Ctrl + O)し、閉じます(Ctrl + x)。

Nginx設定をテストします:

sudo nginx -t

すべての設定が正常であれば、設定をリロードします:

sudo service nginx reload

SSL証明書の生成

Nginxの設定が完了したら、次はSSL証明書をインストールします。

Let’s Encryptフォルダーに移動します:

cd /opt/letsencrypt

次のコマンドを実行して証明書を生成します:

./letsencrypt-auto certonly -a webroot --webroot-path=/usr/share/nginx/html -d example.com

ここで変更すべき箇所がいくつかあります:

  • webroot-pathをあなたのサイトのドキュメントルートパスに変更します。デフォルトは「/usr/share/nginx/html」ですが、あなたの設定によって異なるかもしれません。
  • 「example.com」を自分のドメイン名に変更します。「example.com」と「www.example.com」は異なるドメインであるため、複数のドメインをサポートするSSL証明書が必要な場合は、コマンドの末尾に-d example1.comを追加します。たとえば、「example.com」、「www.example.com」、「example1.com」、「www.example1.com」のドメインにSSL証明書を設定するには、次のコマンドを使用します:
./letsencrypt-auto certonly -a webroot --webroot-path=/usr/share/nginx/html -d example.com -d www.example.com -d example1.com -d www.example1.com

最初の実行時、スクリプトはシステムに多くのPythonファイルをインストールします。完了すると、証明書生成プロセスが始まります。最初にあなたのメールアドレスを尋ねられます:

nginx-letsencrypt-email-address

次に、Let’s Encryptのウェブサイトで利用規約を読まされます。「同意する」を選択します。

nginx-letsencrypt-read-tos

次のメッセージが表示される場合:

重要な通知:  
 - おめでとうございます!あなたの証明書とチェーンは  
/etc/letsencrypt/live/example.com/fullchain.pem に保存されています。あなたの証明書は  
   2016-10-02に期限切れになります。今後この証明書の新しいまたは変更要素を取得するには、  
   letsencrypt-autoを再度実行するだけです。  
   *すべて*の証明書を非対話的に更新するには、「letsencrypt-auto renew」と実行してください。  
 - Certbotを気に入ってくださった場合は、次の方法で私たちの活動を支援してください:  
  
   ISRG / Let's Encryptへの寄付:   https://letsencrypt.org/donate  
   EFFへの寄付:                    https://eff.org/donate-le

それはあなたがサイトのためにSSL証明書を正常に生成したことを意味します。代わりにエラーメッセージが表示された場合は、そのエラーを修正して再試行してください。

サイト用SSL証明書の有効化

SSL証明書を生成したら、サイト用にそれを有効化する時です。

Nginx設定フォルダーに戻り、サイトの設定ファイルを開きます:

cd /etc/nginx/sites-available  
sudo nano default

新しいサーバーブロックを作成し、そのブロック内に次の設定を追加します:

server {  
        server_name example.com www.example.com;  
  
        listen 443 ssl;  
  
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;  
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;  
}

ファイルを保存して閉じます。

:上記はNginx設定ブロックの簡略版です。ブロックに独自のカスタム設定を追加することをお勧めします。

最後に、設定をテストします:

sudo nginx -t

すべてが正常であれば、Nginxをリロードします:

sudo service nginx reload

これで、サイトのためにSSL証明書を正常に設定できました。URLの「https」版を読み込んで確認できます。

Let’s Encrypt SSL証明書の自動更新

ほとんどの商業用SSL証明書が最小1年間有効であるのに対し、Let’s EncryptのSSL証明書はわずか3ヶ月間有効です。この期間が過ぎると、引き続き使用するためには更新が必要です。Let’s Encryptには、証明書を簡単に更新できるrenewオプションがあります。以下の手順では、SSL証明書を自動更新するためのcronジョブを設定する方法を示します。

サーバー内で、crontabを開きます:

sudo crontab -e

次の行を追加します:

00 0 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log  
05 0 * * 1 /etc/init.d/nginx reload

上記の行は、毎週月曜日の午前12時にSSL証明書の有効期限をチェックし、期限が近い場合は更新します。また、更新された証明書が使用されるように(午前12時05分に)Nginxをリロードします。

crontabを保存して閉じます。

結論

小規模なウェブサイトを運営しており、サイトにSSLを追加することに関心があるなら、Let’s Encryptはサイトの信頼性を追加するための良い選択です。設定は(比較的)簡単で、費用もかからないため(ビールのように無料)、利用しない理由はありません。ただし、組織認証(OV)や拡張認証(EV)SSL証明書が必要な企業にとっては、Let’s Encryptが提供するのはドメイン認証(DV)証明書(最も基本的な種類のSSL証明書)のみであるため、商業用SSL証明書が適しているでしょう。