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
* "Windows TLS/SSL mit einem bestimmten Zertifikat" * ist etwas vage. Bedeutet es ein Serverzertifikat oder ein Clientzertifikat? –