2009-10-08 7 views
11

FTP 사이트를 통해 파일을 동기화하는 응용 프로그램을 작성하고 있습니다. 현재는 일반 FTP를 통해 연결되지만 현재는 IT 담당자가 안전한 FTPS 연결을 통해이를 설정하려고합니다.C# .Net을 사용하여 FTPS (SSL/TLS)를 통해 파일 전송

그들은 * .cr_ 인증서 파일을 제공했습니다. 메모장에서 파일을 열면이 같은 것을 볼 수 있습니다 (그러나 실제 키는 분명히 foobar가 아닙니다).

-----BEGIN RSA PRIVATE 
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR 
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
-----END RSA PRIVATE KEY----- 
-----BEGIN CERTIFICATE----- 
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR  
-----END CERTIFICATE----- 

이 인증서 파일을 사용하여 파일을 업로드 및 다운로드하려면 FTPS 서버에 어떻게 연결할 수 있습니까? 용서해주세요.하지만 저는 네트워크, 파일 연결, 인증서, 공개 키, 개인 키 등을 통해 파일을 전송하는 일에 매우 익숙합니다.

FtpWebRequest를 사용하고 싶습니다. 개체를 만들고 EnableSsl 속성을 true로 설정합니다. 그러나이 인증서 파일이 어디서 재생되는지 확실하지 않습니다.

답변

2

This article은 소스 코드를 사용하여이를 수행하는 방법을 설명합니다.

이 문서의 목적은 보안 모드에서 C# FTP 클라이언트를 만드는 것이므로 FTPS에 대해 많이 알지 못하는 경우 FTPS를 살펴 보시기 바랍니다.

.NET Framework에서 FTPS 모드로 파일을 업로드하려면 일반적으로 FtpWebRequest 클래스를 사용하지만 견적 인수가 포함 된 명령을 보낼 수 없으며 웹에서 검색하더라도 구체적인 내용을 찾을 수 없습니다 보호 된 C# FTP 클라이언트의 예입니다.

이 기사를 작성한 이유가 여기에 있습니다.

+0

나는이 기사와 소스 코드 사본을보고 있습니다. 하지만이 인증서 파일에 어디에서 추가 할 것인지 알 수 없습니다. –

+0

감사합니다. Eric J, 저는 원래 포스터와 같은 질문을하고 있습니다. 그 코드는 제가 사용하고있는 코드입니다. (링크 된 것) .... "호스트 키"를 코드에 전달하는 방법을 알아 내려고합니다. – ganders

17

FtpWebRequest Class을 사용중인 경우 요청 설정에 몇 가지 사항을 추가하기 만하면됩니다. using System.Security.Cryptography.X509Certificates; 문을 포함해야합니다. 또한

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpUrl); 
    request.Credentials = new NetworkCredential(userName, password); 

    request.EnableSsl = true; 
    //ServicePointManager.ServerCertificateValidationCallback = ServicePointManager_ServerCertificateValidationCallback; 

    X509Certificate cert = X509Certificate.CreateFromCertFile(@"C:\MyCertDir\MyCertFile.cer"); 
    X509CertificateCollection certCollection = new X509CertificateCollection(); 
    certCollection.Add(cert); 

    request.ClientCertificates = certCollection; 

, 당신은 당신이 ServicePointManager.ServerCertificateValidationCallback Property 사용하기 위해 자신의 인증서 유효성 검사 콜백 메소드를 구현해야 할 수 있습니다 인증서 생성 예외에 문제가있는 경우. 디버깅을 위해 사용하는 것과 같이 항상 진실을 반환하거나보다 정교 해지는 것처럼 간단 할 수 있습니다.

public static bool ServicePointManager_ServerCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
    { 
     bool allowCertificate = true; 

     if (sslPolicyErrors != SslPolicyErrors.None) 
     { 
      Console.WriteLine("Accepting the certificate with errors:"); 
      if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateNameMismatch) == SslPolicyErrors.RemoteCertificateNameMismatch) 
      { 
       Console.WriteLine("\tThe certificate subject {0} does not match.", certificate.Subject); 
      } 

      if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateChainErrors) == SslPolicyErrors.RemoteCertificateChainErrors) 
      { 
       Console.WriteLine("\tThe certificate chain has the following errors:"); 
       foreach (X509ChainStatus chainStatus in chain.ChainStatus) 
       { 
        Console.WriteLine("\t\t{0}", chainStatus.StatusInformation); 

        if (chainStatus.Status == X509ChainStatusFlags.Revoked) 
        { 
         allowCertificate = false; 
        } 
       } 
      } 

      if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateNotAvailable) == SslPolicyErrors.RemoteCertificateNotAvailable) 
      { 
       Console.WriteLine("No certificate available."); 
       allowCertificate = false; 
      } 

      Console.WriteLine(); 
     } 

     return allowCertificate; 
    } 
+0

이 부분에 대해 설명해 주시겠습니까? "X509Certificate cert = X509Certificate.CreateFromCertFile (@"C : \ MyCertDir \ MyCertFile.cer ");" FTPS에 액세스하려면 로컬로 인증서가 필요합니까? – Reynan

+0

@Reynan OP 질문은 발급되어 파일에 저장된 인증서를 사용하여 FTPS 서버에 클라이언트 애플리케이션을 인증하는 방법이었습니다. 사용자 이름과 암호를 통해 사용자를 인증하는 FTPS의 경우에는 필요하지 않습니다. 귀하의 목적을 위해 http://stackoverflow.com/questions/9099738/upload-file-to-secured-ftp-in-asp-net을 참조하십시오. – JamieSee

관련 문제