web-dev-qa-db-ja.com

.NET FtpWebRequestは暗黙的(FTPS)と明示的(FTPES)の両方をサポートしていますか?

暗黙的および明示的FTPS(別名FTPES)をサポートするように求められています。現在.NET FtpWebRequestを使用しています。 FtpWebRequestは両方のタイプのFTPESをサポートしますか、そして違いは何ですか?

ありがとう

27
PortageMonkey

私が知る限り、FtpWebRequestの現在の(.NET 2.0および3.5)バージョンは、明示的なSSLのみをサポートしています。

実際、.NET 2.0は現在、暗黙的なSSLをサポートしておらず、明示的なSSLのみをサポートしています。今後のリリースでこれを追加することを検討します。

JonCole-MSFTModerator MSDNフォーラムの投稿

ImplictとExplicit TLS/SSLの両方を使用する必要がある場合は、サードパーティのFTP/SSLコンポーネントのいずれかを試す必要があります。以下のコードは Rebex FTP/SSL を使用しており、 チュートリアルページ から取得しています。

明示的なTLS/SSL

クライアントは通常の保護されていない方法でFTPサーバーに接続します。通常、ポート21がFTPプロトコルに割り当てられていました。 SSLを使用して接続を保護する必要がある場合、SSLネゴシエーションが初期化され、制御接続が保護され、以降のすべての通信が保護されます。

// Create an instance of the Ftp class. 
Ftp ftp = new Ftp();

// Connect securely using explicit SSL. 
// Use the third argument to specify additional SSL parameters. 
ftp.Connect(hostname, 21, null, FtpSecurity.Explicit);

// Connection is protected now, we can log in safely. 
ftp.Login(username, password);

明示的な保護とは、いつでも接続を保護できることを意味します。接続時に保護を必要とするかどうかわからない場合は、通常の暗号化されていないFTPプロトコルを使用して接続し、後で接続を保護することができます。

Ftp ftp = new Ftp();

// Connect to the server with no protection. 
ftp.Connect(hostname, 21);

// Upgrade connection to SSL. 
// This method also accepts an argument to specify SSL parameters. 
ftp.Secure();

// Connection is protected now, we can log in safely. 
ftp.Login(username, password);

FTPセッションの暗黙のSSL保護

FTPSプロトコルは元々、IANAによって別のポートが割り当てられていました。このポートに接続すると、SSLネゴシエーションがすぐに開始され、制御接続が保護されます。すべてのデータ接続も、同じ方法で暗黙的に保護されます。これはHTTPSで使用されるアプローチに似ています。

このアプローチは、IETFによって支持されておらず、非推奨です。古いサーバーとの相互運用性のためにRebex FTP/SSLでサポートされていますが、可能な限り明示的な保護を使用することを強くお勧めします。

Ftp ftp = new Ftp();

// Connect securely using implicit SSL. 
// Use the third argument to specify additional SSL parameters. 
ftp.Connect(hostname, 990, null, FtpSecurity.Implicit);

// Connection is protected now, we can log in safely. 
ftp.Login(username, password);

コンポーネントは rebex.net/ftp-ssl.net/ からダウンロードできます。

17
Martin Vobr

以前にAlex FTPSクライアントを使用しました。 http://ftps.codeplex.com/ を参照してください。

13
user263369

.NET Framework/FtpWebRequest明示的なTLS/SSL暗号化 のみをサポートします。暗黙のTLS/SSL暗号化はサポートしていません。

私はそれが今までそうすることはありそうもないと信じています。 .NETフレームワークのFTP実装は、プロトコルの標準化された機能のみを使用します。暗黙のTLS/SSL暗号化は決して標準化されていません。これは、暗号化をサポートしていないFTPクライアントでシームレスな暗号化を使用できるようにする一時的なメカニズムとしてのみ導入されました。一般に、暗黙のTLS/SSL暗号化を使用する理由はありません。暗黙のTLS/SSL暗号化のみをサポートするFTPサーバーは壊れています、imo。 RFC 2228 [FTP Security Extensions] は20年以上前に導入されました。


とにかく、暗黙のTLS/SSL暗号化を使用する必要がある場合は、サードパーティのFTPライブラリを使用する必要があります。

WinSCP .NET Assembly を使用すると、簡単です。

// Set up session options
SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Ftp,
    UserName = "username",
    Password = "password",
    FtpSecure = FtpSecure.Implicit,
};

using (Session session = new Session())
{
    // Connect
    session.Open(sessionOptions);

    // Your code
}

上記のように、 WinSCP GUIがC#FTPコードテンプレートを生成する を使用できます。

(WinSCPの作成者です)

5
Martin Prikryl

Ftp.dll FTP/FTPS client を試すこともできます。

implicitおよびexplicitSSL接続をサポートします。これが暗黙のサンプルです:

using(Ftp ftp = new Ftp())
{
    ftp.ConnectSSL("ftp.server.com");

    ftp.Login("user", "password");

    ftp.ChangeFolder("uploads");
    ftp.UploadFile("report.txt", @"c:\report.txt");

    ftp.Close();
}

これは商用製品であり、私はこのコンポーネントの作成者です。

1

edtFTPnet/PRO は、FTPS暗黙モードと明示モードもサポートするFTPクライアントライブラリです。正しいプロトコルを指定するだけです。

 SecureFTPConnection conn = new SecureFTPConnection();
 conn.Protocol = FileTransferProtocol.FTPSImplicit;

 // set remote Host, user, pwd etc ...

 // now connect
 conn.Connect();

同じコンポーネントがSFTPもサポートします。

そして、はい、私はこのコンポーネント(および edtFTPnet 、無料のオープンソース.NET FTPクライアント)の開発者の1人です。

0
Bruce Blackshaw