NextCloud+CloudBeatsで出先から自宅の音楽データを再生 (3)Let's encryptのDNS認証によるNextCloudのHTTPS化

前回の記事では,ローカルのRaspberry Piを使って,プライベートなオンラインストレージを構築できるNextCloudのセットアップ方法を記載しました.ここで,HTTPS化のためにLet's encryptを使ったのですが,私の環境ではポート80, 443が外部開放できないため,標準的な方法ではセットアップできませんでした.

本記事では,Let's encryptの証明書をDNS認証で取得し,それを使ってNextCloudのHTTPS化設定をする方法を記載します.

DNS認証部分はDNSDDNSサービスによって異なりますが,私が使用しているMyDNSの事例を記載いたします.MyDNSでは,Let's encryptのDNS認証を行うためのAPIとPHPスクリプトを用意してくれています.そのため,これをありがたく利用させてもらいます.

1. PHPをインストール

まずPHPスクリプトを実行するため,PHPをインストールします.これは,NextCloudをインストールした際に一緒にインストールされたPHPとは別でインストールしておく必要があります.(PHPが/usr/bin/以下に設置されていることが,PHPスクリプト実行の必要環境のため)

sudo apt update
sudo apt install -y php
sudo apt install -y php7.4-mbstring

2. Certbotインストール

続いて,Let's encryptのクライアントであるCertbotをインストールします.

sudo apt install certbot python3-certbot-apache

3. MyDNSのLet's encrypt用APIをたたくPHPスクリプトの実行

まずスクリプトをダウンロードして展開します.実行場所はrootから触れればどこでもよいです.

cd /home/user/working_directory/
wget 'https://github.com/disco-v8/DirectEdit/archive/master.zip' -O DirectEdit-master.zip
unzip ./DirectEdit-master.zip
cd DirectEdit-master
chmod 700 ./*.php
chmod 600 ./*.conf

続いて,スクリプトの設定ファイルtxtedit.conf を編集し,以下3行を書き換えます.ここはMyDNSのログインID・パスワードとドメイン名を入力します.

$MYDNSJP_MASTERID = 'yourmasterid';
$MYDNSJP_MASTERPWD = 'yourpasswd';
$MYDNSJP_DOMAIN = 'yourdomain';

ここまで出来たら,certbotコマンドを実行します.最初は"--dry-run"オプションをつけて実行します.この場合,コマンドの動作の確認だけを行い実際のLet's encryptの認証はしませんので,オプションにミスなどないか確認できます.その後"--dry-run"オプションを外して実行します.

certbot certonly \
--dry-run \
--manual \
--preferred-challenges=dns \
--manual-auth-hook /home/user/working_directory/DirectEdit-master/txtregist.php \
--manual-cleanup-hook /home/user/working_directory/DirectEdit-master/txtdelete.php \
-d xxxxxxx.mydns.jp -d *.xxxxxxxx.mydns.jp \
--server https://acme-v02.api.letsencrypt.org/directory \
--agree-tos -m your@emailaddress.com \
--manual-public-ip-logging-ok

コマンドがうまく通ると,Emailを登録しますか?と聞かれます.Let's encryptに関連する情報が通知されるようになるそうです.任意ですが,今回はNoとしておきます.

"Congratulations!..."というメッセージが出たら成功です.certbotによって証明書が保存されます.私の場合,"/etc/letsencrypt/live/xxxxxx.mydns.jp/"に保存されました.この場所をメモしておきます.

4. NextCloudでLet's encryptの証明書を用いてhttpsを有効化

certbotによって得られたcert, key, chainファイルを,それぞれNextCloudが参照可能なフォルダに移動します.
NextCloudが参照可能なフォルダは以下のコマンドで調べられます.

sudo nextcloud.enable-https custom -h
私の場合,"/var/snap/nextcloud/current/letsencrypt"というフォルダを作り,ここにコピーしました.
sudo cp /etc/letsencrypt/live/xxxxxx.mydns.jp/cert.pem /var/snap/nextcloud/current/letsencrypt
sudo cp /etc/letsencrypt/live/xxxxxx.mydns.jp/chain.pem /var/snap/nextcloud/current/letsencrypt
sudo cp /etc/letsencrypt/live/xxxxxx.mydns.jp/privkey.pem /var/snap/nextcloud/current/letsencrypt

これでNextCloudから証明書が見えるようになりましたので,この証明書ファイルを使ってNextCloudのhttpsを有効化します.

sudo nextcloud.enable-https custom /var/snap/nextcloud/current/letsencrypt/cert.pem /var/snap/nextcloud/current/letsencrypt/privkey.pem /var/snap/nextcloud/current/letsencrypt/chain.pem

"https//[IPアドレス]:23456"にアクセスし,NextCloudの画面が表示できるか確認します.
これで,ポート80, 443などを使わなくともNextCloudをLet's encryptでhttps化できました.

参考サイト