Let’s Encryptで無料でSSL認証されたサーバを作る

内容

以前、「RaspberryPiでWebサーバを公開(WordPress)」という記事を執筆しました。この記事では、SSL証明書は使用せずに、非セキュア(?)なhttpのサイトの公開方法を紹介しました。

SSL証明書を無料で取得してhttpで公開してるサイトをhttps化しちゃいましょうってやつです。
何がいいかってなんか良くない?
なんか、うん。
暗号化通信って響きがもうかっこいいよね

Let’s Encryptとは

「そもそもLet’s Encryptってなんですの?」って人、絶対いますよね
どうやってこの記事までたどり着いたんですかねぇ…SSLとか証明書とかかな?
まぁいいけど、Let’s EncryptってのはSSL/TLS の暗号化通信に用いる証明書の認証局(CA; Certificate Authority)の1つ。
世界中には様々な認証局があるんだけど、Let’s Encrypt には次の特長がある

  • 自由に使える
  • 自動で署名される
  • オープン
  • 証明書の有効期間は90日
  • 期限が切れても自動で更新できる

って感じですかね

実際に入れてみる

筆者の動作環境

つまりこのサーバの動作環境はこんな感じ

  • RaspberryPi2
  • Raspbian4.3.30(?)
  • Apache2.4.10

サーバが動いてさえいればなんら問題はない。ただ、Apacheのバージョンによっては使用するファイルが異なってきたりするかもしれない。

Let’s Encryptをインストールする

インストールするっていうとちょっと違うかも。
まぁ細かいことは気にしないでさっさと本題に入ろうか
まずは、cert-botと言われる、Let’s Encryptと通信して証明書を取得するためのツールをゲットします。
今は仮に/usr/binに保存していますがどこでもいいです。
ただ、PATHが通ってるディレクトリの方が何かと便利

ダウンロードしたら、certbot-autoコマンドを用いて証明書を発行していきます。

このコマンドを叩くと、必要なパッケージをインストールし始める場合があります。
その時は素直にインストールしてやってください。
パッケージがインストールされたら、利用規約が表示されます。
Agreeに合わせてやってEnterで同意してください。
同意すると証明書を得ることができます。(同意しないとどうなるんだろ…やっぱり取得できないんだろうね)
certbotはサイトが存在しているかどうかの確認を「サイトにアクセスできるかどうか」で確認しています。
なんで、自宅サーバでルータのポート解放を行なっていなかったり、iptablesとかの設定でアクセス拒否しているとうまく証明書を得ることができません。
うまく証明書を取得できるとこんな感じの文章が出てきます。

すると、証明書関連のファイルが/etc/letsencript/live以下に保存されています。
今回認証に使ったドメインはkoron0902.ddns.netなので、証明書が保存されているフォルダは/etc/letsencript/live/koron0902.ddns.netになります。

これで、証明書の取得は終わりです

Apacheに証明書を適用する

最後に、実際にSSL通信を行うためにApacheにさっき取得したSSL証明書を適用します。
/etc/apache2/site-available内に、default-ssl.confがあると思います。
これが、SSL通信用の設定ファイルの雛形になります。
これをコピーして使います。

必要になる設定は、

  • SSLEngine <– そもそもSSLを使うかどうか
  • SSLCertificateFile <– 証明書のファイルを指定
  • SSLCertificateKeyFile <– 証明書の鍵を設定

の3つです。
で、これをそれぞれ次のようにします。

  • SSLEngine on
  • SSLCertificateFile /etc/letsencrypt/live/ドメイン名/fullchain.pem
  • SSLCertificateKeyFile /etc/letsencrypt/live/ドメイン名/privkey.pem

ファイル全体でまとめるとこんな感じ

で、そしたら保存
あー、アクセスコントロールは各自で設定お願いします。
でもって、Apacheに関しても一つ二つやることがある。
まずは、SSLのモジュールを有効化してやる。

で、Apacheで有効になってるサイトは/etc/apache2/site-enabledにシンボリックリンクが貼られるんだけどどうするかってのもちゃんとコマンドがある。
今回のファイルは000-default-ssl.confだから

これで、site-enabledにシンボリックリンクが貼られてるからあとはApacheを再読み込みするだけ。

これでサイトにアクセスしてみてちゃんとSSL通信が有効になってたら成功。
なってなかったらまた確認するなり他のサイトも見てみるなり諦めるなり選択肢はたくさんあるから頑張って

–2019年3月1日追記–

期限が切れたら自動で更新されるって冒頭で書いてるけど切れたらやっぱ怖いのでcronで更新をスケジュールしてみよう.

そういえば最近はバージョン管理ツールでcertbotがインストールできるみたいなのでそれを試してもいいかも

-2019年3月8日追記-

今はfedoraでサーバを公開してるんですが,dnfで入れたcertbotをアプデしたら下記のエラーが

そこでファイルを見てみる...ちゃんとあるやん......

要因はパーミッションが勝手に変更されていたというものでした.

てことで,archiveliveの権限変更

こんでOK!!

-2019年07月14日追記-

SSL証明書が有効になるのはhttpsプロトコルでアクセスしてきた場合のみ.しかしサイトにアクセスしてくる人が非SSLサイトにアクセスしてこないとも限らない.そこで,80ポートにアクセスしてきたら443ポートにリダイレクトするような設定をしよう.

で,これを設定した時に不都合がある.というのも,Let’s Encryptの証明書発効は80ポートにアクセスしてサイトが存在するかどうかを確認するプロセスが含まれている.しかしこの設定を有効化してしまうと80ポートにアクセスしてきた時のレスポンスが301であるためにサイトの存在証明ができない.

そこで,証明書の更新にはapache等で立てているサーバを参照するのではなく,certbot自体のサーバを代替サーバとして存在確認を行うようにする.

あわせて読みたい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です