Debian 11 (bullseye) - Let’s Encrypt で常時 SSL 化(on Nginx)!

Updated:


Debian GNU/Linux 11 (bullseye) に構築した Web サーバ Nginx への接続を、 Let’s Encrypt で取得した SSL サーバ証明書で常時 SSL 化するための方法についての記録です。

(当然ながら、興味がなければスルーしてください)

0. 前提条件

  • Debian GNU/Linux 11 (bullseye; 64bit) での作業を想定。
  • クライアント側も Debian GNU/Linux 11 (bullseye; 64bit) を想定。
  • Web(HTTP)サーバ Nginx が「Debian 11 (bullseye) - Web サーバ Nginx 構築(Nginx 公式リポジトリ使用)!」の方法で導入済みであることを想定。
  • Nginx 1.21.3 での作業を想定。(稼働していること。稼働していない場合は方法が若干異なる)
  • ACME(Automatic Certificate Management Environment) クライアントに Certbot を使用することを想定。
  • バーチャルホストは使用しない。
  • root ユーザでの作業を想定。

1. ACME クライアント Certbot のインストール

# apt -y install certbot

# certbot --version
certbot 1.12.0
  • 当記事執筆時点、 1.12.0 がインストールされた。

2. ポートの開放

ドメイン所有者の認証のために TCP ポートの 80 番と 443 番に接続されるので、開放されてなければ開放しておく。

ufw コマンドによるポート開放については、過去記事「Debian 11 (bullseye) - ファイアウォール設定!」を参照。

3. Certbot クライアントの起動

証明書発行のために Certbot クライアントを起動する。ドキュメントルートにするディレクトリが存在しなければ、作成しておく。

# mkdir -p /var/www/html
# certbot certonly --webroot -w /var/www/html -d example.jp -d www.example.jp
  • example.jp, www.example.jp は自分のものに置き換えること。
  • 起動後の設定は次項。

4. メールアドレス等の設定

メールアドレスの登録と利用条件への同意を行う。(初回のみ)

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): webmaster@example.jp

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Account registered.
Requesting a certificate for example.jp and www.example.jp
Performing the following challenges:
http-01 challenge for example.jp
http-01 challenge for www.example.jp
Using the webroot path /var/www/html for all unmatched domains.
Waiting for verification...
  • ルータでポート開放してからでないと失敗する。

5. SSL/TLS サーバ証明書の取得完了

しばらく待つと、SSL/TLS サーバ証明書の取得プロセスが完了する。

  • サーバ証明書の実体(ファイル)は、 /etc/letsencrypt/archive/ドメイン名 ディレクトリ配下に保存される。
    • サーバ証明書(公開鍵) … certN.pem
    • 中間証明書 … chainN.pem
    • サーバ証明書と中間証明書の結合ファイル … fullchainN.pem
    • 秘密鍵 … privkeyN.pem
  • シンボリックリンクは、 /etc/letsencrypt/live/ドメイン名 ディレクトリ配下に保存される。
    • サーバ証明書(公開鍵) … cert.pem
    • 中間証明書 … chain.pem
    • サーバ証明書と中間証明書の結合ファイル … fullchain.pem
    • 秘密鍵 … privkey.pem
  • SSL/TLS サーバ証明書の取得に失敗した場合は、ポート開放等の設定を再確認する。

6. Nginx 設定ファイルの編集

環境により設定ファイルの配置ディレクトリやファイル名、記述方法等が異なるかもしれない。適宜置き換えること。

File: /etc/nginx/conf.d/default.conf

server {
    listen 80;
    #       :
    # ===< 中略 >===
    #       :
    return 301 https://$host$request_uri;  # <= 追加
    #       :
    # ===< 中略 >===
    #       :
}

File: /etc/nginx/conf.d/ssl.conf

server {
    listen 443 ssl;
    #       :
    # ===< 中略 >===
    #       :
    ssl on;                                                               # <= 追加
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;                            # <= 追加
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;  # <= 追加
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;    # <= 追加
    #       :
    # ===< 中略 >===
    #       :

7. Nginx 設定ファイルの文法チェック

# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

問題があれば、設定ファイルの内容を見直す。

8. Web サーバ の再起動

# systemctl restart nginx

9. 証明書の更新

Certbot にはタイマーが搭載されているので、自動で定期的に証明書が更新される。

Certbot タイマーの詳細を確認するなら、以下を実行。

# systemctl status certbot.timer

# systemctl list-timers certbot.timer --no-pager

# systemctl cat certbot.timer

# systemctl cat certbot.service

タイマーによる更新でなく、手動で更新したい場合は以下を実行。

# certbot renew

10. 参考サイト


以上。





 

Sponsored Link

 

Comments