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);
相关代码在独立控制台应用程序中运行良好,而在 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);