1.概要
FTPSでファイル転送のシステムを構築している時に
クライアントアプリ側【FtpWebRequest】で下記のエラーが発生しました。
リモート サーバーがエラーを返しました: (522) 522 SSL connection failed; session reuse required: see require_ssl_reuse option in vsftpd.conf man page
※サーバーは【CentOS】で【vsftpd】で構築しています。
この内容を直訳すると
SSL接続に失敗しました。セッションの再利用が必要:vsftpd.conf manページのrequire_ssl_reuseオプションを参照
ここでエラー内容にある【vsftpd】の【require_ssl_reuse】は何かというのを調べてみると
require_ssl_reuse | 詳細 |
---|---|
Yes | コントロールコネクションでSSL認証し、データコネクションで認証されたSSLセッションを再利用する。 |
No | コントロールコネクションでSSL認証し、データコネクションでは認証を行わない。 |
という内容になります。
デフォルトでは【require_ssl_reuse=Yes】の状態なので
データコネクションでSSLセッションを再利用しているわけですが
ここがうまくいってないのだと思います。
2.原因
原因はFTPSクライアントがコントロールコネクションで認証されたSSLセッションを
データコネクションで再利用できないことにあります。
今回使用したFTPSクライアントですが
【FtpWebRequest】クラスを使ったものでした。
解決するためにどうしたらいいか検証してみます。。
3.サーバー側でなおす
【require_ssl_reuse=No】にしたらどうなるのか?
実際にやってみると問題なくFTPSでファイル転送が可能になりました。
ですがこの場合、データコネクションではSSL認証が行われていないわけですから
セキュリティーが若干落ちてしまいます。
構築するシステムの状況によりますが、この方法で解決するのもありかもしれません。
4.クライアント側でなおす
そもそもの原因がクライアント側にあるわけですから
クライアント側を修正するのが筋だと思います。
とりあえず【FtpWebRequest】をやめて【FluentFTP】で試してみます。
結果としてはどちらも同じエラーを返されてしまいました。
5.KeepAliveについて
解決方法がわからず色々といじっていると
【FtpWebRequest.KeepAlive】プロパティが目につきました。
これは何かというと
要求の完了後に FTP サーバーへの制御接続を閉じるかどうかを指定する Boolean 値を取得または設定します。
とのこと。
関係ないと思ったのですがとりあえず現状の【false】から【true】へ変更してみます。
すると問題なくデータ転送が行えてしまいました。
これを【true】にする使い方としては
一度の接続で複数のコマンドを実行する時
という認識でした。
更にFtpWebRequest.GetResponse()をClose()しても
コントロールコネクションの接続は切断されず
切断する場合は【KeepAlive=false】にし
何かしらのコマンドを送ってからClose()する必要があるはずです・・・
全く関係ないと思うのですが結果としてファイル転送が行われたのは
どういう原理からなのでしょうか。
調べる時間もないので今回はこの辺で。
また、時間が空いたら調べてみようかと思います。