相关疑难解决方法(0)

CryptographicException'Keyset不存在',但仅限于WCF

我有一些代码调用使用X.509认证保护的第三方Web服务.

如果我直接调用代码(使用单元测试),它可以正常工作.

部署后,将通过WCF服务调用此代码.我添加了第二个调用WCF服务的单元测试,但是当我在第三方Web服务上调用方法时,这个CryptographicException消息失败了"Keyset does not exist".

我认为这是因为我的WCF服务将尝试使用不同的用户自己调用第三方Web服务.

任何人都可以解决这个问题吗?

.net wcf x509

152
推荐指数
7
解决办法
18万
查看次数

"尝试加载证书的私钥时,指定了无效的提供程序类型"CryptographicException

我正在尝试读取第三方服务提供商与我共享的证书的私钥,因此我可以使用它来加密某些XML,然后再将其发送给他们.我在C#中以编程方式这样做,但我认为这是一个权限或配置错误的问题,因此我将重点关注似乎最相关的事实:

  • 我不认为这个问题与代码有关; 我的代码适用于其他计算机,该问题会影响Microsoft的示例代码.
  • 证书是作为PFX文件提供的,仅用于测试目的,因此它还包括虚拟证书颁发机构.
  • 使用MMC.exe,我可以将证书导入本地计算机的个人存储,然后将私钥授予所有相关帐户,并将证书颁发机构拖放到受信任的根证书颁发机构.
  • 使用C#,我可以加载证书(由其指纹识别)并验证它是否具有私钥X509Certificate2.HasPrivateKey.但是,尝试读取密钥会导致错误.在.NET中,CryptographicException在尝试访问该属性时抛出消息"指定了无效的提供程序类型" X509Certificate2.PrivateKey.在Win32中,调用该方法CryptAcquireCertificatePrivateKey返回等效的HRESULT , NTE_BAD_PROV_TYPE.
  • 当使用两个Microsoft自己的代码示例来读取证书的私钥时,也会出现相同的异常.
  • 在当前用户(而不是本地计算机)的等效存储中安装相同的证书,可以成功加载私钥.
  • 我在Windows 8.1上具有本地管理员权限,我尝试在正常模式和高级模式下运行我的代码.Windows 7和Windows 8上的同事已能够从本地计算机商店加载密钥以获得相同的证书.
  • 我可以成功读取自签名IIS测试证书的私钥,该证书位于同一个商店位置.
  • 我已经针对.NET 4.5(这个错误已经报告了一些旧版本的框架).
  • 我不认为这是证书模板的问题,因为我希望同样影响本地机器和当前用户商店?

与我的同事不同,我之前曾多次尝试以各种方式卸载和重新安装证书,包括通过IIS管理器,还包括来自同一发行人的旧证书.我在MMC中看不到任何旧证书或重复证书的痕迹.但是,我确实有许多相同大小的私钥文件,基于最后写入时间,在我的各种安装尝试后必须留下.这些位于以下位置,分别用于本地计算机和当前用户存储:

C:\ ProgramData \微软\加密\ RSA\MachineKeys的

c:\ Users \\ AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21- [其余用户ID]

所以,任何人都可以建议是否:

  • 使用MMC卸载证书是一个好主意,删除所有看起来像孤立私钥的文件,然后重新安装证书并重试?
  • 还有其他文件我应该尝试手动删除吗?
  • 还有什么我应该尝试的吗?

更新 - 添加了一个代码示例,显示尝试读取私钥:

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)

c# windows certificate mmc certificate-store

37
推荐指数
7
解决办法
4万
查看次数

PrivateKey 抛出了 System.Security.Cryptography.CryptographicException 类型的异常

我正在尝试使用以下代码使用自签名证书:

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)

在此处输入图片说明

我试过这个修复这个修复

但是还是有问题!

c# digital-certificate x509certificate2

5
推荐指数
2
解决办法
1万
查看次数