Search code examples
c#sslftpclient-certificatesftps

Is there a way to use FtpWebRequest to authenticate to FTP using client certificates in C#?


I am trying upload a file to a FTP server and I need to use client certificate to authenticate and not the username and password.

var fullFtpPath = String.Concat(ftpItem.FtpAddress, "/", record, ".txt");

FtpWebRequest request = (FtpWebRequest) WebRequest.Create(fullFtpPath);
request.Credentials = new NetworkCredential(ftpItem.Username, ftpItem.Password);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.UseBinary = true;
request.UsePassive = ftpItem.UsePassive;
request.EnableSsl = ftpItem.UseSSL;

request.ContentLength = bytes.Length;
using(Stream s = request.GetRequestStream()) {
    s.Write(bytes, 0, bytes.Length);
}

FtpWebResponse response = (FtpWebResponse) request.GetResponse();
Debug.WriteLine("Upload File Complete, status {0}", response.StatusDescription);

db.LogExport(siteId, fullFtpPath, record, true, response.StatusDescription);
response.Close();

Above is my current code, but I am not sure how to implement the certificate authentication or if it is even possible to do it. Do I have to create the certificate? Or the server will provide me a certificate and I will just set it in my request?


Solution

  • FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com");
    
    request.Credentials = new NetworkCredential("username", "");
    
    // Query certificate from store
    X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
    store.Open(OpenFlags.ReadOnly);
    const string tp = "2b6f8ac51a85cbaf429474a55304313968667611";
    X509Certificate2 cert2 =
        store.Certificates.Find(X509FindType.FindByThumbprint, tp, true)[0];
    store.Close();
    
    // Add certificate into request
    request.ClientCertificates.Add(cert2);