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

时间:2012-12-06 23:44:43

标签: c# encryption x509certificate2

我正在尝试为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”。我做错了吗?

2 个答案:

答案 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)

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

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