FtpWebRequest Удаленный сертификат недействителен в соответствии с процедурой проверки

У меня есть клиентское приложение .NET, которое пытается выполнить ftp через файл на ftp-сайт с самоподписанным сертификатом SSL. Этот ftp-сайт работает на Windows 7 Enterprise, IIS 7. Я получаю следующую ошибку: «Удаленный сертификат недействителен в соответствии с процедурой проверки».

Я попытался установить сертификат в доверенные корневые сертификаты, но это все равно не работает.

Я использовал обратный вызов делегата в коде, который упоминается в некоторых сообщениях здесь - он работает. Но я не хочу использовать это в своем производственном коде.

Также в производстве некоторые из наших клиентов используют самоподписанные сертификаты.

Любые идеи о том, как решить эту проблему?


person John Smith    schedule 20.07.2012    source источник


Ответы (4)


Вы должны перезаписать проверки сертификата, чтобы они всегда считались хорошими. Это не помешает каналу оставаться защищенным SSL.

Uri target = new Uri("ftp://yourUri");
string fileName = @"fullPathOfYourFile";
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(target);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential("user", "password");
request.EnableSsl = true;

//overwrite the certificate checks
ServicePointManager.ServerCertificateValidationCallback = 
                      (s, certificate, chain, sslPolicyErrors) => true;

// Copy the contents of the file to the request stream
//....
person Luca Quaglia    schedule 11.05.2018
comment
Хотя это работает, это небезопасно. Вы должны проверить сертификат, а не принимать его слепо. Чтобы узнать, как проверить сертификат, см. мой ответ. - person Martin Prikryl; 24.03.2021

Вы также получаете эту ошибку, если пытаетесь подключиться к IP-адресу вместо доменного имени. Поскольку сертификат выдается на доменное имя, IP-адрес работать не будет.

person Ergec    schedule 05.12.2017

Ответ @Luca с наибольшим количеством голосов слепо принимает любой сертификат. Это недостаток безопасности.

При реализации ServicePointManager.ServerCertificateValidation обратного вызова следует подтвердить сертификат. Например. путем проверки хэша сертификата на известное значение:

using System.Net;
using System.Net.Security;
using System.Security.Cryptography;
ServicePointManager.ServerCertificateValidationCallback +=
    (sender, certificate, chain, errors) =>
    {
        return
            (errors == SslPolicyErrors.None) ||
            certificate.GetCertHashString(HashAlgorithmName.SHA256).Equals(
                "EB8E0B28AE064ED58CBED9DAEB46CFEB3BD7ECA677...");
    };

Для перегрузки HashAlgorithmName.SHA256 вам потребуется .NET 4.8. В более старых версиях используйте параметр , которая возвращает хэш SHA-1.


На основе безопасно ли тестировать свойство X509Certificate.Thumbprint, когда известно, что недействительный сертификат безопасен?

Версию кода для VB.NET см. в разделе Принимать самоподписанный сертификат TLS/SSL в VB.NET.

person Martin Prikryl    schedule 24.03.2021

У меня была такая же проблема через .NET, и моя учетная запись и даже локальная учетная запись доверяли корневому сертификату и цепочке. Так что сертификат был золотым.

Для меня я использовал неправильное имя хоста. Я использовал полное имя (и попадал в нужное место), но на самом деле сертификат был выдан другому псевдониму. Поэтому убедитесь, что имя вашего сервера точно совпадает с тем, что указано в сертификате.

Прочтите эту статью, вот как я нашел ответ... Возможно, подписка на мероприятие - это то, что вам нужно...

http://www.limilabs.com/blog/the-remote-certificate-is-invalid-according-to-the-validation-procedure

person Matt    schedule 21.03.2013
comment
Оказалось у меня похожая проблема. FtpWebRequest использовал IP-адрес (1.2.3.4), и, конечно же, сертификат был подстановочным знаком, выданным доменному имени (*.example.com). Как только я переключился на использование доменного имени в своей FtpWebSession, эта ошибка исчезла. - person Rich; 13.05.2015