料金を支払っているホストされたサーバーで動作するカスタム FTP クラスを実装しました。アプリケーションのバックアップ、復元、更新に FTP を使用しています。私は今、sslを有効にしてこれを本番環境に置きたいと思っています。ホスティング会社に ssl プロトコルをサポートしているかどうか尋ねたところ、サポートしているとのことでした。
そこで、Microsoft MSDN チュートリアルの後にメソッドを次のように変更しました。
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(m_ftpAddress.Trim()));
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(m_ftpUsername, m_ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(ValidateServerCertificate);
X509Certificate cert = new X509Certificate(path to a certificate created with makecert.exe);
reqFTP.ClientCertificates.Add(cert);
reqFTP.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested;
reqFTP.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Identification;
reqFTP.EnableSsl = true;
現在、MSDN は、サーバーが ssl プロトコルをサポートしている場合、AUTH TLS で要求されたときに例外をスローしないと述べています。これは、トレース ログで確認できます。したがって、サーバーの問題ではないと思います。
認証フェーズの後、サーバーは
System.Net 情報: 0 : [0216] FtpControlStream#41622463 - 受信した応答 [227 パッシブ モードに入る (IP とポート番号)]。
エラーを引き起こすメッセージ:
System.Net エラー: 0 : [0216] FtpWebRequest#12547953::GetResponse の例外 - リモート サーバーがエラーを返しました: 227 パッシブ モードに入る (IP とポート番号)。
を設定してみました
reqFTP.UsePassive = true;
プロパティを false にすると、次のエラーが発生します。
System.Net 情報: 0 : [2692] FtpControlStream#4878312 - 受信応答 [500 Illegal PORT コマンド]
もちろん、EnableSLL プロパティを true に設定しなくても、すべて問題なく動作します。
誰かこれについて何か考えがありますか?
編集:コードをfallowsとして変更しました:
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(m_ftpAddress.Trim()));
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(m_ftpUsername, m_ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
ServicePointManager.ServerCertificateValidationCallback = new
System.Net.Security.RemoteCertificateValidationCallback(ValidateServerCertificate);
reqFTP.ClientCertificates.Add(cert);
reqFTP.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested;
reqFTP.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Identification
reqFTP.EnableSsl = true;
はValidateServerCertificate
常にtrueを返します。この変更の後、効果はありません。
そして、私は理解していません:
- この時点で、アプリケーションはサーバー証明書を使用していますよね?
- そして、変更前は私のものも使用していましたか?
誰かがこれがどのように機能するかを説明できますか?
編集:ホスティング会社と何度もメールをやり取りした結果、FTP ソフトウェアに問題があり、コードには問題がないことが判明しました。