1

以下のように ftpwebrequest で SSL を使用しようとしていました

  FileStream outputStream = new FileStream(fileName, FileMode.Append);
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpserverIp + "/" + file));
           reqFTP.EnableSsl = true;
            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
            reqFTP.UseBinary = true;
            reqFTP.KeepAlive = false;
            reqFTP.Timeout = -1;
            reqFTP.UsePassive = true;
            reqFTP.Credentials = new NetworkCredential("sh", "SE");
            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
            Stream ftpStream = response.GetResponseStream();
            long cl = response.ContentLength;
            // reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
            int bufferSize = 4096;
            int readCount;
            byte[] buffer = new byte[bufferSize];
            readCount = ftpStream.Read(buffer, 0, bufferSize);
            Console.WriteLine("Connected: Downloading File");
            while (readCount > 0)
            {
                outputStream.Write(buffer, 0, readCount);
                readCount = ftpStream.Read(buffer, 0, bufferSize);
                //Console.WriteLine(readCount.ToString());
            }

            ftpStream.Close();
            outputStream.Close();
            response.Close();

以下の例外があります。

検証手順によると、リモート証明書は無効です。

私のグーグルに基づいて、証明書の秘密鍵部分を削除し、今すぐ処理を開始します

431 SSL 接続を初期化できませんでした

私はグーグルを試しましたが、これまでのところ結果はありません。

FileZilla に接続しようとしています。

4

3 に答える 3

1

答えは簡単で、FtpWebRequest は FTPS を十分にサポートしていません。

http://ftps.codeplex.com/から引用

.Net Framework によって提供される System.Net.FTPWebRequest クラスは、単純なタスク (ファイルのダウンロードまたはアップロード、ディレクトリ リストの取得など) に最適で、EnableSsl プロパティを介して SSL もサポートします。 com/adarshk/archive/2005/04/22/410925.aspx . では、なぜそのための新しいクラスが必要なのですか?

ポイントは、FTP での SSL サポートは、(HTTP/HTTPS のように) オン/オフ スイッチ以上のものであるということです。FTP には 2 つの別個の接続が必要です。1 つはコマンド用 (制御接続) で、もう 1 つはデータ用 (データ接続) で、ダウンロード、アップロード、およびディレクトリ リスト用です。FTPWebRequest.EnableSsl は単純に両方で SSL の使用を強制します。問題は、これが常に適切であるとは限らないことです。

Microsoft は、Windows Server 2008 以降に FTP 7.5 を提供する場合にのみ、サーバー側で FTPS のサポートを開始します。現在のところ、Internet Explorer や Windows Explorer で FTPS をサポートしていません。.NET Framework BCL が FTPS をサポートしていないのも不思議ではありません。

于 2012-02-22T02:37:05.913 に答える
0

欠けているステップは、証明書検証のポリシーを確立することです。

これは、次のコードで行われます。

public static bool ValidateCertificate(object sender,
                       X509Certificate certificate, X509Chain chain,
                       SslPolicyErrors sslPolicyErrors) {
   /**
    * validation steps for the certificate go here
    * if you want them, but it may be expedient to 
    * just accept whatever the FTP server gave you.
    * The channel will be encrypted regardless of
    * how trusted the certificate is.
    */
    return true;
}

次に、証明書チェックを取得したときにヒットするように上記のメソッドを設定します。

ServicePointManager.ServerCertificateValidationCallback = 
    new RemoteCertificateValidationCallback(ValidateCertificate);

与えられた例は.NET 3.5で機能します。現在受け入れられている回答の時点で、このセットアップが不可能であるという声明はすでに間違っていました。

于 2014-01-13T20:37:51.317 に答える
0

このコード セグメントでnew Uri("ftp://" + ftpserverIp + "/" + file)は、「ftp」で示される非 SSL ftp サーバーに接続しようとしています。「ftp://」を「ftps://」に変更すると解決するはずです (サーバーが SSL をサポートしていると仮定します)。

于 2012-02-22T00:29:07.407 に答える