Day After Day
tsurezure naru mamani...
ANOTHER DECADE

from 2021 when it's begining after/with CORONA Virus.

WEBサーバを HTTPS 化する

9月
21
2025
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ヶ月ごとの更新に至るまであっという間に出来る。 (この項目は不要

  1. 取り敢えず、80番で待ち受けできるように Apache に追加(オリジナルは変えなくていいように)。

  2. 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>

  3. d-star.conf の有るフォルダで Apache を構成し直す。

  4. $ sudo a2ensite d-star_80.conf
    $ sudo apache2ctl configtest
    $ sudo systemctl reload apache2

  5. 80番ポートフォワーディングをこの Gatewayサーバに設定し直す。
  6. この時点で、http://d-star.dynamicdns.net でダッシュボードが見える。(未だ SSL/TLS化はされていない)


=MEMO= 実はテスト的に、AlmaLinux では Port 80 を引き直さず、8080 のまま certbot の新規取得を実行してみた。 当然、エラーにはなったが、certbot のシステムフォルダ構成は完了する。 そこで ホスト名や公開鍵の設定は済ませておいて、Port80 を使用しているマシンに、事項で記述する証明書取得環境を作り、更新スクリプトを実行して見たところ、 SSL/TLS の証明書環境を作ることが出来た。

アプリケーションをインストールし証明書を取得する


  1. 証明書取得に Let's Encrypt certbot を使用する。

  2. $ sudo apt update
    $ sudo apt install certbot python3-certbot-apache -y      # Apache用

  3. Certbot で証明書を取得する(ダイナミックDNS の FQDN を -d で指定)

  4. $ 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 ファイルが生成されている。(青字下)

  5. 上で指定した FQDN を名称としたフォルダにファイルが出来て居るはずで有る。
  6. ただし、このフォルダは完全な root 権限が必要なため スーパユーザーになる必要が有る。

    $ sudo su -
    # ls /etc/letsencrypt/live/d-star.dynamicdns.net
    README  cert.pem  chain.pem  fullchain.pem  privkey.pem
    
    # exit

この証明書を使って正規の VirtualHost 443 で Apache を再構築


  1. d-star_ssl.conf 等の名前で SSL/TLS 用のファイルを作成

  2. 前項で自動生成された 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>
  3. サイトを有効化する

  4. $ sudo a2ensite d-star_ssl.conf
    $ sudo apache2ctl configtest
    $ sudo systemctl reload apache2

  5. 80番にしていたポートフォワーディングを元のPCに戻し、新たに 443 をこのRaspberry Piに引く。

  6. この時点で、外部から https://d-star.dynamicdns.net で D-STAR LastHeard のダッシュボードが見える。

Port 80 を別の Raspberry Pi が使っている場合の更新手順


  1. 前述の「アプリケーションをインストールし証明書を取得する」を別のPCで実行
  2. Apache のファイルの変更や更新は必要無い。ポートが 80 であれば証明書の取得は出来、この時点で /etc/letsencrypt/ の各フォルダは出来る。

  3. そこで、3ヶ月に一度の証明書更新は自動で行われることが分かっている(前述)ので、更新が有った時点で、D-STAR Gateway へこのフォルダをコピーする

  4. 少し更新のしくみをチェックしてみる。

    $ 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

  5. Raspberry Pi(port 80) から Gateway (Rpi 又は Alma) へのコピーとその後処理を手順化する

  6.   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 の場合

  1. 先ず Rpi-GW のホスト名を指定する。
  2. これは、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 の内容も変更する。

  3. Rpi-Port80 から Rpi-GW へパスワード無しでログインするために、先ず Rpi-Port80 で SSH 鍵の作成をする

  4. $ ssh-keygen -t rsa -b 4096
    $ ls .ssh
    id_rsa  id_rsa.pub

  5. id_rsa はそのままにして(前項で指定していたところが使用可になる)、id_rsa.pub(公開鍵) を Rpi-GW にコピーする。

  6. $ ssh-copy-id -p 22 USER@Rpi-GW.local
    初回はパスワードが必要

  7. Rpi-GW 側での作業

  8. $ ls .ssh
    autherized_keys                  # ssh-copy-id で公開鍵ファイルとして生成される
    
    $ sudo chmod 700 .ssh
    $ sudo chmod 600 .ssh/authorized_keys

  9. RPi-A から RPi-B へアクセスしてみる

  10. $ ssh -p 22 USER@Rpi-GW.local

AlmaLinux Gateway の場合

  1. Alma-GW のホスト名を指定する。

  2. $ 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 を名前解決できるようにするためである。

  3. Rpi-Port80 から Alma-GW へパスワード無しでログインするために、既に作成済みの SSH 鍵をコピーする。

  4. $ ssh-copy-id -p 22 USER@Alma-GW.local
    $ ssh -p 22 USER@alma-gw.local      # 試しにアクセスしてみる
    これで、Rpi-Port80 からスクリプトを実行して Alma-GW に SSL/TLS 用証明書をプッシュできる環境となった。

  5. Rpi-Port80 にてスクリプトを実行する

  6. $ 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 を再構築


  1. d-star_ssl.conf を作成。ただし Rpi-GW の時とはフォルダ構成が異なる

  2. $ 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