Ошибка X509Certificate2 - система не может найти указанный файл

Связанный код хорошо работает в независимом консольном приложении, в то время как ошибки устраняются при попытке заставить его работать в архитектуре NSB. Я попытался протестировать то же самое внутри рабочего, а также независимо в тестовом консольном приложении. В любом случае это ошибка в строке - X509Certificate2 certificate = new X509Certificate2 (filePath, «*** key *** UeUHFxS»); Сообщение об исключении - System.Security.Cryptography.CryptographicException: «Система не может найти указанный файл. Код состоит из показанного кода и связанного вспомогательного файла для устройства Activate. Однако исключение составляет раздел для инициализации X509Certificate2 из пути и ключа файла pfx.

class Program
{
    static void Main(string[] args)
    {
        try
        {
            string filePath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);
            filePath = Directory.GetParent(Directory.GetParent(filePath).FullName).FullName;
            filePath = Path.Combine(filePath, @"Cert\TestCompany-qa.partner.client.siriusxm.com.pfx");

            X509Certificate2 certificate = new X509Certificate2(filePath, "****key****");
            SoapMessageHelper soapHelper = new SoapMessageHelper(certificate, @"https://api-ext-test.siriusxm.com/SAT/UpdateDeviceSatRefresh/v_1");
            var test = soapHelper.ActivateDevice(new ActivateDeviceRequest()
            {
                SourceName = "12493",
                ESN = "W26890HW",
                TimeStamp = DateTime.UtcNow,
                TrasanctionId = System.Guid.NewGuid().ToString()
            });

            XmlDocument doc = new XmlDocument();
            doc.LoadXml(test);

            foreach (XmlNode node in doc.DocumentElement.ChildNodes)
            {
                foreach (XmlNode locNode in node)
                {
                    if (locNode.Name == "ns0:responseRefreshDevice")
                    {
                        string resultCode = locNode["ns0:resultCode"].InnerText;
                        string errorCode = locNode["ns0:errorCode"].InnerText;
                        string errorMessage = locNode["ns0:errorMessage"].InnerText;
                        Console.WriteLine(resultCode + errorCode + errorMessage);
                    }
                }
            }

        }
        catch (Exception ex)
        {
            Console.WriteLine(
                String.Format("Exception occurred{0}Message:{1}{2}Inner Exception: {3}", Environment.NewLine, ex.Message, Environment.NewLine, ex.InnerException));
        }

    }

}

person Rakesh Kumar    schedule 24.07.2018    source источник
comment
Вы пробовали отладить свой путь к файлу, чтобы проверить, есть ли у него ожидаемое значение пути?   -  person popsiporkkanaa    schedule 24.07.2018
comment
@popsiporkkanaa - да, я пробовал отладку, и у filePath есть PFX-файл сертификата. Также прилагаем образец кода для отладки - Console.WriteLine (File.Exists (filePath)? Файл существует.: Файл не существует.);   -  person Rakesh Kumar    schedule 24.07.2018
comment
Можете ли вы вставить сюда свое полное сообщение CryptographicException и его трассировку стека? В трассировке стека может быть что-то полезное, чтобы найти основную причину   -  person popsiporkkanaa    schedule 24.07.2018
comment
"File exists." : "File does not exist." - это твоя проблема. Выдается исключение, потому что код не может найти файл сертификата.   -  person Crypt32    schedule 24.07.2018
comment
System.Security.Cryptography.CryptographicException.ThrowCryptographicException (Int32 hr) в System.Security.Cryptography.X509Certificates.X509Utils._QueryCertFileType (String fileName) в PasswordSecurityCertFileType (String fileName) в файле passwordSecurityCryptography.X50 ) в System.Security.Cryptography.X509Certificates.X509Certificate2..ctor (String fileName, String password) в TestApp.Program.Main: строка 34   -  person Rakesh Kumar    schedule 24.07.2018
comment
@ Crypt32 - это пример кода, чтобы показать, что файл действительно существует. Настоящая ошибка вставлена ​​здесь.   -  person Rakesh Kumar    schedule 24.07.2018
comment
@RakeshKumar Возможно, это связано с загрузкой вашего текущего профиля пользователя. Давайте попробуем это решение здесь: stackoverflow.com/a/27242467/4329813   -  person popsiporkkanaa    schedule 24.07.2018
comment
@popsiporkkanaa - я уже пробовал то же самое. В пулах приложений - Расширенные настройки - модель процесса для загружаемого профиля пользователя уже установлено значение Истина.   -  person Rakesh Kumar    schedule 24.07.2018


Ответы (2)


Попробуем изменить ваш конструктор на:

X509Certificate2 certificate = new X509Certificate2(filePath, key, 
                               X509KeyStorageFlags.MachineKeySet
                             | X509KeyStorageFlags.PersistKeySet
                             | X509KeyStorageFlags.Exportable);

Использование MachineKeySet в качестве msdn говорит, что:

«Закрытые ключи хранятся в хранилище локального компьютера, а не в хранилище текущего пользователя».

person popsiporkkanaa    schedule 24.07.2018
comment
Я пробовал то же самое, но без особого успеха. Остается исключение. - person Rakesh Kumar; 24.07.2018
comment
Если путь к файлу там не работает, можете ли вы попробовать использовать другой конструктор, который считывает необработанные данные (массив байтов) сертификата? - person popsiporkkanaa; 24.07.2018
comment
То же исключение и с байтовым массивом. В настоящее время код выглядит следующим образом - byte [] bytes = System.IO.File.ReadAllBytes (filePath); X509Certificate2 certificate = new X509Certificate2 (байты, **** ключ ****, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable); - person Rakesh Kumar; 24.07.2018
comment
Добавление MachineKeySet решило эту проблему для меня: X509Certificate2 (filePath, key, X509KeyStorageFlags.MachineKeySet). - person w00ngy; 13.03.2019
comment
Спасибо, @popsiporkkanaa, добавив X509KeyStorageFlags.MachineKeySet, я устранил мою проблему при развертывании в лазурном веб-приложении. он работал нормально локально без установки этого значения - person Nishank; 20.05.2020
comment
MachineKey также решил мою проблему. Сообщение об ошибке было очень запутанным. - person Kishan Vaishnav; 26.05.2021

Предоставление Абсолютного пути, а не Относительного пути, действительно помогло. Намерение предоставить относительный путь состояло в том, чтобы включить сертификат как часть артефактов, и когда приложение будет развернуто на сервере, сертификат будет записан в выходной путь и прочитан из этого местоположения. Однако, пытаясь протестировать рабочий код и в настоящее время, я обнаружил, что работает только абсолютный путь, хотя свойство сертификата настроено на копирование всегда. Рабочий код теперь выглядит так -

            filePath = @"C:\Users\rakesh\Documents\TestCompany-qa.partner.client.siriusxm.com.pfx"; 

            X509Certificate2 certificate = new X509Certificate2(filePath, "****key****"); 

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

person Rakesh Kumar    schedule 24.07.2018