当前位置: 首页 > 知识库问答 >
问题:

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

长孙文栋
2023-03-14

我正在尝试读取由第三方服务提供商与我共享的证书的私钥,这样我就可以在通过网络将XML发送给他们之前使用它加密一些XML。我是用C#编程的,但我认为这是一个权限或配置错误的问题,所以我将集中讨论似乎最相关的事实:

    null

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

C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys

    null

UPDATE-添加了一个代码示例,显示试图读取私钥:

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 loaded from, here:
    //X509Store store = new X509Store("MY", StoreLocation.CurrentUser);

    store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);

    X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates;
    X509Certificate2Collection fcollection = (X509Certificate2Collection)collection.Find(X509FindType.FindByTimeValid, DateTime.Now, false);
    X509Certificate2Collection scollection = X509Certificate2UI.SelectFromCollection(fcollection, "Test Certificate Select", "Select a certificate from the following list to get information on that certificate", X509SelectionFlag.MultiSelection);
    Console.WriteLine("Number of certificates: {0}{1}", scollection.Count, Environment.NewLine);

    foreach (X509Certificate2 x509 in scollection)
    {
        try
        {
            Console.WriteLine("Private Key: {0}", x509.HasPrivateKey ? x509.PrivateKey.ToXmlString(false) : "[N/A]");
            x509.Reset();
        }
        catch (CryptographicException ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
    store.Close();

    Console.ReadLine();
}

共有1个答案

危寒
2023-03-14

我在最近收到的两个新证书的Windows 8和Server 2012/2012 R2上遇到了同样的问题。在Windows10上,该问题不再发生(但这对我没有帮助,因为操作证书的代码是在服务器上使用的)。虽然Joe Strommen的解决方案在原则上是可行的,但是不同的私钥模型需要对使用证书的代码进行大量更改。我发现一个更好的解决方案是将私钥从CNG转换为RSA,正如Remy Blok在这里所解释的那样。

Remy使用OpenSSL和两个较旧的工具来完成私钥转换,我们希望将其自动化,并开发了一个仅使用OpenSSL的解决方案。给定具有CNG格式私钥密码mycert.pfxmypwd,以下是获取具有RSA格式私钥和相同密码的新converted.pfx的步骤:

  1. 提取公钥,完整证书链:
OpenSSL pkcs12 -in "MYCERT.pfx" -nokeys -out "MYCERT.cer" -passin "pass:MYPWD"
OpenSSL pkcs12 -in "MYCERT.pfx" -nocerts -out "MYCERT.pem" -passin "pass:MYPWD" -passout "pass:MYPWD"
OpenSSL rsa -inform PEM -in "MYCERT.pem" -out "MYCERT.rsa" -passin "pass:MYPWD" -passout "pass:MYPWD"
OpenSSL pkcs12 -export -in "MYCERT.cer" -inkey "MYCERT.rsa" -out "CONVERTED.pfx" -passin "pass:MYPWD" -passout "pass:MYPWD"
 类似资料:
  • 单机版中使用的连接器标记。下面是xml。

  • 因此,我正在通过 SAML2.0 为我们的应用程序实现 SSO。我们正在使用 saml2-js,并且我们正在执行 SP 启动的 SSO。 实现已经准备好了,它正在工作,但是有几个部分我还在纠结。 saml2-js要求您在ServiceProvider实例上提供私钥和证书-

  • 将私钥加密变换为keystore v3标准格式。 调用: web3.eth.accounts.encrypt(privateKey, password); 参数: privateKey - String: 要加密的私钥. password - String: 用于加密的密码 返回值: Object: 加密后的keystore v3 JSON. 示例代码: web3.eth.accounts.en

  • 我正在尝试下载我在几个密钥库中的证书,包括它们的私钥。通过Azure Portal,我可以在没有问题的情况下进行操作,只需进入密钥库,选择证书并点击“PFX/PEM格式下载”。 由于我必须在几个钥匙库上重复相同的操作,我正在寻找一种自动化的方法来完成它。到目前为止,我得出以下结论:

  • 问题内容: 我正在使用netbeans 7.2运行JDK 1.7和Windows 7,我已经使用putty- keygen生成了SSH私钥和公钥对(SSH2-2048位)。我没有私钥密码。我现在正在尝试使用SFTP连接到主机之一。但是,当我通过私钥(ppk)设置身份时,代码将返回无效的私钥错误。我在WinSCP中使用了相同的私钥来连接到相同的主机,并且工作正常。请帮助我解决错误。这是我的代码: 问

  • 我使用以下代码在Java应用程序中使用Git。我有一个有效的密钥(一直使用它),并且这个特定的代码在使用相同的密钥和git存储库之前对我有用,但是现在我得到了以下异常: 无效的私钥:[B@59c40796。 在这一行: 我的完整代码: 在线搜索后,我将createDefaultJSch更改为使用pemWriter: 但仍然得到“无效私钥”异常。