Linode で簡単にWebサーバーをHTTPS化する方法 （TLS / SSL証明書(サーバー証明書)の発行と自動更新）

## はじめに
Linode を使用して証明書付の Web サイトを公開できます。
昨今Webサイトの公開はセキュリティ面を考慮しHTTPS化が推奨されています。
WebサイトをHTTPS化する上で必須のTLS/SSL証明書（サーバー証明書）ですが、発行や更新の作業は割と手間だったり、久しぶりの作業だと手順を忘れがちで時間を要することが多いと思います。

そこで、この記事では Linode でTLS/SSL証明書の発行と自動更新設定を行い、WebサイトをHTTPS化する方法を紹介します。


## 何をすれば良いか？
* Snapdのインストール
* Certbotのインストール
* TLS/SSL証明書の発行とApache Webサーバーへの証明書適用
* HTTPSでWebサイトの接続確認とTLS/SSL証明書の構成確認
* TLS/SSL証明書の自動更新設定


## 事前に準備した環境
* CentOS8またはRHEL8等のディストリビューションのLinuxサーバー
* 上記LinuxサーバーにインストールされたApache Webサーバー環境
* Linode FirewallまたはLinuxサーバーのfirewalldでIn-boundにHTTP/HTTPSとSSHのみ許可した環境 
* 公開するWebサイトのドメインとFQDN（www.example.com等）
* 上記FQDNがnslookupやdigコマンドでパブリックDNSサーバー等からIPアドレスを確認できる環境


## LinuxサーバーへSnapdをインストールする
Certbotをインストールするため、まずは以下の手順でPackage Managerの「Snap」をインストールします。

**1\. Linodeの対象LinuxサーバーのConsoleへSSHやLish等でログインする**

**2\. EPELリポジトリを追加する**
　```
sudo dnf install epel-release
sudo dnf upgrade
　```

**3\. snapdをインストールする**
　```
sudo dnf install snapd
　```

**4\. main snap communication socketを有効にする**
　```
sudo systemctl enable --now snapd.socket
　```

**5\. シンボリック リンクを作成する**
　```
sudo ln -s /var/lib/snapd/snap /snap
　```

**6\. snapコマンドを使用するため、1度ログアウトした後に再度ログインする**


## LinuxサーバーへCertbotをインストールする
snap コマンドを使用して Certbot をインストールします。
Certbotは、証明書認証局のLet's Encrypt と通信して無償の証明書を要求し、必要な ACMEチャレンジを実行し、証明書をインストールし、Webサーバーへ適用します。

:::note info
ACME:https://jprs.jp/pubcert/about/ACME/
:::

**1\. 既存のCertbotを削除して、Snapでインストールするcertbotとの競合を回避する**
　```
sudo dnf remove certbot
　```

**2\. Snapを使用してCertbotをインストールする**
　```
sudo snap install –classic certbot
　```

**3\. Certbot ディレクトリへのシンボリックリンクを作成する**
　```
sudo ln -s /snap/bin/certbot /usr/bin/certbot
　```

## TLS/SSL証明書を発行し、Apacheへ適用する方法
証明書発行手続きの過程で、Certbotは証明書を適切に要求できるようにドメインに関する質問を対話形式で行います。利用規約に同意し、有効な管理用電子メールアドレスを提供する必要があります。

:::note warn
サーバーの構成によっては、Certbotが表示するメッセージがここに示すものと多少異なる場合がありますので、予めご了承ください。
:::

**1\.　Certbot を実行して、TLS/SSL証明書の発行手続きを開始する**
Certbotがエラー無く完了すると、秘密鍵ファイルと一緒に証明書ファイルがインストールされます。Apacheプラグイン (--apache) と一緒に実行すると、CertbotはApache用の設定ファイルも自動的に編集するため、WebサーバーのHTTPS設定を劇的に簡素化することができます。

　```
sudo certbot --apache
　```

上記コマンドを実行後、メールアドレスの入力や利用規約への同意を対話形式で行っていくことになります。

**2\.　メールアドレスを入力する**
緊急連絡先としてのメールアドレスを登録します。
WebサイトまたはWebサーバー管理者のメールアドレスが適切です。

**3\.　利用規約に同意する**
Let's Encrypt の利用規約に同意を求めてくるため、コマンドラインに出力されるリンクから利用規約のPDFファイルをダウンロードし、ドキュメントを確認します。
利用規約に同意する場合は「Y」を入力してください。
同意できない場合は「N」を入力することで、本手続きを終了できます。

**4\. 任意でEFFのメーリングリストに登録（EFF: Electronic Frontier Foundation (Certbotの開発元)）**
EFFメーリングリストに登録するか確認されるため、登録する場合は「Y」、登録しない場合は「N」を入力してください。
「N」を入力しても本手続きは継続し、TLS/SSL証明書を利用することは可能です。

**5\. TLS/SSL証明書のコモンネームに指定するFQDNを入力する**
既にApacheに仮想ホストファイルなどがありFQDNが設定されている場合、CertbotはそれらのFQDNをコマンドラインに出力します。
出力された場合は番号を入力してください。
FQDNが出力されない場合は、手動で対象のFQDNを入力してください。
いずれの場合も、複数FQDNを指定する時は、「スペース」で区切って入力してください。

:::note info
FQDNを入力して、「Enter」を押すと証明書の発行手続きが始まります。
この時、対象FQDNへHTTPで通信を行いドメイン認証用ファイルのチェックが行われますので、インターネットからWebサーバーへHTTPでアクセスできる状況か確認してから実行してください。
:::

**6\. 認証局Let's Encrypt へTLS/SSL証明書の発行要求、およびApacheへ適用処理を開始**
Certbot は Let's Encrypt と通信して証明書を要求し、ACME で定義されている必要なチャレンジを実行します。ほとんどの場合、HTTP チャレンジによってドメインの所有権が証明(ドメイン認証)され、Apacheに証明書ファイルが自動的に追加されます。

もし、発行要求や適用処理が失敗した場合、コマンドラインにエラーが出力されるので、エラー内容をしっかりと確認し、エラー原因を解消後にもう一度「1.」のコマンドを再実行してください。
再実行時は「5.」から再開されます。

**7\. TLS/SSL証明書の発行とApacheへの適用が完了**
「6.」が成功すると、Certbotは証明書が有効であることを確認し、その詳細を出力します。また、証明書とキーチェーンが保存されているディレクトリに関するいくつかの情報と、有効期限も表示されます。証明書の有効期限は通常90日です。

これは手順「5.」〜「7.」の実行結果です。
![Blog_cert-success.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949489/7bbc5f72-a665-c0c0-269f-6bcd96763b79.jpeg)


## HTTPSでの接続確認とTLS/SSL証明書の構成確認する方法
CertbotによってTLS/SSL証明書の発行と適用が完了した後、Webブラウザで対象FQDNへHTTPSでアクセスし接続確認を行います。
Webブラウザでの接続確認に成功した後、TLS/SSL証明書の構成確認はQualys社の「[SSL Server Test](https://www.ssllabs.com/ssltest/ "SSL Server Test")」というWebサイトで確認します。

**1\. Webブラウザでの接続確認**
HTTPSでWebサイトが表示された後、証明書情報を確認し発行元の組織に「Let's Encrypt」と表示されているか確認します。
![Blog_Browser_SSLcheck.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949489/e57acfc4-f22f-0243-0a17-ca60e817fcf9.jpeg)


**2\. 「[SSL Server Test](https://www.ssllabs.com/ssltest/ "SSL Server Test")」でのTLS/SSL証明書の構成確認**
対象FQDNに関するHTTPS通信のセキュリティ強度の判定や証明書の詳細情報、有効化中のTLS/SSLバージョンや暗号スイート等の情報が確認できます。

入力フォームに確認したいFQDNを記入し、下部のチェックボックスをONにした後、Submitボタンを押すことでチェックが始まります。

:::note warn
チェックボックスをONにすると、このサイト上で確認結果の公開を回避できます。
:::

![Blog_SSLLab_start.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949489/b2b4f162-a03f-2306-3b2f-7cb8ff371602.jpeg)

チェックが完了すると、このような結果が表示され、セキュリティ強度がまず表示されます。
したにスクロールしていくと証明書の構成や許可しているTLSバージョンや暗号スイートなど詳細な構成情報が確認できます。
![Blog_SSLLab_result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949489/f4bfdc2e-22ab-462b-7997-e25654a1f86a.jpeg)


## TLS/SSL証明書の自動更新設定
Certbot はインストール時に、すべての証明書を自動的に更新するように設定しています。
サイト構成が変更されない限り、手動で証明書の更新を要求したり、Certbot を再度実行したりする必要はありません。

:::note info
Certbotは、近々期限切れになる予定がない限り証明書を更新しません。
:::

ここではCertbotの自動更新の仕組みをテストするコマンドを用いて、自動更新設定に問題がないか確認します。

**1\. Certbotが自動的に証明書を更新するように設定されていることを確認する**
　```
sudo certbot renew –dry-run
　```


**2\. 以下のように自動更新のテスト結果が表示されれば問題ありません。**
![Blog_cert-renew-check.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949489/f1d74071-4fbb-dfcb-725d-18d0061c0583.jpeg)

## 最後に
TLS/SSL証明書発行と適用作業が簡略化できとてもスピーディーにHTTPS化できたのでオススメです。
3ヶ月後、問題なく自動更新も成功すればTLS/SSL証明書の運用が自動化できるので期待しています。
自動更新の結果はまた後日この記事でアップデートする予定です。


# Linodeとは

Linode (https://www.linode.com/) は Akamaiが提供するIaaS (Infrastructure as a Service) プラットフォームプロバイダーのサービスです。リノードと発音します。
Akamaiは2022年2月にLinode社の買収を発表しました。
https://www.akamai.com/ja/newsroom/press-release/akamai-to-acquire-linode
クラウドコンピューティングをよりシンプルに、手頃な価格で、誰もが利用できるようにすることで、イノベーションを加速することができます。

## 関連記事

アカマイ・テクノロジーズ合同会社のQiitaではLinode関連など開発者向けの記事を記載しております。

https://qiita.com/organizations/Akamai