編集者注:Let’s EncryptをNGINXで使用するための当初の手順を詳しく説明したブログ記事(2016年2月公開)から、このページにリダイレクトされます。その記事に記載された手順は非推奨です。
この投稿は、 certbot‑autoへの依存を解消するために更新されました。Electronic Frontier Federation(EFF)は、DebianおよびUbuntuではCertbot 1.10.0で、その他すべてのオペレーティングシステムではCertbot 1.11.0で同ツールを非推奨としました。詳細および別のインストール方法については、EFFの投稿をご覧ください。
Electronic Frontier FoundationのPeter Eckersley氏とYan Zhu氏が、当時新たに登場した認証局Let’s Encryptを紹介したnginx.conf 2015のブログ記事もご覧ください。
WebサイトをSSL/TLSで暗号化すると、検索順位の向上とユーザーのセキュリティ強化につながることは広く知られています。しかし、Webサイト所有者によるSSLの導入を妨げてきた障壁がいくつかあります。
これまで、特に大きな障壁となっていたのが、証明書の取得にかかる費用と手作業でした。しかし今では、Let’s Encryptにより、こうした問題を心配する必要はありません。Let’s Encryptは、誰もがSSL/TLS暗号化を無料で利用できるようにします。
Let’s Encryptは、無料で自動化されたオープンな認証局(CA)です。そのとおり、SSL/TLS証明書を無料で利用できます。Let’s Encryptが発行する証明書は現在、Windows XP SP3上のInternet Explorerなどの古いブラウザーを含め、ほとんどのブラウザーで信頼されています。さらに、Let’s Encryptでは証明書の発行と更新が完全に自動化されています。
このブログ記事では、Let’s Encryptクライアントを使用して証明書を生成する方法と、その証明書を使用するようにNGINX Open SourceおよびNGINX Plusを自動構成する方法について説明します。
Let’s Encryptの仕組み
証明書を発行する前に、Let’s Encryptはドメインの所有権を検証します。ホスト上で動作するLet’s Encryptクライアントは、必要な情報を含む一時ファイル(トークン)を作成します。次に、Let’s Encrypt検証サーバーがHTTPリクエストを送信してそのファイルを取得し、トークンを検証します。これにより、ドメインのDNSレコードがLet’s Encryptクライアントを実行しているサーバーに名前解決されることを確認します。
前提条件
Let’s Encryptの利用を開始する前に、以下の準備が必要です。
- Have NGINXまたはNGINX Plusをインストールしておく必要があります。
- 証明書に使用する登録済みドメイン名を所有または管理していること。登録済みドメイン名がない場合は、GoDaddyやdnsexitなどのドメイン名レジストラを利用できます。
- ドメイン名とサーバーのパブリックIPアドレスを関連付けるDNSレコードを作成します。
これで、NGINX Open SourceまたはNGINX PlusでLet’s Encryptを簡単に設定できます(読みやすくするため、以降は単に「NGINX」と表記します)。
注記:このブログ記事で説明する手順は、Ubuntu 16.04(Xenial)でテスト済みです。
1. Let’s Encryptクライアントをダウンロード
まず、Let’s Encryptクライアントの「certbot」をダウンロードします。
前述のとおり、この手順はUbuntu 16.04でテスト済みです。このプラットフォームでは、次のコマンドを使用します。
$ apt-get update$ sudo apt-get install certbot
$ apt-get install python-certbot-nginxUbuntu 18.04以降では、Python 3バージョンに置き換えてください:
$ apt-get update$ sudo apt-get install certbot
$ apt-get install python3-certbot-nginx2. NGINXのセットアップ
certbotは、SSL/TLS用にNGINXを自動設定できます。NGINX設定内で、証明書を申請するドメイン名がserver_nameディレクティブに指定されているserverブロックを検索し、変更します。この例のドメインはwww.example.comです。
- NGINXを新規インストールした状態から始める場合は、テキストエディターを使用して/etc/nginx/conf.dディレクトリに「domain‑name.conf」という名前のファイルを作成します(この例では「www.example.com.conf」です)。
- ドメイン名(バリエーションがある場合はそれらも含む)を
server_nameディレクティブで指定します:
server { listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
server_name example.com www.example.com;
}- ファイルを保存してから、次のコマンドを実行して設定の構文を確認し、NGINXを再起動します。
$ nginx -t && nginx -s reload3. SSL/TLS証明書の取得
The NGINX plug‑in for certbot用のNGINXプラグインは、必要に応じてNGINXの再構成と設定の再読み込みを行います。
- NGINXプラグインを使用して証明書を生成するには、次のコマンドを実行します。
$ sudo certbot --nginx -d example.com -d www.example.com- Respond to prompts from
certbotのプロンプトに従って、メールアドレスを入力し、Let’s Encryptの利用規約に同意して、HTTPS設定を構成します。
証明書の生成が完了すると、NGINXは新しい設定で再読み込みされます。certbotは、証明書の生成が成功したことと、サーバー上の証明書の保存場所を示すメッセージを生成します。
Congratulations! You have successfully enabled https://example.com and https://www.example.com
-------------------------------------------------------------------------------------
IMPORTANT NOTES:
Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com//privkey.pem
Your cert will expire on 2017-12-12.注記:Let’s Encrypt証明書は90日後に有効期限が切れます(この例では2017-12-12)。証明書の自動更新については、以下の「Let’s Encrypt証明書の自動更新」を参照してください。
If you look at domain‑name.confを確認すると、certbotによって変更されていることがわかります:
server { listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
server_name example.com www.example.com;
listen 443 ssl; # managed by Certbot
# RSA certificate
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
# Redirect non-https traffic to https
if ($scheme != "https") {
return 301 https://$host$request_uri;
} # managed by Certbot
}4. Let’s Encrypt証明書を自動更新する
Let’s Encrypt証明書は90日後に有効期限が切れます。証明書の自動更新を推奨します。ここでは、そのために既存のcronジョブをcrontabファイルに追加します。
- Open the crontabファイルを開きます。
$ crontab -e- 毎日実行するように、
certbotコマンドを追加します。この例では、毎日正午にコマンドを実行します。このコマンドは、サーバー上の証明書が今後30日以内に期限切れになるかどうかを確認し、該当する場合は更新します。--quietディレクティブを指定すると、certbotは出力を生成しません。
0 12 * * * /usr/bin/certbot renew --quiet- ファイルを保存して閉じます。インストール済みのすべての証明書が自動的に更新され、再読み込みされます。
まとめ
登録済みのドメイン名に対するSSL/TLS証明書を生成するため、Let’s Encryptエージェントをインストールしました。また、NGINXで証明書を使用するように構成し、証明書の自動更新を設定しました。NGINXおよびNGINX PlusでLet’s Encrypt証明書を使用すれば、シンプルでセキュアなWebサイトを数分で稼働させることができます。
NGINX PlusでLet’s Encryptを実際にお試しいただくには、今すぐ30日間の無料トライアルを開始するか、ユースケースについてご相談いただくため、F5までお問い合わせください。
関連ドキュメント
アップストリームサーバーへのHTTPトラフィックの保護
アップストリームサーバーへのTCPトラフィックの保護
NGINX SSL終端
著者について

関連するブログ記事
チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。
AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。
JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。
F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。
NGINX PlusによるAWS Auto Scalingグループの負荷分散
新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります