Необработанное исключение: System.Security.Cryptography.CryptographicException: система не может найти указанный файл - PullRequest
0 голосов
/ 16 января 2019

У меня есть консольное приложение в C # 4.6.2 framework, которое связывается с REST-сервисом, используя RestSharp, чтобы получить некоторые данные, которые я затем ввожу в базу данных. Приложение передает сертификат для подтверждения моей личности. До недавнего времени это приложение работало замечательно, но недавно стало выдавать ошибки. Теперь это ошибка как на моей локальной машине, так и на сервере, на котором он обычно работает. Я предполагаю, что политика или что-то применено, но теперь я получаю сообщение об ошибке:

Unhandled Exception: System.Security.Cryptography.CryptographicException: The system cannot find the file specified.

   at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
   at System.Security.Cryptography.X509Certificates.X509Utils._QueryCertFileType(String fileName)
   at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags)
   at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password)
   at Feed_Exe.Program.Main(String[] args) in c:\Feed_Exe\Feed_Exe\Program.cs:line 106

В моем коде не так уж много, но вот что у меня есть и где оно терпит неудачу

        string NextLink = "https://RESTServiceURL";

        var request = new RestRequest { Method = Method.GET };
        var certFile = Path.Combine(@"C:\Feed_Exe\", "MyCert.pfx");
        var x509Cert = new X509Certificate2(certFile, "CertPassword");
        //The above line is where it errors

        while (!string.IsNullOrWhiteSpace(NextLink))
        {
            var client = new RestClient
            {
                BaseUrl = new Uri(NextLink),
                UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
                ClientCertificates = new X509CertificateCollection()
                {
                    x509Cert
                }
            };

            var response = client.Execute(request);

            if (response.ErrorException == null)
            {
              //Here is where I process the data I got from the service
            }
        }

Во-первых, сертификат существует по указанному выше пути. Я также экспортировал этот сертификат и включил закрытый ключ и корневую цепочку. Пароль к сертификату также правильный.

Раньше мне не нужно было устанавливать сертификат на машину, чтобы заставить его работать, поскольку мне не разрешено устанавливать сертификаты на машину, на которой он обычно работает. Я попытался установить его на свой локальный компьютер (как локальный компьютер, так и текущий пользовательский магазин), который не помог.

Исследуя это, я попробовал несколько вещей. Один поток предложил включить

        System.Security.Cryptography.RSACryptoServiceProvider.UseMachineKeyStore = true;
        System.Security.Cryptography.DSACryptoServiceProvider.UseMachineKeyStore = true;

Что не помогло. Я также видел предложение:

        var x509Cert = new X509Certificate2(certFile, "CertPassword.", X509KeyStorageFlags.DefaultKeySet);

что тоже не помогло. Я также видел некоторые предложения по изменению некоторых настроек IIS, которые я могу сделать локально, но не на сервере.

Есть предложения?

...