0

問題を再現するために C# コンソール アプリを使用しています。これは.NET Framework 4.7アプリです。FluentFTPのバージョンは 24.0.0で、Nuget パッケージとしてインストールされます。

これは私のコードです:

using FluentFTP;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace FTP_Test
{
    class Program
    {
        private static string host = "<my host>";
        private static string username = "<my username>";
        private static string pass = "<my pass>";
        private static int port = 990;

        static void Main(string[] args)
        {
            FtpClient ftpClient = new FtpClient(host, port, username, pass);

            ftpClient.DataConnectionType = FtpDataConnectionType.EPSV;
            ftpClient.EncryptionMode = FtpEncryptionMode.Implicit;

            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

                        ftpClient.DataConnectionEncryption = true;
            ftpClient.ValidateCertificate += new FtpSslValidation(OnValidateCertificate);
            var cer = new System.Security.Cryptography.X509Certificates.X509Certificate2();
            ftpClient.ClientCertificates.Add(cer);
            ServicePointManager.ServerCertificateValidationCallback = ServerCertificateValidationCallback;

            ftpClient.Connect();
        }

        private static void OnValidateCertificate(FtpClient control, FtpSslValidationEventArgs e)
        {
            // add logic to test if certificate is valid here
            e.Accept = true;
        }
        private static bool ServerCertificateValidationCallback(object sender,
                                                System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                                                System.Security.Cryptography.X509Certificates.X509Chain chain,
                                                System.Net.Security.SslPolicyErrors sslPolicyErrors)
        {
            return true;
        }
    }
}

コンソールに表示されるエラー (およびスタック トレース):

Unhandled Exception: System.IO.IOException: Authentication failed because the remote party has closed the transport stream.
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
   at System.Net.Security.SslStream.AuthenticateAsClient(String targetHost, X509CertificateCollection clientCertificates, SslProtocols enabledSslProtocols, Boolean checkCertificateRevocation)
   at FluentFTP.FtpSocketStream.ActivateEncryption(String targethost, X509CertificateCollection clientCerts, SslProtocols sslProtocols)
   at FluentFTP.FtpClient.Connect()
   at FTP_Test.Program.Main(String[] args) in C:\Users\Nemanja\source\repos\FTP Test\Program.cs:line 35

ここで何が欠けていますか?

同じホスト/ユーザー/パスのセットを使用して、Filezilla 経由で接続できます。Filezilla では、次のように設定する必要があります。

  • 暗号化: 暗黙の FTP over TLS を要求する ([一般] タブで)
  • 転送モード: パッシブ (「転送設定」タブ内)

アプリをデバッグ モードで実行し、関数 OnValidateCertificate および ServerCertificateValidationCallback 内にブレークポイントを設定すると、それらのブレークポイントにヒットしません。

4

1 に答える 1