问题描述
我需要将文件上传到具有自签名 SSL 证书的安全 FTP 服务器。
在哪里可以找到证书文件?
如何将其添加到 FtpWebRequest
中?
我知道文件在服务器上的位置。它是一个 .PEM
文件。服务器是将证书发送给客户端还是我需要将证书放在客户端应用程序中。
Dim request As FtpWebRequest = WebRequest.Create(FTP_Address)
request.Credentials = New NetworkCredential(FTP_Username,FTP_Password)
Dim cert As X509Certificate2 = ???
request.ClientCertificates.Add(cert)
request.EnableSsl = True
request.Method = WebRequestMethods.Ftp.UploadFile
解决方法
要验证证书,请实施 ServicePointManager.ServerCertificateValidation
callback 以根据已知值检查证书的哈希值:
Imports System.Net
Imports System.Net.Security
Imports System.Security.Cryptography
Imports System.Security.Cryptography.X509Certificates
ServicePointManager.ServerCertificateValidationCallback =
Function(sender As Object,certificate As X509Certificate,chain As X509Chain,errors As SslPolicyErrors)
Return _
(errors = SslPolicyErrors.None) Or
certificate.GetCertHashString(HashAlgorithmName.SHA256).Equals(
"EB8E0B28AE064ED58CBED9DAEB46CFEB3BD7ECA67737179E3C85BC3CD09D4EEC")
End Function
对于 X509Certificate.GetCertHashString
overload that takes HashAlgorithmName.SHA256
,您需要 .NET 4.8。在旧版本上使用 the parameter-less overload 返回一个 SHA-1 哈希值。
,
我想通了这是正确运行的代码
Private Shared Function ServerCertificateValidationCallback(sender As Object,sslPolicyErrors As SslPolicyErrors) As Boolean
Return certificate.GetCertHashString() <> "SHA-1 Key From Certificate"
End Function
Private Sub imgExpenseFileDrop_Drop(sender As Object,e As DragEventArgs)
ExpenseFilePath = e.Data.GetData(DataFormats.FileDrop)(0)
ExpenseFile = New FileInfo(ExpenseFilePath)
If String.IsNullOrWhiteSpace(ExpenseFile.Extension) Then Exit Sub
ShowFileInfo()
Try
System.Net.ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ServerCertificateValidationCallback)
Dim request As FtpWebRequest = WebRequest.Create(FTP_Address & ExpenseFile.Name)
request.Credentials = New NetworkCredential(FTP_Username,FTP_Password)
request.EnableSsl = True
request.Method = WebRequestMethods.Ftp.UploadFile
Using FileStream As Stream = File.OpenRead(ExpenseFile.FullName),ftpStream As Stream = request.GetRequestStream()
FileStream.CopyTo(ftpStream)
End Using
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub