2009-10-08 19 views
11

FTPサイトでファイルを同期するアプリケーションを作成しています。今は通常のFTPを使って接続していますが、ITスタッフは安全なFTPS接続でこれを設定したいと考えています。C#.Netを使用してFTPS(SSL/TLS)でファイルを転送する

* .cr_証明書ファイルを提供しました。メモ帳でファイルを開くと、このようなものが表示されます(実際のキーは明らかに偽装されていません)。

-----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モードでファイルをアップロードするには、一般的にFtpWebRequestクラスを使用しますが、引用引数を指定してコマンドを送信することはできません。また、Webで検索しても、保護されたC#FTPクライアントの例

私はこの記事を作成することにしました。

+0

私はその記事とソースコードのコピーを見ています。しかし、私はこの証明書ファイルにどこに追加するのか分かりません。 –

+0

ありがとうエリックJ、私はactaully元のポスターと同じ質問をして、それは私が使用しているコード(リンクしているもの)....まだそのコードに私の "ホストキー"を渡す方法を把握しようとしている。 – 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

関連する問題