如何在C#中使用私钥&引用;找不到请求的对象。”;

如何在C#中使用私钥&引用;找不到请求的对象。”;,c#,encryption,x509certificate2,C#,Encryption,X509certificate2,我正在尝试为MasterCard Match实施身份验证,作为其以下文档的一部分,他们有一个示例私钥: 在该页面上,他们有两个版本的密钥,一个是base64编码的文本,在页面上可见,另一个是可下载的.p12文件 如何导入此密钥以用作x509certificate2 无论我尝试什么,我都会收到消息“找不到请求的对象” 我试着用.net源代码对其进行深入研究,但在导入对象时遇到了死胡同 [SecurityCritical] [MethodImpl(MethodImplOptions.Interna

我正在尝试为MasterCard Match实施身份验证,作为其以下文档的一部分,他们有一个示例私钥:

在该页面上,他们有两个版本的密钥,一个是base64编码的文本,在页面上可见,另一个是可下载的.p12文件

如何导入此密钥以用作x509certificate2

无论我尝试什么,我都会收到消息“找不到请求的对象”

我试着用.net源代码对其进行深入研究,但在导入对象时遇到了死胡同

[SecurityCritical]
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern uint _QueryCertFileType(string fileName);
我尝试了以下方法,但所有方法都失败了,出现了上述相同的消息

new X509Certificate2(@"c:\test\mc-openapi-csr.pem")
new X509Certificate2(@"c:\test\mc-openapi-csr.pem", "mcapi")
new X509Certificate2(@"c:\test\mc-openapi-csr.pem", "mckp")
所以我将文本块复制到“copied.txt”中,并尝试使用该文件,我还尝试读取字节,并手动传递它们,我还尝试使用

X509Certificate.CreateFromCertFile(fileName)
两个文件都有

有什么想法吗?证书坏了吗?我用错班级了吗?那个错误消息是什么意思

--更新-- 在坏僵尸的建议下,我尝试了BouncyCastle:

    var pem = new Org.BouncyCastle.OpenSsl.PemReader(File.OpenText(fileName));
    RsaPrivateCrtKeyParameters rsaParameters = (RsaPrivateCrtKeyParameters)pem.ReadObject();
    using (var rsa = new RSACryptoServiceProvider())
    {
        rsa.ImportParameters(new RSAParameters
            {
                DP = rsaParameters.DP.ToByteArray(),
                DQ = rsaParameters.DQ.ToByteArray(),
                Exponent = rsaParameters.Exponent.ToByteArray(),
                InverseQ = rsaParameters.QInv.ToByteArray(),
                Modulus = rsaParameters.Modulus.ToByteArray(),
                P = rsaParameters.P.ToByteArray(),
                Q = rsaParameters.Q.ToByteArray(),
            });
    }

在“ImportParameters”通话中,我得到了“坏数据”。我做错什么了吗?

你可以尝试使用相对路径而不是绝对路径


只需将文件放在项目的根目录中,并尝试只使用文件名,而不使用路径

我记不清了,但我相信pem文件不能使用。你需要像这样的东西

我不太记得了,但它加载了PEM文件。偶尔它会不喜欢它,但它有点稀有。我不知道它是否可以使用,但我知道我成功地使用了私钥/公钥。我不知道如何将它转换为与.NETSSL库一起工作的东西

但是,如果您使用的是.NET实现,而不是bouncy castle,我建议您将其转换为pem,使其与.NET实现更兼容。我使用了bouncycastle,它为我的项目工作,不需要与另一个库接口

using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.OpenSsl;
using System.IO;
using System.Security.Cryptography;

//elsewhere

        using (var reader = File.OpenText(fileName))
        {
            var pemReader = new PemReader(reader);
            var bouncyRsaParameters = (RsaPrivateCrtKeyParameters)pemReader.ReadObject();
            var rsaParameters = DotNetUtilities.ToRSAParameters(bouncyRsaParameters);
            this.PrivateKey = new RSACryptoServiceProvider();
            this.PrivateKey.ImportParameters(rsaParameters);
        }

如果无法使用pen文件,是否意味着不支持证书类型?或者只是文件格式,我可以手动更改?bouncy castle与x509certificate兼容吗?@McKay:我不知道。我知道pem是x509的base64编码,顶部和底部各有一行。但是你在谈论.net课程。我不认为是这样,但如果你只需要验证一些东西,而不需要使用MS.NET的东西,那么你也许可以使用它。我不熟悉万事达卡API。另外,如果他们的api有一个C#kit/lib,那不是有一些例子吗?我只知道我可以按照你在标题中的要求做,在C#with pem文件中使用一个私钥,使用bouncy castle。也许你应该试试p12文件。也许微软支持it@McKay:使用p12可能会更幸运,它可能兼容,或者您可以使用openssl更改格式。我知道我曾尝试在pem中使用.NET内置的东西,但它没有。FlySmasterCard没有.NET API。我无法将base64解码字节作为x509证书加载,也无法导入p12文件。我应该如何处理openssl中的p12文件以将其导入x509certificate?