C# FTPS(SSL)的证书验证/安装?
我使用FileZilla作为服务器和DNS服务,这样我就不必使用我的本地机器IP(但我在这两个方面都尝试了以下方法) 在尝试System.Net.FtpWebRequest工作之后,我四处阅读了(包括一些关于SO的帖子),发现该库的SSL支持不是很充分。它使用的是常规FTP,但当我尝试强制SSL时,我收到一个证书验证错误,它说:C# FTPS(SSL)的证书验证/安装?,c#,ssl,ftp,filezilla,ftps,C#,Ssl,Ftp,Filezilla,Ftps,我使用FileZilla作为服务器和DNS服务,这样我就不必使用我的本地机器IP(但我在这两个方面都尝试了以下方法) 在尝试System.Net.FtpWebRequest工作之后,我四处阅读了(包括一些关于SO的帖子),发现该库的SSL支持不是很充分。它使用的是常规FTP,但当我尝试强制SSL时,我收到一个证书验证错误,它说:根据验证过程,远程证书无效。 所以,我在周围做了一些搜索,找到了Alex FTPS客户端库。以下是我编写的代码: class FTPSWorker {
根据验证过程,远程证书无效。
所以,我在周围做了一些搜索,找到了Alex FTPS客户端库。以下是我编写的代码:
class FTPSWorker
{
public static void UploadFile(string sourceFile, string targetFile, string ftpIP, string ftpUser, string ftpPass)
{
try
{
using (FTPSClient client = new FTPSClient())
{
client.Connect(ftpIP, new NetworkCredential(ftpUser, ftpPass),
ESSLSupportMode.CredentialsRequired | ESSLSupportMode.DataChannelRequested);
client.SetTransferMode(ETransferMode.Binary);
client.PutFile(sourceFile, targetFile);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
不幸的是,我得到了同样的证书错误。但是,使用FileZilla客户端,我可以很好地访问FTP服务器。所以,我想肯定会有证书问题
我应该注意,我的服务器显示了以下日志条目:
Welcome Message
AUTH TLS
234 Using authentication type TLS
SSL connection established
disconnected
客户端(C#WPF应用程序)收到此错误时:
The remote certificate is invalid according to the validation procedure.
如果我使用.NET库和MSDN代码,这是完全相同的错误
我做了更多的研究,找到了类似的解决方案:
但他们看起来像是危险的黑客。。。当它们工作时,除了它当前使用的基本是/否之外,还有什么方法可以显示认证信息并让用户验证/安装它吗
我现在的代码(我抛弃了Alex的库,回到默认的.NET):
因此,对于任何有相同问题的人,我最终只是给用户一个关于证书的警告,并根据我在原始帖子中提供的链接选择接受或拒绝。为了验证证书,它必须是真实的,而不是本地创建的。因此,这是目前唯一的解决办法。因此,对于任何有相同问题的人,我最终只是给用户一个关于证书的警告,并根据我在原始帖子中提供的链接选择接受或拒绝。为了验证证书,它必须是真实的,而不是本地创建的。因此,这是目前唯一的解决办法。如果您指定Alex ftps进行同样的证书验证,那么它将执行相同的验证。 在client.connect中,添加remotecertificatevalidationcallback以接受证书
client.Connect(ftpIP, new NetworkCredential(ftpUser, ftpPass),
ESSLSupportMode.CredentialsRequired | ESSLSupportMode.DataChannelRequested,
new RemoteCertificateValidationCallback(ValidateTestServerCertificate));
然后在下面
private static bool ValidateTestServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
// Accept any certificate
return true;
}
我想使用默认的.net。但我无法连接到使用隐式的服务器:(如果您指定,Alex ftps将执行相同的证书验证。 在client.connect中,添加remotecertificatevalidationcallback以接受证书
client.Connect(ftpIP, new NetworkCredential(ftpUser, ftpPass),
ESSLSupportMode.CredentialsRequired | ESSLSupportMode.DataChannelRequested,
new RemoteCertificateValidationCallback(ValidateTestServerCertificate));
然后在下面
private static bool ValidateTestServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
// Accept any certificate
return true;
}
我想使用默认的.net。但我无法连接到使用隐式的服务器:(是的,我没有说他的库不会这样做,只是我不需要它,因为.NET提供的库在那种特定情况下也以同样的方式工作。我在原始帖子中提供的链接与您提供的解决方案相同。我只是不喜欢它们,因为它们默默地接受了证书e、 显然,你仍然可以通知用户,但这只是额外的工作,有回调开始。无论哪种方式,你接受的是一个本地创建的证书,而不是一个实际签署的证书。使用他的库是一个较短的方法。是的,我没有说他的库不会这样做,只是我不需要它,因为NET提供的e库在这种特定情况下也以同样的方式工作。我在原始帖子中提供的链接与您提供的解决方案相同。我只是不喜欢它们,因为它们默默地接受了证书。显然,您仍然可以通知用户,但如果要回调到它,那只是额外的工作从开始。无论哪种方式,您都接受本地创建的证书,而不是实际签名的证书。不过,使用他的库是一种较短的方式。您的代码完全可以将证书呈现给用户检查,并且可能应该在val中返回给您的代码时显示证书验证的具体问题初始化回调。您的代码完全可以将证书呈现给用户进行检查,并且可能应该在验证回调中返回给您的代码时显示证书验证的具体问题。