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

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

https://developer.mastercard.com/portal/display/api/OAuth+Validation

在该页面上,它们有两个版本的密钥,一个是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) 

两个文件。

有任何想法吗? 证书不好吗? 我使用错误的课吗? 该错误消息的含义是什么?

– 更新 – 在Bad Zombie的建议下,我尝试了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”调用中,我收到“Bad Data”。 难道我做错了什么?

我不记得确切,但我相信pem文件不能使用。 你需要像充气城堡这样的东西。

我记不起来了,但它加载了PEM文件。 偶尔它不会喜欢它,但它有点罕见。 我不知道它是否可以使用,但我知道我成功使用了私钥/公钥。 我不知道如何将其转换为适用于.NET ssl库的东西。

但是,如果你使用.net实现而不是bouncy castle, 我建议你将它转换为与.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); } 

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

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