この記事について
図のようにリンクローカルアドレス内で ラズパイ <-> WindowsPC等でのFTP通信するための環境を検証した前回からの続きです。

SSL有りの場合について記事を書きます。
環境
FTPクライアント
- Raspberry Pi 4 Model B Rev 1.2 / Raspberry Pi OS Lite 64-bit (Debian GNU/Linux 11 (bullseye))
- static ip : 192.168.1.100
- local-link static ip : 169.254.100.101
FTPサーバー
- DesktopPC (Windows11 Pro 23H2)
FTPクライアント構築
ラズパイにlftpクライアントとiptables-persistentをインストールします。
証明書の認証手続きをするためにftpではなくlftpを使います。
パッケージインストール
#アップデート
sudo apt update
sudo apt -y upgrade
#python関連インストール
sudo apt install -y python3-dev python3-pip
#lftpとiptablesインストール
sudo apt install -y lftp iptables iptables-persistent
sudo apt update
sudo reboot
filer設定
「ラズパイとWindowsでリンクローカルアドレスFTP(1)SSL無し」のfilter設定と同じです。
FTPサーバー構築
WindowsPCにFTPサーバーを立てます。
FTPサーバー有効化
「ラズパイとWindowsでリンクローカルアドレスFTP(1)SSL無し」のFTPサーバー有効化と同じです。
サーバー証明書の発行
IISのホームからサーバー証明書を発行します。

自己署名入り証明書の作成を選びます。

証明書のフレンドリ名(証明書名)に任意の名前を入力しOKを押します。
これで証明書が作成されます。

FTPサイトの追加
IISマネージャーからFTPサイトを追加します。

WindowsPCにホストするFTPサーバーのサイト名と使用するdirectory名を設定します。

SSL証明書に先ほど作成した証明書名を選択、ポリシーは「SSL接続が必要」を選択して次に進みます。

認証は基本を選択し指定されたユーザーとしてWindowsに普段ログインするユーザーを指定します。
アクセス権は読み書き両方つけます。

lftpの設定
先ほどWindowsで作成した自己署名入り証明書を読み込みftp.crtという名前でuser directoryに保存します。
今回WindowsPCのリンクローカルアドレスは169.254.191.227でした。
echo | openssl s_client -showcerts -connect 169.254.191.227:21 -starttls ftp | \
sed -n "/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p" | \
tee ftp.crt
ftp.crtがあることを確認します。
user@MyPi:~ $ ls
ftp.crt
user directoryにlftpの設定ファイル.lftprcを作り以下の設定をします。
set ftp:ssl-auth TLS
set ftp:ssl-force true
set ftp:ssl-allow true
set ftp:ssl-protect-list true
set ftp:ssl-protect-data true
set ftp:ssl-protect-fxp true
set ssl:verify-certificate yes
set ssl:ca-file "ftp.crt"
set ssl:check-hostname no
動作確認
「ラズパイとWindowsでリンクローカルアドレスFTP(1)SSL無し」の動作確認と同様に、クライアント(ラズパイ)のサンプルファイルをサーバー(WindowsPC)に転送し、サーバー上でrenameしてクライアントで取得します。
サンプルファイル作成
サーバーに転送するサンプルファイル:test.txtを作成します。
user@MyPi:~ $ echo "Hello FTP!" | tee test.txt
user@MyPi:~ $ ls
ftp.crt test.txt
lftpでFTPサーバー(WindowsPC)にログインします。
user@MyPi:~ $ lftp -u win-user 169.254.191.227
Password: Windowsのログインパスワード
lftp win-user@169.254.191.227:~>
サーバーに認証されていることを確認します
lftp win-user@169.254.191.227:~> ls
lftp win-user@169.254.191.227:/>
まだ何もファイルないことが確認できます。
認証に失敗しているとここでエラーが出ます。
クライアントからサーバーにFTP転送
サーバーにtest.txtをputします。
lftp win-user@169.254.191.227:/> put test.txt
11 bytes transferred
lftp win-user@169.254.191.227:/>
test.txtがサーバー上にあることを確認します。
lftp win-user@169.254.191.227:~> ls
11-26-23 01:38AM 11 test.txt
lftp win-user@169.254.191.227:/>
サーバーからクライアントにFTP転送
先ほど転送したtest.txtのファイル名を変更します。
lftp win-user@169.254.191.227:/> mv test.txt win-test.txt
mv test.txt=>win-test.txt [Waiting for response...]
rename successful
lftp win-user@169.254.191.227:/> ls
11-26-23 01:38AM 11 win-test.txt
lftp win-user@169.254.191.227:/>
クライアントからサーバー上のwin-test.txtをgetします。
lftp win-user@169.254.191.227:/> get win-test.txt
11 bytes transferred
lftp win-user@169.254.191.227:/>
lftpから抜けてラズパイのuser directoryにwin-test.txtが存在することを確認します。
lftp win-user@169.254.191.227:/> exit
user@MyPi:~ $ ls
ftp.crt test.txt win-test.txt
SSLを有効化したFTPサーバーに対してラズパイ上のFTPクライアントからput/getできることが確認できました。