Skip to main content

専用サーバー:LinuxサーバーでSSL証明書(Let's Encrypt)を作成する方法

このガイドは、以下の製品を使用して作成されました:

(詳細はプロバイダーごとの製品によって異なる場合がありますが、基本的な概念は同じです)

はじめに

SSL証明書はインターネットの重要な要素で、クライアントとホスト間のデータを安全に送受信できるようにします。このガイドでは、オープンソースのCertbotツールを使って、非営利の証明書機関Let's Encryptから無料のSSL証明書を取得する手順を紹介します。

準備

Certbotを使うには、Linuxサーバーとあなたが所有するドメインが必要です。ドメインのDNS設定にアクセスでき、使用予定のルートドメインやサブドメインごとに__Linuxサーバー__のIPアドレスを指すAレコードを必ず作成してください。

Certbotには、NginxやApacheなどのさまざまなウェブサーバーに対応した「ワンクリック」証明書設定ができるプラグインもあります。パフォーマンスが高く人気のあるオープンソースのウェブサーバーであるNginxの利用をおすすめします。設定方法はLinuxリバースプロキシガイドを参照してください。

インストール

まずは、無料SSL証明書を取得するために使うオープンソースのCertbotパッケージをインストールしましょう。

sudo apt install certbot

Certbotがインストールできたら、ドメインの証明書をリクエストできます。Let's EncryptとCertbotは、ドメイン所有権を確認するためにさまざまなACMEチャレンジを提供しています。

自動更新が可能なため、デフォルトのHTTP-01方式の利用を強く推奨します。ただし問題がある場合は、手動でTXT DNSレコードを使うDNS-01方式を代替として試すこともできますが、自動更新には対応していません。

ウェブサーバープラグインの活用

NginxやApacheなどのウェブサーバーを使っている方は、以下のWeb Server Pluginsセクションを参照してください。Certbotのプラグインを使うことで、ウェブサーバーを停止せずにワンクリックで証明書を取得・設定できます。

HTTP-01チャレンジ

Certbotがインストールできたら、ドメインの証明書をリクエストしましょう。ここではスタンドアロンモードを使います。これはCertbotが一時的にウェブサーバーを起動して処理を行うため、ファイアウォールでポート80を開放し、ポート80で他のウェブサーバーやサービスが動作していない必要があります(チャレンジ名にHTTPが入っている理由です)。

以下のコマンドで--standaloneパラメータを使い、一時的ウェブサーバーを利用することをCertbotに伝えます。

# ルートドメインの場合
certbot certonly --standalone -d [your_root_domain] -d www.[your_root_domain]

# サブドメインの場合
certbot certonly --standalone -d [your_domain]

# 対話式セットアップ
certbot certonly --standalone

コマンド実行後、初回はメールアドレスの入力やオプションのメーリングリスト登録、利用規約の同意などの対話式セットアップが求められます。

CertbotはACMEチャレンジを生成し、一時的ウェブサーバーでホストします。Let's Encryptのサーバーがこれを取得できれば、証明書が作成され/etc/letsencrypt/live/[your_domain]に保存されます。

あとは証明書のローカルパスを指定して、必要な場所でSSL証明書を利用できます。

TXT DNSレコード

HTTP-01方式で検証がうまくいかない場合は、代わりにDNS-01方式を試せます。これはLet's Encryptから指定される値を持つTXT DNSレコードを作成する方法です。

ただし、この方式は自動更新に対応していないため、自分で管理インフラを用意しない限りは推奨しません。可能な限りHTTP-01方式を使いましょう。

以下のコマンドで--preferred-challengesパラメータを使い、DNS-01方式を指定します。

# ルートドメインの場合
certbot certonly --preferred-challenges dns-01 -d [your_root_domain] -d www.[your_root_domain] --manual -m [your_root_domain] -m www.[your_root_domain]

# サブドメインの場合
certbot certonly --preferred-challenges dns-01 -d [your_domain] --manual -m [your_domain]

# 対話式セットアップ
certbot certonly --preferred-challenges dns-01

コマンド実行後、初回はメールアドレスの入力やオプションのメーリングリスト登録、利用規約の同意などの対話式セットアップが求められます。

CertbotはTXTレコードの作成方法を案内します。通常、ターゲットは_acme-challenge.をドメインの前に付けた名前(例:_acme-challenge.zapdocs.example.com)で、値はコンソールに表示されます。

レコードを作成したらEnterを押して続行します。正しく反映されていれば証明書が作成され、/etc/letsencrypt/live/[your_domain]に保存されます。

注記

DNSレコードの反映には時間がかかることがあります。通常は数分以内ですが、まれにもっと長くかかる場合もありますので気長にお待ちください。

あとは証明書のローカルパスを指定して、必要な場所でSSL証明書を利用できます。

ウェブサーバープラグイン

Certbotには複数のウェブサーバープラグインがあり、証明書管理がさらに簡単になります。プラグインを使うと、Certbotが自動で該当するサーバーブロックを編集してくれます。プラグインを使うには、certbotコマンドに対応するパラメータを追加するだけです。

どのプラグインもHTTP-01チャレンジを使い、基本的な動作は同じです。プラグインが指定されたドメインを含むserver_nameパラメータのサーバーブロックを探し、ACMEチャレンジ用の一時的なlocation /.well-known/acme-challenge/...ブロックを追加します。

Let's Encryptサーバーがチャレンジを取得できれば証明書が生成され、ウェブサーバーの設定が自動でHTTPS(ポート443)対応に書き換えられ、証明書のパスも追加されます。

Nginxプラグイン

プラグインを使う前に、インストールされているか確認しましょう。

sudo apt install python3-certbot-nginx

Nginxプラグインを使うには、コマンドに--nginxパラメータを追加します。

# ルートドメインの場合
certbot --nginx -d [your_root_domain] -d www.[your_root_domain]

# サブドメインの場合
certbot --nginx -d [your_domain]

# 対話式セットアップ
certbot --nginx
Hint

Certbotによる自動のサーバーブロック編集を無効にしたい場合は、certonlyパラメータを追加してcertbot certonlyのように実行してください。

自動更新

ほとんどの場合、Certbotはcronジョブやsystemdタイマーを使って自動的に証明書の更新を設定します。以下のコマンドで--dry-runパラメータを使い、更新処理のテストができます。

certbot renew --dry-run
Hint

前述の通り、DNS-01方式はCertbotによる自動更新に対応していません。自動更新を使いたい場合はHTTP-01方式を推奨します。

問題なければ成功します。自動更新の設定を確認・変更したい場合は、/etc/crontab//etc/cron.*/*、またはsystemctl list-timersで確認できます。

手動でのcronジョブ設定

もし自動更新が設定されていなければ、自分でcronジョブを追加できます。crontab -eでcrontab編集画面を開きます。初めての場合はエディタ選択を求められるので、最初の/bin/nanoを選びましょう。

nanoでファイルが開いたら、以下の行を追加して毎日午前6時に更新を実行するようにします。

0 6 * * * certbot renew

保存してnanoを終了するには、CTRL + XYENTERの順に押します。

まとめ

これでスタンドアロン、ウェブルート、プラグインなどさまざまな方法でCertbotを設定し、あなたのドメインにHTTPSによる安全な通信を提供できました。質問やサポートが必要な場合は、毎日対応しているサポートチームまでお気軽にお問い合わせください!🙂