3

我正在尝试为 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”调用中,我得到“错误数据”。难道我做错了什么?

4

2 回答 2

2

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

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

但是,如果您使用的是 .net 实现而不是充气城堡,我建议您将其转换为与 .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);
        }
于 2012-12-06T23:58:10.563 回答
-2

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

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

于 2012-12-06T23:48:33.593 回答