c# - 如何在 C# 中使用私钥? "Cannot find the requested object."

标签 c# encryption x509certificate2

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

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

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

如何导入此 key 以用作 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")

所以我将文本 block 复制到“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 文件不能用。你需要类似 bouncy castle 的东西.

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

不过,我建议如果您使用的是 .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);
        }

关于c# - 如何在 C# 中使用私钥? "Cannot find the requested object.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13754685/

相关文章:

android - iOS 和 Android 之间的加密数据传输(ByteArray 或 Base64EncodedString 兼容性问题)

c# - 从 X509Certificate2 中删除私钥

javascript - 如何在 Javascript 中获取 X509Certificate 指纹?

c# - 服务结构: Authenticating with Azure KeyVault via cert: "KeySet does not exist"

c# - 解构是暧昧的

c# - 在 C# 中将 Guid 转换为 2 个 longs 并将 2 个 longs 转换为 Guid

encryption - 盐可以防止字典或暴力攻击吗?

c# - 在 C# 中同步多个 Azure 表/容器 - 最佳实践是什么?

scala - 如何在 scala playframework 2.2 中的 mysql 中存储加密密码?

c# - 在 Linux Docker 容器中运行时无法读取证书 - 适用于 Windows