CertbotのでSSL/TLS証明書を発行する

今回はCertbotというツールを使って証明書を取得し、HTTPS通信によってサイトを公開しました。
記事の内容について間違った記述などありましたら遠慮せず教えていただけると幸いです。

# 環境
OS: Ubuntu 20.04.2
サーバー: Apache
前提: ドメインを設定してhttpでの公開までできている段階を想定しています。

※ドメイン設定についてのわかりやすい記事です。
[ApacheのVirtualHostってなんだ(Qiita記事)](https://qiita.com/monaky/items/b5f589e59ee002a1d355)

# Certbotとは
Webサイトを`https://`で始まる安全な通信で公開するためのサービスのひとつです。
（ざっくり）

Let'sEncryptという証明書発行サービスが提供しているツールで、ドメインが設定されたサーバー上でこのCertbot(サートボット)を実行すると、ドメインとサーバーの管理者が一致しているか検証します。無事検証できれば自動的に証明書が発行され、安全が担保されるというわけですね。

# インストールする
まずはサーバー上で`apt-get`コマンドでもってCertbotをインストールします。

~~~vim
$ sudo apt-get install certbot
~~~
初手から不穏ですね。。
インストールの時は文字がダーーーと流れそうですが、４行しか表示されませんでした。

~~~vim
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package certbot <-- 特にこの１行がなんか怪しい
~~~

何やらCertbotのパッケージが見つからないそうです。

# パッケージをインストールする
レポジトリを追加するようにしてあげるといいとグーグル先生が申しておりましたので、`add-apt-repository`を実行します。
ちなみに`ppa`とは「パーソナルパッケージアーカイブ」というUbuntu非公式のレポジトリのことだそうです。

~~~vim
$ sudo add-apt-repository ppa:certbot/certbot
~~~

すると以下のようなメッセージが

~~~vim
sudo: add-apt-repository: command not found
~~~
明らかに上手くいってません。
`add-apt-repository`ってなんだよと怒られました。
僕だって知りませんよ、と逆ギレしそうです。

# 続：パッケージをインストールする
`apt-get install`でパッケージ名を指定してもインストールできない原因は、デフォルトでリポジトリに登録されていないからだそうです。
ですので、まずは諸々のパッケージが入った`software-properties-common`をインストールしましょう。

~~~vim
$ sudo apt-get install software-properties-common
~~~

文字がダーーーっと流れると少し安心します。
さて、再度`add-apt-repository`を試してみます。

~~~vim
$ sudo add-apt-repository ppa:certbot/certbot
~~~

今度はいけました。（この時の安堵感ってなんとも言えないですね）
一応`apt-get`を更新してから、`certbot`をインストールします。

~~~vim
$ sudo apt-get update
$ sudo apt-get install certbot
~~~
確認します。

~~~vim
$ certbot --version
certbot 0.40.0
~~~

気持ちいいです。

# Apache用プラグインをインストールする
続いてApache用のプラグインをaptからインストールします。

~~~vim
$ sudo apt-get install python3-certbot-apache
~~~

# TLS証明書を発行する
インストールできたら、次のコマンドで証明書を発行できます。
~~は記述しなくて大丈夫です。

~~~vim
$ certbot --apache --domains ~~ここにドメインを記述~~ --email ~~ServerAdminに設定したアドレス~~
~~~

すると、対話式で利用規約やら登録用のメールアドレスやらを聞かれます。
細かい記述やパスは作業環境によって異なってくると思います。
なお、実際のドメイン名は伏せ字にしています。

~~~vim
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Cert not yet due for renewal

You have an existing certificate that has exactly the same domains or certificate name you requested and isn't close to expiry.
(ref: /etc/letsencrypt/renewal/~~ここにドメイン~~.conf) <--確認で2回目だからrenewalついてる

What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Attempt to reinstall this existing certificate
2: Renew & replace the cert (limit ~5 per 7 days)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):　
今回はrenewにしときたいので２でEnterキー押下


Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 
HTTP通信をHTTPSにリダイレクトするかしないか
よく分からないので１でEnterキー押下


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Your existing certificate has been successfully renewed, and the new certificate
has been installed.

The new certificate covers the following domains:
https://www.~~~~

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=www.~~~~
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/www.~~~~/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/www.~~~~/privkey.pem
   Your cert will expire on 2021-08-31. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - 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

 ~~~

無事に証明書をインストールできました。
試しに`https://~~登録したドメイン~~`でアクセスしてみましょう。

また、証明書には有効期限（９０日間）があります。古くなった証明書を手作業で更新するのは面倒なので、更新作業を自動化することもできます。

自動化手続きについては以下のサイトでわかりやすくまとめられていますので、参考にしてみてください。
[Certbotを使い3分で無料のSSL証明書を取得する<外部リンク>](https://dev.classmethod.jp/articles/how-to-use-certbot-with-nginx/)


# おわりに
SSL/TLSには「暗号化」「改ざん検出」「認証」という３つの機能があるそうです。
今やHTTP通信だと警告が出るようになっていたりするので、基本はHTTPS通信で公開しておきたいですよね。
ということは、一連の手続きは今後もお目にかかることが多そうです。