Raspberry Pi 3のApacheにSSL環境を導入する

最近は何かとSSL化されている環境が必要なので、無料でSSLの証明書を発行してもらえるLet's Encryptを使ってApacheにSSL環境を作るメモ。説明は便宜上、ドメイン名はexample.comとして記載してあるので、適宜読み替えてくださいまし。
Let's Encryptとは
Let's Encryptは、無料で利用できるオープンな認証局。アメリカのISRG(Internet Security Research Group)と言う公益法人が運営しているそうな。日本でいう所の国税庁に相当するアメリカ合衆国内国歳入庁の承認を受けていて、Google, cisco, mozilla, facebookなどなどがスポンサーしているちゃんとした組織らしいですよ。インターネットの安全な通信を行うための、経済面や技術面での障壁を減らす事を目的としてるので、公益事業として無料で運営してるんだとか。通常の認証局であれば申請という作業が必要なんだと思うけど、Let's Encryptではコマンド一発で証明書を取得できる。ドメイン認証型の証明書なのでドメインの存在が確認さえできれば問題ない。運営元の身元保証じゃなくて通信の暗号化が目的であればこれで十分。素晴らしいね。ありがたく使わせてもらおう。
ここで導入する環境について
RASPBIAN JESSIE LITEにApacheが既にセットアップ済みで、http(ポート80/tcp)とhttps(ポート443/tcp)が接続可能なように、適切にルーターやファイヤーウォールなどの設定が行われている。また、独自ドメインがあるのを前提としている。ダイナミックDNSサービスの無料ドメインを使用している場合は、不可能じゃないのかもしれないけど多分難しい。安くてもいいのでドメインを取得するのがいいと思う。IPアドレスについては固定じゃなくても、ダイナミックDNSサービスを利用していても証明書は取得できる。
証明書取得クライアントのインストール
GitHubにある証明書取得用のクライアントをcloneする必要があるので、gitをインストールする。
$ sudo apt-get install git
ここでは/usr/shareにcloneした。ちなみに古い説明だとletsencryptクライアントになっているが、現在はcertbotクライアントになっている。
$ cd /usr/share
$ sudo git clone https://github.com/certbot/certbot
コマンドを実行して証明書取得に必要なパッケージをインストールする。python絡みのパッケージが色々と入るっぽい。
$ cd certbot
$ ./certbot-auto
letsencrypt_setup1
ダイアログが出るけど一旦Cancelで終了する。
証明書を取得する
Apacheを一旦停止しておく。
$ sudo service apache2 stop
証明書を取得するコマンドを実行する。先ほどのコマンドに色々とオプションを指定して実行する。
$ ./certbot-auto certonly --standalone -d exapmle.com -m me@exapmle.com --agree-tos
オプション 説明
certonly 証明書の取得のみを行う。自動で色々やってくれるオプションもあるみたいだけど、うまく行かない場合もあるそうで、どういう設定が必要なのかも知っておきたいので。
--standalone certbotクライアントの簡易サーバー機能を使用する。Apacheが動作していると、この機能と重複するので先にApacheは停止しておく。Apacheを動作させたまま証明書を取得するオプションもあるけど、ドキュメントルートに認証用ファイルが生成されるのが何となく嫌だったので、ここではそれは使わないようにした。
-d 証明書を取得するドメイン名を指定する。ある期間内に取得できる証明書の回数の上限が決まっているので、ダイナミックDNSサービスで使える無料ドメインはみんながこぞって取得しようとするので、ここで独自ドメインが必要になってくる。実際にダイナミックDNSサービスの無料ドメインで試してみたけど、このドメインは取得回数の上限に達しているという旨のメッセージが表示されてエラーになった。
-m メールアドレスを指定する。これは何かしらのトラブルであったり、証明書の有効期限が迫った時など、通知を受け取る用のメールアドレス。ちなみにLet's Encryptの証明書の有効期限は90日。短いけど無料なので仕方ないね。更新すればいいだけなので。更新するためのコマンドも用意されているからcronで定期実行してやればいい。
--agree-tos 利用規約に同意する旨のサインのようなもの。利用規約は読んでおきましょう。
無事こんなメッセージが、表示されたら証明書の取得は成功。このメッセージにも書かれているように/etc/letsencrypt以下に証明書その他、必要ファイルが入っているのでバックアップを取っておく方がいいと思う。 letsencrypt_setup2
Apacheの設定を行う
Apacheの設定ファイルを変更する。以下の部分を変更する。設定方法はApacheのバージョンによって多少違うらしい。Apache 2.4.8以降のバージョンはSSLCertificateChainFileが廃止になったようなので、設定するApacheのバージョンに合わせてどちらかを記載する。
Apache 2.4.7までの場合
$ sudo nano /etc/apache2/sites-available/default-ssl.confSSLEngine on

SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
Apache 2.4.8以降の場合
$ sudo nano /etc/apache2/sites-available/default-ssl.confSSLEngine on

SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
ApacheでSSLを有効にして、設定を反映させるため再起動する。再起動しても正常に動作するか確認しておきたいので。
$ sudo a2ensite default-ssl
$ sudo a2enmod ssl 
$ systemctl restart apache2
$ sudo reboot
httpsで接続して証明書を確認する
ローカルネットワーク内のRaspberry Pi 3を設定している場合は、ドメインの名前解決が多分できないので、スマホからWi-Fiを切って4G回線などで外部の回線からhttpsでアクセスして確認するのが手っ取り早いと思う。今後も度々Raspberry Pi 3にローカルからアクセスするのであれば、WindowsならC:\Windows\System32\drivers\etc\hostsに追記しておけばいいんだけどね。Windows10だと開こうとしても権限がないので上書き禁止状態になってしまうので、一旦デスクトップにでもコピーして、編集してから元の場所に上書きで戻してやればいい。 letsencrypt_setup3
証明書がLet's EncryptになっていればSSL化成功。
    この記事で書かれている製品やソフトについて
  • Raspberry Pi 3 Model B
  • RASPBIAN JESSIE LITE(September 2016)
  • Apache 2.4.10 (Raspbian)