サイトをHTTPS通信したい

個人利用で利用しているCentOS Stream8のwebサーバ(Nginx)をHTTPS出来るようにしたく、その場合SSL証明書を適用する必要があります。

証明書発行は認証局に依頼を出してドメインの所有者である証明(DV)や、または企業の証明(OV)をしてから発行に至るのですが、この場合に証明書の信頼度だと厳格に審査を行う 企業認証(OV)やさらに厳格なEV認証があります。
ちゃんとした企業ですとそういった証明書が必要になると思いますが、実在する企業か審査も必要ですし、発行価格も数万円になります。

参考: SSLの種類と利用用途|GMOグローバルサイン【公式】

個人サイトならLet’s Encrypt SSL証明書で十分では

しかし個人利用だと、ドメイン所有者と証明され、HTTPS通信が出来れば十分かと思います。

昔からあるHTTP通信では、ブラウザのアドレスバーに警告が出ますし、近年主要ブラウザで「HTTPS-Onlyモード」も出てきて将来的に無くなるかもしれません。

※Firefox 92でのHTTPとHTTPSの表示の違い

話が長くなりましたが、自分のサイトではドメイン認証(DV)で無料のLet’s Encryptを使用したいと思います。

一応、ドメイン認証(DV)でも低価格の証明書もありますので参考にしてみてください。
商品・価格一覧 | さくらのSSL

Let’s Encrypt証明書の発行と適用

Let’s Encryptの公式サイトを拝見しますと、サーバ管理者の場合「Certbot」を使用しての適用を推奨しています。 自分も実際Certbotを試してみましたが、証明書発行とNginx適用まで自動で行ってくれて、とても簡単でびっくりしました。

余談ですが、
私は仕事で企業向けの証明書をサイバートラストやセコム等の認証局から証明書の発行手続きからサーバ適用した経験がありますが、かなり神経を使う作業で面倒でした。Certbotでの適用は心配になるぐらい簡単で驚きました。

Certbotを使用出来るように事前準備をする

Certbot使用しての適用は下記の公式サイトを参考にして進めていきます。

まえもって、EPELリポジトリが使えるようにしてください。

また証明書の発行は、適用したいサーバ上で行います。別のサーバからでは発行が出来ないので気を付けてください。

Certbotは、snapd(snappy)というパッケージ管理ツールからインストールします。
snappyはUbuntuやCentOSなど、ディストリビューションに依存しないLinuxのパッケージ管理ツールです。
snappyを使用すると、aptやyumとは別でパッケージ管理が出来るようになります。
ここ数年でLinuxディストリ界隈では、色々とツールが出てきていて焦ります(;´Д`)

最新のCertbotをイントールする場合は、このsnapdからイントールを行います。

  1. snapdインストール
  2. Certbotインストール
  3. 証明書発行、Nginx適用

の順で進めていきます。

【参考】CertbotインストールとNgninxに適用: Certbot - Centosrhel8 Nginx

EPELからsnapdのインストール

【参考】snapのインストール: Installing snap on CentOS | Snapcraft documentation

[root@host ~] dnf install snapd
または
※EPELを一時的に有効化する場合は「--enablerepo=epel」を追加
[root@host ~] dnf --enablerepo=epel install snapd

systemctlで、「snapd.socket」を有効化 --nowで即時の有効

systemctl enable --now snapd.socket

古いsnapとの互換性を保つために、シンボリックリンクを設定する

[root@host ~] ln -s /var/lib/snapd/snap /snap

インストール出来たか確認

[root@host ~] snap --version
snap    2.51.7-1.el8
snapd   2.51.7-1.el8
series  16
centos  8
kernel  4.18.0-294.el8.x86_64
↑自分の環境ですとこんな出力です。

Certbotのインストール

次にsnapからCertbotをインストールしていきます。

最新のsnap coreのインストールとリフレッシュ

[root@host ~] snap install core
[root@host ~] snap refresh core

Certbotのインストール

[root@host ~] snap install --classic certbot

コマンドのパスを通す

[root@host ~] ln -s /snap/bin/certbot /usr/bin/certbot

念の為コマンドが動作するか確認、バージョンが表示されればOK

[root@host ~] certbot --version
certbot 1.19.0

CertbotからLet’s Encryptの発行と適用

証明書適用のため、CertbotからNginxのconfigファイルが変更されますので念の為バックアップは取っておきましょう。

[root@host ~] cp -p /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org

問題なく証明書が発行出来るかの事前確認

まず最初に、証明書を適用したいサーバで発行が出来るか事前確認を行います。 下記のように条件を満たしていれば、問題なく発行出来ると思います。

申請したいドメイン名の正引き結果と、適用したいサーバのグローバルIPが一致しているか確認します。
nslookupやdigコマンドを使用

[root@host ~] dig example.com ※申請したいドメイン名
;; ANSWER SECTION:
example.com.		xxx.xxx.xxx.xxx

[root@host ~] curl ifconfig.me
xxx.xxx.xxx.xxx ※ログインしているサーバとdigコマンドの結果が同じGIPか

[root@host ~] curl -I http://example.com ※申請したいドメイン名のサイトでHTTP接続が出来るか
HTTP/1.1 200 OK
Server: nginx/1.14.1
Date: Tue, 28 Sep 2021 08:56:15 GMT
Content-Type: text/html
Content-Length: 4057
Last-Modified: Mon, 07 Oct 2019 21:16:24 GMT
Connection: keep-alive
ETag: "5d9bab28-fd9"
Accept-Ranges: bytes

certbotコマンドで発行とNginxへ適用

「certbot --nginx」で発行と適用をしますが、Nginxの設定ファイルまで自動で更新されます。
設定ファイルが更新されると困る場合は、「certbot certonly --nginx」を使います。

ここでは、Nginxの設定ファイルまで自動設定までしていきます。

[root@host ~] certbot --nginx
↑では、証明書の発行からNginxのconfファイルの設定まで自動で行います。今回はこちらを使用

[root@host ~] certbot certonly --nginx
↑では、証明書の発行とダウンロードだけで、confファイルの設定は自分で行います。

コマンドを実行すると、対話型の設定が実行されますので必要に応じでメールアドレスの入力とYesかNoか答えていきます。

[root@host ~] certbot --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): hoge@hoge ※証明書の有効期限の通知用メールアドレス

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

pdfの利用規約を読んで、同意するかの質問です。全部英語で書かれていますがYesを選択

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  
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Certbot開発に参加するかEFFニュースやキャンペーン情報を受け取りますか? Noを選択


  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: n
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

申請したい、ドメイン名の記入

Please enter the domain name(s) you would like on your certificate (comma and/or
space separated) (Enter 'c' to cancel): example.com 申請したいドメイン名

うまく発行処理が終われば、下記のように発行された証明書の場所と、更新されたNginx設定ファイル
また、証明書の有効期限が切れる前のタイミングで自動更新を行うタスクの設定完了のメッセージが出力されます。

Requesting a certificate for  example.com
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/example.com/privkey.pem
This certificate expires on 2021-12-23.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for example.com to /etc/nginx/nginx.conf
Congratulations! You have successfully enabled HTTPS on https://example.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Certbotでの自動更新の確認

「certbot --nginx」 コマンドで証明書の適用した場合、「バックグラウドで自動更新するようにタスクをスケジューリングした」とメッセージが出ています。

この自動更新の機能が動作するかは、以下のコマンドで確認出来ます。

[root@host ~]  certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/exsample.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for exsample.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/exsample.com/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

あとは、実際にブラウザでサイトにアクセスしてHTTPSが出来て証明書が発行されているか確認してください。

お疲れ様でした。(*´∀`*)