如何将文件上传到在 Visual Basic 中使用自签名证书的安全 FTP 服务器?

问题描述

我需要将文件上传到具有自签名 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

The Code With The Error

解决方法

要验证证书,请实施 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 哈希值。


基于Is it safe to test the X509Certificate.Thumbprint property when you know an invalid certificate is safe?

,

我想通了这是正确运行的代码

    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