まずは情報の整理から。
種類 | 暗号化なし | 暗号化あり |
---|---|---|
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 のマニュアル に利用可能なパラメータが書いてある。