2017-11-21 392 views
1

私は、FTPS経由でサイトにファイルを送信できることが任されています。これは送信するファイルを生成するプロセスの一部である必要があります。私はサイトに接続できるプログラム(CoreFTP)が与えられていて、ファイルを見る/見ることができます。私はCoreFTPにCoreFTPにSystem.Diagnostics.Processを使って.Netサンプルプログラムを使ってコマンドラインを使用しようとしましたが、証明書がインポートされたユーザーになるようにユーザーを変更しましたが動作しませんでした。サーバー)、私はそれに.NETライブラリで接続しようとしています。VB.NETのクライアント証明書を使用してFTPSでファイルをアップロード

私が直面している問題は、サイトに接続するにはAUTH TLSに接続する必要があり、Windows TLS/SSLを特定の証明書で使用する必要があるということです。

私はAuthTLSの使用について少なくとも語っているこの例()を見つけましたが、それを私のプロジェクトに入れてみると、FTPは定義されていません。私は提案された修正を試みましたが、それらは壊れてしまいました(ライブラリを含めて、私はidisposableを実装する必要があると言います)。

特定の証明書を取得するための別のサイト(https://support.microsoft.com/en-us/help/901183/how-to-call-a-web-service-by-using-a-client-certificate-for-authentica)が見つかりましたが、FTPでどのように使用するかはわかりません。

したがって、私のソリューションの環境設定は次のとおりです。 1.サードパーティのライブラリを使用しない.NETソリューション。 2.オープンソースのサードパーティライブラリを使用した.NETソリューション。 3. .NETソリューションでは、コマンドラインを使ってCoreFTPを使用できます。ここでは、プログラムを実行しているユーザーとは別のユーザーでコマンドラインを実行します(証明書/ CoreFTPプロファイルはユーザー固有のものです)。 4.ライブラリーを使用した.NETソリューション(私が支払う必要があるライブラリーを使用してください。

これは、私は、コマンドラインでCoreFTPを実行するために使用していたコードは、.NETプログラム内からのコマンド(多かれ少なかれ)である:

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" *をあります少し曖昧。サーバー証明書またはクライアント証明書を意味しますか? –

答えて

0

サンプルコードを参照してください。

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 
関連する問題