我正在尝试为MasterCard Match实施身份验证,作为以下文档的一部分,他们有一个示例私钥:
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)
包含两个文件。
有什么想法吗?证书不好吗?我使用错误的课吗?该错误消息的含义是什么?
- Update-- 在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”。我做错了吗?
答案 0 :(得分:1)
我不记得确切,但我相信pem文件无法使用。你需要像bouncy castle这样的东西。
我记不起来了,但它加载了PEM文件。偶尔它不会喜欢它,但它有点罕见。我不知道它是否可以使用,但我知道我成功使用了私钥/公钥。我不知道如何将它转换为适用于.NET ssl库的东西。
然而我建议你将它转换为与.NET实现更兼容的东西,如果你使用.net实现而不是bouncy castle。我使用了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);
}
答案 1 :(得分:-2)
你可以尝试使用相对路径而不是绝对路径吗?
只需将文件放在项目的根目录中,并尝试仅使用文件名,而不使用路径。