まずは情報の整理から。

種類 暗号化なし 暗号化あり
HTTP HTTP HTTPS
FTP FTP FTPS

混乱しやすいが、SFTP は SSH を使って暗号化・認証を行うプロトコルで FTPS とは別。

  • HTTP のセキュア版が HTTPS
  • FTP のセキュア版が FTPS

と覚えると良いだろう。

サンプルコード

FTP の SaaS である BrickFTP にアカウントを作った。

Net::FTP で接続可能。以下は FTPS 接続し、PWD を発行する Ruby コード。password はマスクしている。

#!/usr/bin/env ruby

require 'net/ftp'

ftps = Net::FTP.new(
  'masutaka.brickftp.com',
  ssl: true,
  username: '[email protected]',
  password: '********',
  debug_mode: true,
)

puts ftps.pwd

結果。

connect: masutaka.brickftp.com, 21
get: 220 Service ready for new user.
put: AUTH TLS
get: 234 Command AUTH okay; starting TLS connection.
put: PBSZ 0
get: 200 Command PBSZ okay.
put: PROT P
get: 200 Command PROT okay.
put: USER [email protected]
get: 331 User name okay, need password for [email protected].
put: PASS ********************************
get: 230 User logged in, proceed.
put: TYPE I
get: 200 Command TYPE okay.
put: PWD
get: 257 "/" is current directory.
/

ssl: true を外せば、FTP 接続になる。BrickFTP の管理画面から、SSL 必須という設定を OFF にする必要はある。

補足

Ruby-2.4.0 から Net::FTP.new で :ssl オプションがサポートされた。
当該 commit

Ruby-2.3 まではサポートされてなかったため、double-bag-ftps gem などを使う必要があったらしい。

:ssl オプションのパース処理はここ 。true の代わりにハッシュを渡せば、SSL 関連の任意のパラメータを設定可能。

SSLContext#set_params のマニュアル に利用可能なパラメータが書いてある。

関連