У меня есть консольное приложение в 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, которые я могу сделать локально, но не на сервере.
Есть предложения?