我遇到了以下问题.
我运行以下代码
var binaryData = File.ReadAllBytes(pathToPfxFile);
var cert = new X509Certificate2(binaryData, password);
Run Code Online (Sandbox Code Playgroud)
在两个过程中.其中一个进程运行,LOCAL_SYSTEM并且此代码成功.另一个在IIS中在属于"Users"本地组的本地用户帐户下运行,在那里我得到以下异常:
System.Security.Cryptography.CryptographicException
Object was not found.
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData, String password)
//my code here
Run Code Online (Sandbox Code Playgroud)
所以我用Google搜索了一下,找到了一个类似问题的答案.我尝试启用LoadUserProfile应用程序池,现在可以正常运行.
问题是我没有得到我设置时会发生LoadUserProfile什么以及可能产生的后果.我的意思是,如果它是一个"好"的东西那么为什么它不是默认"开启",为什么它毕竟在那里?
当我LoadUserProfile在IIS池中设置时会发生什么,它会产生什么负面影响?
我正在尝试将 asp.net 核心 Web API 部署到 IIS。这个应用程序在 Visual Studio 上运行得非常好,当我使用 dotnet 命令运行 dll 时也是如此。此应用程序具有用于签署 JWT 令牌的证书。将应用程序部署到 IIS 后,我收到“HTTP 错误 500.30 - ANCM 进程内启动失败”,我检查了 Windows 日志,错误消息是
主机意外终止。Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: 系统找不到指定的文件。在 Internal.Cryptography.Pal.CertificatePal.FilterPFXStore(Byte[] rawData, SafePasswordHandle password, PfxCertStoreFlags pfxCertStoreFlags)......
我检查了文件路径和文件名一切都正确,但由于某些原因 IIS 无法加载找到证书文件。另外,我检查了许可,它看起来也不错。不知道为什么我收到此错误消息
此外,我使用 IIS 指向的 dotnet run 命令运行了相同的应用程序 dll 文件,但我没有收到任何错误。我只有在部署到 IIS 后才会收到此错误。
在 startup.cs 文件和配置方法上,我在这一行遇到错误。
var cert = new X509Certificate2("test_cert.pfx", pwdFrmVault);
Run Code Online (Sandbox Code Playgroud) 关联的代码在独立的控制台应用程序中运行良好,而在尝试使其正常运行的同时,却在NSB体系结构中出错。我试过在worker中进行相同的测试,也尝试在测试控制台应用程序中进行独立测试。无论哪种情况,它都会出错-X509Certificate2证书=新的X509Certificate2(filePath,“ *** key *** UeUHFxS”); 异常消息-System.Security.Cryptography.CryptographicException:'系统找不到指定的文件。该代码包括一个,如图所示,还包括一个与Activate设备相关的帮助文件。但是,从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") …Run Code Online (Sandbox Code Playgroud) 我正在尝试从 Azure Keyvault 获取证书,然后使用它来调用需要证书进行身份验证的 REST API。
我尝试在本地执行此操作 - 我将.pfx文件放在磁盘上,将其加载到字节数组中,然后从中创建我的证书:
X509Certificate2 x509 = new X509Certificate2(File.ReadAllBytes(path), password);
Run Code Online (Sandbox Code Playgroud)
然后在 RestSharp 中使用该证书来执行我的 REST 调用:
IRestClient client = new RestClient(url);
client.ClientCertificates = new X509CertificateCollection { x509 };
var request = new RestRequest(lastUrlPart, Method.GET);
request.AddHeader("Cache-Control", "no-cache");
request.AddHeader("Accept", "application/json");
request.AddHeader("Content-Type", "application/json");
IRestResponse response = client.Execute(request);
if (response.IsSuccessful)
{
// read out the response and process it
}
Run Code Online (Sandbox Code Playgroud)
奇迹般有效。
现在我正在尝试做同样的事情,但从 Azure Keyvault 获取证书。我在 Azure AD 中创建了一个应用注册,创建了我的密钥保管库,并授予了我的应用注册的服务标识访问密钥保管库的权限。我已将我的证书上传到密钥库中。到现在为止还挺好。
我找到了从 Keyvault 获取证书的代码:
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var kv …Run Code Online (Sandbox Code Playgroud)