X509Certificate2 错误 - 系统找不到指定的文件

X509Certificate2 Error - System cannot find the file specified

相关代码在独立控制台应用程序中运行良好,而在 NSB 体系结构中尝试使其运行时出错。我试图在工作人员中测试相同的内容,也在测试控制台应用程序中独立测试。无论哪种情况,它都会在行中出错 - X509Certificate2 certificate = new X509Certificate2(filePath, "***key***UeUHFxS"); 异常消息是 - System.Security.Cryptography.CryptographicException: '系统找不到指定的文件。 该代码由所示代码和激活设备的相关帮助程序文件组成。但是,在用于从 pfx 文件路径和密钥初始化 X509Certificate2 的部分中存在例外情况。

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));
        }

    }

}

让我们尝试将您的构造函数修改为:

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

使用 MachineKeySet 作为 msdn 说:

"Private keys are stored in the local computer store rather than the current user store. "

提供绝对路径而不是相对路径确实有所帮助。提供相对路径的目的是将证书作为工件的一部分包含在内,当应用程序部署到服务器时,证书将写入输出路径,并从该位置读取。 但是,在尝试测试工作代码时,目前我发现只有绝对路径有效,尽管证书 属性 设置为始终复制。工作代码现在看起来像 -

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

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

因此,需要知道部署应用程序的服务器中的路径和证书位置,现在才能继续,作为解决方法。

!!!对于所有已切换 IIS 并使用所有 keyFlags 的有此问题的人!!!

我在本地机器上遇到了这个问题。想不通。所以我在 X509 调用上方插入了 Directory.GetFiles(certs folder) 以 6x 检查文件路径是否正确。新的 X509Certification2() 开始工作。

certs 文件夹在项目范围之外,我本地的项目以前从未访问过它。证书存储必须使用影子文件夹结构,您必须通过简单地读取文件来注册。

希望这能在他们花半天时间解决这个问题之前帮助到他们。

在此处查看更多详细信息:https://github.com/dotnet/runtime/issues/25143

The certificate was, indeed, present and was readable from the user running - so it's not an issue that the certificate can't be found!

The actual error is, I believe, that it can't put the certificate the LocalUser's cert store.

以下是对我有用的方法:

var issuerCertificate  = new X509Certificate2(caFileName, caPassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);