ラズパイとWindowsでリンクローカルアドレスFTP（２）SSL有り

## この記事について

図のようにリンクローカルアドレス内で ラズパイ <-> WindowsPC等でのFTP通信するための環境を検証した[前回](https://qiita.com/Saito5656/items/62b65dab4ddaef12eb0f)からの続きです。  

<img width= 550 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/4e621ca8-cce2-3732-0d51-1c7c938aaf49.png>

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を使います。  

### パッケージインストール

```sh
#アップデート
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（１）SSL無し」のfilter設定](https://qiita.com/Saito5656/items/62b65dab4ddaef12eb0f#filer%E8%A8%AD%E5%AE%9A)と同じです。  

## FTPサーバー構築  

WindowsPCにFTPサーバーを立てます。  

### FTPサーバー有効化  

[「ラズパイとWindowsでリンクローカルアドレスFTP（１）SSL無し」のFTPサーバー有効化](https://qiita.com/Saito5656/items/62b65dab4ddaef12eb0f#ftp%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%9C%89%E5%8A%B9%E5%8C%96)と同じです。  

### サーバー証明書の発行  

IISのホームからサーバー証明書を発行します。  

<img width= 550 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/ac76df40-0564-ca00-9be8-7f32ce0732bb.png>

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

<img width= 550 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/c1830c73-041d-9ead-372d-0c9ecef575a7.png>

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

<img width= 550 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/4ffad456-806f-71c7-765f-012afb7e74d5.png>

### FTPサイトの追加  

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

<img width= 650 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/5daf2b72-f33d-d7fd-669f-3d9ef354bebd.png>

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

<img width= 650 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/3c04dc88-92eb-a586-90ae-ef199be728d5.png>

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

<img width= 650 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/cbde943b-6f05-f50c-2051-876df95ed5ca.png>




認証は基本を選択し指定されたユーザーとしてWindowsに普段ログインするユーザーを指定します。  

アクセス権は読み書き両方つけます。  

<img width= 650 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/0afac830-f90e-68f5-8124-422e74171d93.png>

### lftpの設定  

先ほどWindowsで作成した自己署名入り証明書を読み込みftp.crtという名前でuser directoryに保存します。  

今回WindowsPCのリンクローカルアドレスは169.254.191.227でした。  

```sh
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があることを確認します。  

```sh
user@MyPi:~ $ ls
ftp.crt
```

user directoryにlftpの設定ファイル.lftprcを作り以下の設定をします。

```sh:~/.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（１）SSL無し」の動作確認](https://qiita.com/Saito5656/items/62b65dab4ddaef12eb0f#%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D)と同様に、クライアント(ラズパイ)のサンプルファイルをサーバー(WindowsPC)に転送し、サーバー上でrenameしてクライアントで取得します。  


### サンプルファイル作成  

サーバーに転送するサンプルファイル:test.txtを作成します。  

``` sh
user@MyPi:~ $ echo "Hello FTP!" | tee test.txt
user@MyPi:~ $ ls
ftp.crt　test.txt
```


lftpでFTPサーバー(WindowsPC)にログインします。  

```sh
user@MyPi:~ $ lftp -u win-user 169.254.191.227
Password: Windowsのログインパスワード
lftp win-user@169.254.191.227:~>
```

サーバーに認証されていることを確認します

```sh
lftp win-user@169.254.191.227:~> ls
lftp win-user@169.254.191.227:/>
```

まだ何もファイルないことが確認できます。
認証に失敗しているとここでエラーが出ます。  

### クライアントからサーバーにFTP転送  

サーバーにtest.txtをputします。  

```sh
lftp win-user@169.254.191.227:/> put test.txt
11 bytes transferred
lftp win-user@169.254.191.227:/>
```

test.txtがサーバー上にあることを確認します。  

```sh
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のファイル名を変更します。  

```sh
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します。  

```sh
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が存在することを確認します。  

```sh
lftp win-user@169.254.191.227:/> exit
user@MyPi:~ $ ls
ftp.crt　test.txt  win-test.txt
```

SSLを有効化したFTPサーバーに対してラズパイ上のFTPクライアントからput/getできることが確認できました。

## 参考文献  

* [FTP サーバーで FTPS を設定する (Windows Server)](https://sorceryforce.net/ja/tips/ftp-server-windows-server-ftps)  
* [lftpの使い方](https://hn-carter.sakura.ne.jp/posts/to-use-lftp/)  
* [lftpのSSL通信エラー解消方法](https://protocol.nekono.tokyo/2016/07/06/lftp%E3%81%AEssl%E9%80%9A%E4%BF%A1%E3%82%A8%E3%83%A9%E3%83%BC%E8%A7%A3%E6%B6%88%E6%96%B9%E6%B3%95/)  
* [lftp で "Certificate verification: certificate common name doesn't match requested host name" というエラー](https://qiita.com/yuki12/items/b0a9e7efa79a80309c0b)  
* [ラズパイとWindowsでリンクローカルアドレスFTP（１）SSL無し](https://qiita.com/Saito5656/items/62b65dab4ddaef12eb0f)