今どきは、「Webでもメールでも、TLSが絶対に必要」なご時世です。設定しているサーバがインターネットからドメイン名・ホスト名でアクセス可なら、いわゆる「オレオレ認証」ではなく、無料で利用できる「Let's Encrypt」で正式な証明書を入手しましょう。

下準備

必要なパッケージをインストールします。FreeBSDではpkgコマンドで一発です(Linuxでもパッケージ管理で一発ですが)。

pkg install -y py311-certbot

パッケージをインストールすると表示されるのですが、取得した証明書を自動的に更新する機能を有効化することができます。この機能を有効化するには「/etc/periodic.conf」に下記の内容を追記(ファイルが無ければ新規作成)します。

weekly_certbot_enable="YES"

証明書の要求(Webサーバが動いているとき)

WebサーバがApacheで、アクセスされた時に見えるサーバのディレクトリが「/usr/local/www/apache24/data」とすると、次の通りコマンドを実行します。例として「www.domain.example」の証明書を要求してみます。ネームバーチャルホストやnginxのときには、ディレクトリを適宜変えてください。

certbot certonly --webroot -w /usr/local/www/apache24/data -d www.example.com

色々と質問されますが、メールアドレスを聞かれたら自分のメールアドレス、Yes/Noで尋ねられたら「Yes」で大丈夫です。証明書ファイルは「/usr/local/etc/letsencrypt/live/ホスト名/」配下(実際には、/usr/loca/etc/letsencrypt/archive/配下のファイルへのシンボリックリンク)に、次の名前で設置されます。

  • cert.pem (証明書)
  • chain.pem (中間証明書)
  • fullchain.pem (証明書と中間証明書が一つのファイルにまとまったもの)
  • privkey.pem (秘密鍵)

殆どの場合、「fullchain.pem」と「privkey.pem」を使えばいいと思います。

TLS証明書には、一つの証明書で複数のホスト名を証明することができます。この機能を使うためには、証明書を取得する際に

certbot certonly --webroot -w /usr/local/www/apache24/data -d example.com -d www.example.com -d mail.example.com

と、「-d 必要なホスト名」を連ねてコマンドを実行します。この場合、最初に指定したホスト名(この例では「example.com」)が証明書の格納ディレクトリになるようです。

ここで注意なのですが、ApacheのネームバーチャルホストでServerName毎に異なるドキュメントルートを設定する場合、一気にはLet's Encryptに証明書を要求ができないことです。(Lets's Encryoptが証明書発行の際に、http接続で特別なファイルを確認しますが、ドキュメントルートが異なると--webroot引数で指定したディレクトリにアクセスができないからです)この場合は、ネームバーチャルホストのServerName毎に、各々のドキュメントルートを引数で指定したうえでコマンドを実行する必要があります。

もう一つ、あまり必要がないかもしれませんが、certbotコマンドで発行される証明書のデフォルトの暗号方式は「ECDSA」です。ところが、サーバソフトによっては(例えばProFTPD等)従来の「RSA」方式を要求します。この場合は、引数に「--key-type rsa」を指定して

certbot certonly --key-type rsa --webroot -w /usr/local/www/apache24/data -d ftp.example.com

とコマンドを実行して証明書を取得します。

証明書の要求(Webサーバが動いていないとき)

Webサーバ動いていないとき、Let's EncryptのためだけにWebサーバを動かす必要はありませんし、不要なサービスは動かさないほうがセキュリティ上好ましいです。Webサーバが動いていないときは、次のコマンドを実行します。例では「mail.example.com」のホスト名用の証明書を要求しまます。

certbot certonly --standalone -d mail.example.com

Webサーバが動いているときと同様、複数のホスト名用の証明書を要求できます。

certbot certonly --standalone -d mail.example.com -d hostname.example.com

ただし、「ポート TCP/80にLet's Encrypt側からアクセスがある」ので、ファイアウォールの設定をしている場合、アクセス可能にしておく必要があります。

証明書を削除する

証明書を取得した際のコマンドラインの引数(ドキュメントルート等)は、「/usr/local/etc/letsencrypt/renewal」配下のファイルに保存されています。certbotに影響するWebサーバの設定変更(例えば、ドキュメントルートの変更)があった際は、自動更新が有効な場合、更新時にエラーを起こしLet's Encrypt側に余計な負荷を与えてしまいます。

その場合は、証明書を削除しなければなりません。削除のコマンドは、削除したい証明書がexample.comの場合

certbot delete --cert-name example.com

で削除できます。こちらのサイトが参考になります。