WEBサーバを HTTPS 化する
Back
HOME
WEBサーバ経由でPCを再起動出来るようにしたり、HTTPS 化されたホームページに、されていないWEBを埋め込んだりしようとするとセキュリティから出来なかったり、やはり SSL/TLS 化の必要性を感じる。
このWEBサーバは、D-STAR リピータのゲートウェイPCにインストールして、DVリピータモニターや dmonitor で接続しているユーザと、
通信を行った履歴を表示するプログラム
LastHeardである。
この LastHeard の WEB へのリンクをこのブログに、生の形で埋め込もうとして、非SSL/TLSのサイトを SSL/TLS化されたサイトに埋め込むことは出来ないことが分かった。
当ブログのホーム、右ペインに表示出来たのでポイントを残すことにした。
使用した証明書は無償だが Listen Port 80 で待機している必要が有る
元々 80 ならばインストールから、Apache への組み込み、3ヶ月ごとの更新に至るまであっという間に出来る。
(この項目は不要)
- 取り敢えず、80番で待ち受けできるように Apache に追加(オリジナルは変えなくていいように)。
sudo nano /etc/apache2/sites-available/d-star_80.conf
GNU nano 7.2
<VirtualHost *:80>
ServerName d-star.dynmicdns.net # 実際にグローバルアドレスに宛てられたダイナミックDNS の FQDN
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
- d-star.conf の有るフォルダで Apache を構成し直す。
$ sudo a2ensite d-star_80.conf
$ sudo apache2ctl configtest
$ sudo systemctl reload apache2
- 80番ポートフォワーディングをこの Gatewayサーバに設定し直す。
この時点で、http://d-star.dynamicdns.net でダッシュボードが見える。(未だ SSL/TLS化はされていない)
=MEMO= 実はテスト的に、AlmaLinux では Port 80 を引き直さず、8080 のまま certbot の新規取得を実行してみた。
当然、エラーにはなったが、certbot のシステムフォルダ構成は完了する。
そこで ホスト名や公開鍵の設定は済ませておいて、Port80 を使用しているマシンに、事項で記述する証明書取得環境を作り、更新スクリプトを実行して見たところ、
SSL/TLS の証明書環境を作ることが出来た。
アプリケーションをインストールし証明書を取得する
- 証明書取得に Let's Encrypt certbot を使用する。
$ sudo apt update
$ sudo apt install certbot python3-certbot-apache -y # Apache用
- Certbot で証明書を取得する(ダイナミックDNS の FQDN を -d で指定)
$ sudo certbot --apache -d d-star.dynamicdns.net
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for d-star.dynmicdns.net
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/d-star.dynamicdns.net/fullchain.pem
Key is saved at: /etc/letsencrypt/live/d-star.dynamicdns.net/privkey.pem
This certificate expires on 2025-12-18.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for d-star.dynamicdns.net to /etc/apache2/sites-available/d-star-le-ssl.conf
Congratulations! You have successfully enabled HTTPS on https://d-star.dynamicdns.net
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
この時点で、証明書の更新手順についても自動化されていることが分かる(青字上)。
また、この証明書を使用できる d-star-le-ssl.conf ファイルが生成されている。(青字下)
- 上で指定した FQDN を名称としたフォルダにファイルが出来て居るはずで有る。
ただし、このフォルダは完全な root 権限が必要なため スーパユーザーになる必要が有る。
$ sudo su -
# ls /etc/letsencrypt/live/d-star.dynamicdns.net
README cert.pem chain.pem fullchain.pem privkey.pem
# exit
この証明書を使って正規の VirtualHost 443 で Apache を再構築
- d-star_ssl.conf 等の名前で SSL/TLS 用のファイルを作成
前項で自動生成された d-star-le-ssl.conf を利用しても良い。
GNU nano 7.2
<VirtualHost *:443>
ServerName d-star.dynamicdns.net
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/d-star.dynamicdns.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/d-star.dynamicdns.net/privkey.pem
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
- サイトを有効化する
$ sudo a2ensite d-star_ssl.conf
$ sudo apache2ctl configtest
$ sudo systemctl reload apache2
- 80番にしていたポートフォワーディングを元のPCに戻し、新たに 443 をこのRaspberry Piに引く。
この時点で、外部から https://d-star.dynamicdns.net で D-STAR LastHeard のダッシュボードが見える。
Port 80 を別の Raspberry Pi が使っている場合の更新手順
- 前述の「アプリケーションをインストールし証明書を取得する」を別のPCで実行
Apache のファイルの変更や更新は必要無い。ポートが 80 であれば証明書の取得は出来、この時点で /etc/letsencrypt/ の各フォルダは出来る。
- そこで、3ヶ月に一度の証明書更新は自動で行われることが分かっている(前述)ので、更新が有った時点で、D-STAR Gateway へこのフォルダをコピーする
少し更新のしくみをチェックしてみる。
$ sudo nano /etc/cron.d/certbot
GNU nano 7.2 /etc/cron.d/certbot
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew --no-random-sleep-on-renew
一日に二回チェックして、期限が 30日を切っていたら更新することになっている。
更に、システムフォルダに次のフォルダが有る。名前のとおり、更新時この中のスクリプトを実行することができる。
$ cd /etc/letsencrypt/renewal-hooks/deploy/
$ sudo nano copy2d-stargw.sh
- Raspberry Pi(port 80) から Gateway (Rpi 又は Alma) へのコピーとその後処理を手順化する
GNU nano 7.2 copy2d-stargw.sh
#!/bin/bash
# 証明書新規取得
#sudo certbot certonly --webroot -w /var/www/html -d jl3zbs-a.softether.net
# 証明書更新(通常これは1日2回自動で行われ、
# 証明書の期限が30日を切っている場合だけ更新される
#sudo certbot renew --dry-run
#
# ここから上は必要に応じて手動で行いたいときのみアンコメントする
# 通常自動更新されるとこのスクリプトが自動起動するので
# ここから下のみ有効にしておく
# ゲートウェイがホスト名 Rpi-GW か Alma-GW かによって分岐
if ssh -i /home/USER/.ssh/id_rsa -p 22 -o ConnectTimeout=3 USER@Rpi-GW.local true 2>/dev/null; then
echo 'Gateway is Rpi-GW'
# 取得又は更新したデータを Rpi-GW のhomeへコピー
sudo scp -i /home/USER/.ssh/id_rsa -pr -P 22 /etc/letsencrypt/live/d-star.dynamicdns.net/ USER@Rpi-GW.local:~/
# SSHで Rpi-GW に入りデータを所定の場所へ移動して Apache を再起動
ssh -i /home/USER/.ssh/id_rsa -p 22 USER@Rpi-GW.local \
"sudo -i bash -c 'cp -rf /home/USER/d-star.dynamicdns.net /etc/letsencrypt/live/ && systemctl reload apache2'"
elif ssh -i /home/USER/.ssh/id_rsa -p 22 -o ConnectTimeout=3 USER@Alma-GW.local true 2>/dev/null; then
echo 'Gateway is Alma-GW'
# 取得又は更新したデータを Alma-GW のhomeへコピー
sudo scp -i /home/USER/.ssh/id_rsa -pr -P 22 /etc/letsencrypt/live/d-star.dynamicdns.net/ USER@Alma-GW.local:~/
# SSHで Alma-GWw に入りデータを所定の場所へ移動して httpd を再起動
ssh -i /home/USER/.ssh/id_rsa -p 22 USER@Alma-GW.local \
"sudo -i bash -c 'cp -rf /home/USER/d-star.dynamicdns.net /etc/letsencrypt/live/ && systemctl reload httpd'"
fi
# なお、上の scp と ssh はパブリックキーとプライベート
# キーで鍵認証しているのでパスワードは不要
順番が逆だが、自動起動・自動処理のためパスワード入力は出来ないので、鍵認証用のキー(赤文字)を次の項で準備する。
又、同時に Rpi と Alma をリプレースしても動作するように、どちらも同じ認証鍵、SSL/TLS認証キーを使えるようにする。
鍵認証自動更新用の設定
Rpi-Port80 側の設定
ホストファイルに、二つの同一アドレスを区別する相手ホスト名を登録する
GNU nano 7.2 /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.1.1 Rpi-Port80
# 同IP、別名host で Rpi と Alma を使い分ける
10.0.x.xx Rpi-GW.local # 呼び出し側の IPに対応するホスト名は .local が必要
10.0.x.xx Alma-GW.local
Raspberry Pi Gateway の場合
- 先ず Rpi-GW のホスト名を指定する。
これは、Rpi-GW と Alma-GW が同一アドレスを使用するため、Rpi-Port80 側で区別するためである。
GNU nano 7.2 /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.1.1 Rpi-GW # あくまでホスト名なので .local は不要
同様に /etc/hostname の内容も変更する。
- Rpi-Port80 から Rpi-GW へパスワード無しでログインするために、先ず Rpi-Port80 で SSH 鍵の作成をする
$ ssh-keygen -t rsa -b 4096
$ ls .ssh
id_rsa id_rsa.pub
- id_rsa はそのままにして(前項で指定していたところが使用可になる)、id_rsa.pub(公開鍵) を Rpi-GW にコピーする。
$ ssh-copy-id -p 22 USER@Rpi-GW.local
初回はパスワードが必要
- Rpi-GW 側での作業
$ ls .ssh
autherized_keys # ssh-copy-id で公開鍵ファイルとして生成される
$ sudo chmod 700 .ssh
$ sudo chmod 600 .ssh/authorized_keys
- RPi-A から RPi-B へアクセスしてみる
$ ssh -p 22 USER@Rpi-GW.local
AlmaLinux Gateway の場合
- Alma-GW のホスト名を指定する。
$ sudo hostnamectl set-hostname Alma-GW
コマンド実行後、再ログインすると次のようになっている。(自分自身の実アドレスは追記した)
GNU nano 5.6.1 /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.1.1 Alma-GW
10.0.x.xx Alma-GW # 自分自身の実アドレス
Rpi-GW 同様に /etc/hostname にもホスト名を記入する。(新規インストールでホスト名が付いていない場合ファイル自体が無い)
自分自身の実アドレスを追記するのは AlmaLinux 自身が Alma-GW を名前解決できるようにするためである。
- Rpi-Port80 から Alma-GW へパスワード無しでログインするために、既に作成済みの SSH 鍵をコピーする。
$ ssh-copy-id -p 22 USER@Alma-GW.local
$ ssh -p 22 USER@alma-gw.local # 試しにアクセスしてみる
これで、Rpi-Port80 からスクリプトを実行して Alma-GW に SSL/TLS 用証明書をプッシュできる環境となった。
- Rpi-Port80 にてスクリプトを実行する
$ cd /etc/letsencrypt/renewal-hooks/deploy
$ ./copy2d-stargw.sh
Gateway is Alma-GW
cert.pem 100% 1310 686.0KB/s 00:00
fullchain.pem 100% 2876 1.6MB/s 00:00
privkey.pem 100% 241 199.9KB/s 00:00
chain.pem 100% 1566 1.1MB/s 00:00
README 100% 692 503.8KB/s 00:00
この証明書を使って VirtualHost 443 で httpd を再構築
- d-star_ssl.conf を作成。ただし Rpi-GW の時とはフォルダ構成が異なる
$ cd /etc/httpd/conf.d/
$ sudo nano d-stat_ssl.conf
GNU nano 5.6.1 d-star_ssl.conf
<VirtualHost *:443>
ServerName d-star.dynamicdns.net
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/d-star.dynamicdns.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/d-star.dynamicdns.net/privkey.pem
ErrorLog /var/log/d-star.error.log # Apache2のように ${APACHE_LOG_DIR} は無いので実パスで
CustomLog /var/log/d-star.access.log combined
</VirtualHost>
$ sudo apachectl configtest
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1.
Set the 'ServerName' directive globally to suppress this message
Syntax OK
こういうメッセージが出ることがある。エラーでは無く警告で、Syntax OK と有るように文法上は通っている。
ServerNameが設定されていないので FQDN が不明と言う事である。その時は次のように httpd.conf を変更する。
$ sudo nano /etc/httpd/conf/httpd.conf
GNU nano 5.6.1
ServerName d-star.dynamicdns.net
# 又は取り敢えず FQDN での指定はやめて次のようにする。
ServerName 127.0.0.1
# ついでに今までの 8080 に加え 443 を設定する
Listen 443
Listen 8080
次に、Rpi-GW では何もせずとも 443 の設定をしてポートフォワードをすれば、今までどおりに 8080 でも Listen 出来たが AlmaLinux では一手間必要。
$ sudo nano /etc/httpd/conf.d/d-star_8080.conf
GNU nano 5.6.1
<VirtualHost *:8080>
ServerName d-star.dynamicdns.net
DocumentRoot /var/www/html
# もし 8080 も SSL にしたい場合は SSLEngine on を追記
# SSLEngine on
# SSLCertificateFile /etc/letsencrypt/live/d-star.dynamicdns.net/fullchain.pem
# SSLCertificateKeyFile /etc/letsencrypt/live/d-star.dynamicdns.net/privkey.pem
ErrorLog /var/log/httpd/d-star_8080_error.log
CustomLog /var/log/httpd/d-star_8080_access.log combined
</VirtualHost>
これで、Alma-GW を Rpi-GW の代わりに置き換えても、何ら変更なくこの仕組みが動くことになる。
Back
HOME

この 作品 は
クリエイティブ・コモンズ 表示 - 非営利 - 改変禁止 4.0 国際 ライセンス
の下に提供されています。
English
Powered by