この記事について
図のようにリンクローカルアドレス内で ラズパイ <-> WindowsPC等でのFTP通信するための環境を検証した前回からの続きです。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F565396%2F4e621ca8-cce2-3732-0d51-1c7c938aaf49.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d3486a3c7fc542024e76f8a74b7ca178)
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のホームからサーバー証明書を発行します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F565396%2Fac76df40-0564-ca00-9be8-7f32ce0732bb.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=0408af268e25e259e9cfdcff1b3b601e)
自己署名入り証明書の作成を選びます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F565396%2Fc1830c73-041d-9ead-372d-0c9ecef575a7.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=ad32ff94c0e18d70e6787bf12fddbea5)
証明書のフレンドリ名(証明書名)に任意の名前を入力しOKを押します。
これで証明書が作成されます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F565396%2F4ffad456-806f-71c7-765f-012afb7e74d5.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d41f7067d3fe47ec1071a94975db4f67)
FTPサイトの追加
IISマネージャーからFTPサイトを追加します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F565396%2F5daf2b72-f33d-d7fd-669f-3d9ef354bebd.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=fb31a0967f3873d38c1c883bc922c834)
WindowsPCにホストするFTPサーバーのサイト名と使用するdirectory名を設定します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F565396%2F3c04dc88-92eb-a586-90ae-ef199be728d5.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=ecadb953885b36f9db528f833c3c1690)
SSL証明書に先ほど作成した証明書名を選択、ポリシーは「SSL接続が必要」を選択して次に進みます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F565396%2Fcbde943b-6f05-f50c-2051-876df95ed5ca.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=06416cf7715df6605b23896193ebf19c)
認証は基本を選択し指定されたユーザーとしてWindowsに普段ログインするユーザーを指定します。
アクセス権は読み書き両方つけます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F565396%2F0afac830-f90e-68f5-8124-422e74171d93.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=c29aa664a1089166a7f563c599cc87b5)
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できることが確認できました。