19

FTP サイトを介してファイルを同期するアプリケーションを作成しています。現在は通常の FTP 経由で接続して動作していますが、IT 担当者は安全な FTPS 接続を介してこれをセットアップしたいと考えています。

彼らは私に *.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 に設定したいと思います。しかし、この証明書ファイルがどこで機能するのかわかりません。

4

2 に答える 2

27

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 プロパティで使用する独自の証明書検証コールバック メソッドを実装する必要がある場合があります。これは、常に true を返すように単純にすることも、デバッグに使用するようなより洗練されたものにすることもできます。

    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;
    }
于 2012-12-04T17:56:56.270 に答える
1

この記事では、ソース コードを使用してその方法を説明します。

この記事の目的は、セキュア モードで C# FTP クライアントを作成することです。そのため、FTPS に関する知識があまりない場合は、FTPS を参照することをお勧めします。

.NET Framework では、FTPS モードでファイルをアップロードするには、通常は FtpWebRequest クラスを使用しますが、引用符付きのコマンドを送信することはできず、Web で検索しても具体的なセキュアな例は見つかりません。 C# FTP クライアント。

以上の理由から、この記事を作成することにしました。

于 2009-10-08T00:23:19.807 に答える