我的任务是能够通过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