我有一些代码调用使用X.509认证保护的第三方Web服务.
如果我直接调用代码(使用单元测试),它可以正常工作.
部署后,将通过WCF服务调用此代码.我添加了第二个调用WCF服务的单元测试,但是当我在第三方Web服务上调用方法时,这个CryptographicException消息失败了"Keyset does not exist".
我认为这是因为我的WCF服务将尝试使用不同的用户自己调用第三方Web服务.
任何人都可以解决这个问题吗?
我正在尝试读取第三方服务提供商与我共享的证书的私钥,因此我可以使用它来加密某些XML,然后再将其发送给他们.我在C#中以编程方式这样做,但我认为这是一个权限或配置错误的问题,因此我将重点关注似乎最相关的事实:
X509Certificate2.HasPrivateKey.但是,尝试读取密钥会导致错误.在.NET中,CryptographicException在尝试访问该属性时抛出消息"指定了无效的提供程序类型" X509Certificate2.PrivateKey.在Win32中,调用该方法CryptAcquireCertificatePrivateKey返回等效的HRESULT , NTE_BAD_PROV_TYPE.与我的同事不同,我之前曾多次尝试以各种方式卸载和重新安装证书,包括通过IIS管理器,还包括来自同一发行人的旧证书.我在MMC中看不到任何旧证书或重复证书的痕迹.但是,我确实有许多相同大小的私钥文件,基于最后写入时间,在我的各种安装尝试后必须留下.这些位于以下位置,分别用于本地计算机和当前用户存储:
C:\ ProgramData \微软\加密\ RSA\MachineKeys的
c:\ Users \\ AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21- [其余用户ID]
所以,任何人都可以建议是否:
更新 - 添加了一个代码示例,显示尝试读取私钥:
static void Main()
{
// Exception occurs when trying to read the private key after loading certificate from here:
X509Store store = new X509Store("MY", StoreLocation.LocalMachine);
// Exception does not occur if certificate was installed to, and …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下代码使用自签名证书:
X509Certificate2 cert = ToCertificate("CN=localhost");
public static X509Certificate2 ToCertificate(this string subjectName,
StoreName name = StoreName.My,
StoreLocation location = StoreLocation.LocalMachine
)
{
X509Store store = new X509Store(name, location);
store.Open(OpenFlags.ReadOnly);
try
{
var cert = store.Certificates.OfType<X509Certificate2>().FirstOrDefault(c => c.Subject.Equals(subjectName, StringComparison.OrdinalIgnoreCase));
return cert != null ? new X509Certificate2(cert) : null;
}
catch (Exception)
{
throw;
}
finally
{
store.Certificates.OfType<X509Certificate2>().ToList().ForEach(c => c.Reset());
store.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下异常:
PrivateKey = 'cert.PrivateKey' threw an exception of type 'System.Security.Cryptography.CryptographicException'
Run Code Online (Sandbox Code Playgroud)
但是还是有问题!