2017-11-21 8 views
1

Ich wurde beauftragt mit der Fähigkeit, Dateien über FTPS zu einer Website zu senden. Dies muss Teil meines Prozesses sein, der die zu sendenden Dateien generiert. Mir wurde ein Programm (CoreFTP) gegeben, das in der Lage ist, sich mit der Site zu verbinden, und ich kann Dateien sehen/schieben. Ich versuchte, die Befehlszeile zu CoreFTP über ein .Net-Beispielprogramm zu verwenden, das System.Diagnostics.Process verwendet und den Benutzer änderte, um der Benutzer zu sein, der das Zertifikat importierte) aber das funktionierte nicht (kein Fehler, aber keine Datei auf der Server), also versuche ich wieder, eine Verbindung mit .NET-Bibliotheken herzustellen.Upload Datei mit FTPS mit Client-Zertifikat in VB.NET

Die Probleme, mit denen ich konfrontiert bin, sind, dass die Verbindung mit der Website, ich muss mit AUTH TLS verbinden und es muss Windows TLS/SSL mit einem bestimmten Zertifikat verwenden.

Ich fand dieses Beispiel (https://www.limilabs.com/blog/use-ssl-with-ftp-explicit), die zumindest über die Verwendung von AuthTLS spricht, aber wenn ich das in meinem Projekt, heißt es FTP ist undefiniert. Ich habe versucht, die vorgeschlagenen Fixes, aber sie werden nur gebrochen (einschließlich einer Bibliothek und dann heißt es, dass ich Idisposable implementieren muss).

Ich fand eine andere Seite (https://support.microsoft.com/en-us/help/901183/how-to-call-a-web-service-by-using-a-client-certificate-for-authentica), die über das Erhalten eines bestimmten Zertifikats spricht, aber ich bin nicht sicher, wie man das mit FTP benutzt.

So sind meine Präferenzen für eine Lösung: 1. .NET-Lösung, die keine Third-Party-Bibliotheken verwendet. 2. .NET-Lösung mit Open-Source-Drittanbieter-Bibliotheken. 3. .NET-Lösung, wo ich die Befehlszeile verwenden kann, um die CoreFTP zu verwenden, wo ich die Befehlszeile unter einem anderen Benutzer ausführen als derjenige, der das Programm ausführt (das Zertifikat/CoreFTP-Profil ist benutzerspezifisch). 4. .NET-Lösung mit Bibliotheken, die ich bezahlen muss (wirklich hoffen, dass dieses nicht vorgeschlagen wird).

Dies ist (mehr oder weniger) der Code I CoreFTP von Kommandozeilenbefehle aus einem .net Programm auszuführen bin mit:

appname = "D:\Programs\coreftp.exe" 
args = " -s -O -site Server_QA -u \\machine\docs\test.txt -p/" + 
     "-output \\machine\docs\corelog1.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 
+0

* "Windows TLS/SSL mit einem bestimmten Zertifikat" * ist etwas vage. Bedeutet es ein Serverzertifikat oder ein Clientzertifikat? –

Antwort

0

Beispielcode:

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:\local\path\file.zip"), 
     ftpStream As Stream = request.GetRequestStream() 
    fileStream.CopyTo(ftpStream) 
End Using