使用vb.net中的客户端证书上传FTP上传文件



我的任务是能够通过FTP将文件发送到站点。这需要成为我正在生成要发送的文件的过程的一部分。我获得了一个能够连接到网站的程序(CoreFTP),我可以看到/推出文件。我尝试使用system.diarostics.diarostics.process和将用户更改为以下证书的用户),尝试通过.NET示例程序将命令行通过.NET示例程序进行CoreFTP,但该用户不起作用(没有错误,但没有文件服务器),所以我回到尝试与.NET库连接到它。

我面临的问题是要连接到网站,我必须与AUTH TLS连接,并且需要使用Windows TLS/SSL与特定证书进行连接。

我找到了这个示例(https://www.limilabs.com/blog/use-ssl-with-ftp- explitic)至少要谈论使用authtls,但是当我将其放在项目中时,它说FTP是不明确的。我尝试了建议的修复程序,但最终只是被打破(包括库,然后说我需要实现IDISPOSABLE)。

我找到了另一个网站(https://support.microsoft.com/en-us/help/901183/how-to-cal-call-a-a-web-service-by-by-ser-by-using-a-c- using-a-client-client-client-certificate-for-Authentica)谈论获得特定证书,但我不确定如何将其与ftp一起使用。

所以,我对解决方案的偏好是:1. .NET解决方案不使用第三方库。2.使用开源第三方库的NET解决方案。3. .NET解决方案我可以使命令行工作以使用CoreFTP,在该解决方案中,我在与运行程序的用户下运行命令行(原因是CERTIFER/COREFTP配置文件是用户特定的)。4. .NET解决方案使用我必须支付的库(真的希望这是不建议的)。

这是(或多或少)我使用的代码从.NET程序中通过命令行命令运行CoreFTP:

appname = "D:Programscoreftp.exe"
args = " -s -O -site Server_QA -u \machinedocstest.txt -p / " +
       "-output \machinedocscorelog1.txt"
standOut = String.Empty
AddHandler objProcess.OutputDataReceived, AddressOf process_OutputDataReceived
' Start the Command and redirect the output
objProcess.StartInfo.UseShellExecute = False
objProcess.StartInfo.RedirectStandardOutput = True
objProcess.StartInfo.CreateNoWindow = True
objProcess.StartInfo.RedirectStandardError = True
objProcess.StartInfo.Domain = "mydomain"
objProcess.StartInfo.UserName = "administrator"
objProcess.StartInfo.Password = New System.Security.SecureString
For Each chr As Char In pwd.ToCharArray()
    objProcess.StartInfo.Password.AppendChar(chr)
Next
objProcess.StartInfo.FileName() = AppName
If args.Length > 0 Then
    objProcess.StartInfo.Arguments() = args
End If
objProcess.Start()
objProcess.BeginOutputReadLine()
objProcess.WaitForExit()  'Set to run for 20 minutes
If objProcess.HasExited() Then
    'strOutput = objProcess.StandardOutput.ReadToEnd()
    strOutput = standOut
    strError = objProcess.StandardError.ReadToEnd()
    If strOutput IsNot Nothing AndAlso strOutput.Length > 0 Then
        PersonalDetailLog(strOutput)
    End If
    If strError IsNot Nothing AndAlso strError.Length > 0 Then
        Throw New ApplicationException(strError)
    End If
Else
    PersonalDetailLog(
        "The " + AppName + " Process has exceeded the 20 minute time out " +
        "is is being closed")
    If objProcess.Responding Then
        objProcess.CloseMainWindow()
        If Not objProcess.HasExited() Then
            objProcess.Kill()
        End If
    Else
        objProcess.Kill()
    End If
    Throw New ApplicationException("" + AppName + " Process Time Limit Exceeded.")
End If
  • 上传文件使用FtpWebRequest(或WebClient)。使用vb.net。
  • 要使用TLS/SSL,设置FtpWebRequest.EnableSsl
  • 要使用客户端证书,请参阅使用FTPWebRequest的一种方法来使用C#?
  • 中的客户端证书对FTP进行身份验证

示例代码:

Dim request As FtpWebRequest = WebRequest.Create("ftp://ftp.example.com")
request.Credentials = New NetworkCredential("username", "")
' Query certificate from store
Dim store As X509Store = New X509Store(StoreName.My, StoreLocation.CurrentUser)
store.Open(OpenFlags.ReadOnly)
Const tp = "2b6f8ac51a85cbaf429474a55304313968667611"
Dim cert As X509Certificate2 =
    store.Certificates.Find(X509FindType.FindByThumbprint, tp, True)(0)
store.Close()
' Add certificate into request
request.ClientCertificates.Add(cert)
request.EnableSsl = True
' Upload
request.Method = WebRequestMethods.Ftp.UploadFile
Using fileStream As Stream = File.OpenRead("C:localpathfile.zip"),
      ftpStream As Stream = request.GetRequestStream()
    fileStream.CopyTo(ftpStream)
End Using

最新更新