【问题标题】:Initialisting KeyInfo with X509 certificate parameters使用 X509 证书参数初始化 KeyInfo
【发布时间】:2012-12-31 21:26:33
【问题描述】:

这是一个 C# 语言的问题。

我在一个 A 类中引用了 X509 证书(称之为 sslCert),即我可以访问与 X509 证书关联的各种成员。

另外,我的 B 类具有以下 2 个加密密钥成员 --> KeyInfo 公钥; KeyInfo privateKey;

问题是我无法找到使用 X509 中的公钥和私钥值设置这两个值(公钥和私钥)的方法。直接赋值不起作用并抱怨数据类型不匹配。

B.publicKey = A.sslcertificate.Certificate.PublicKey;
B.privateKey = A.sslcertificate.Certificate.PrivateKey;

我已经尝试了很多,但不知道实现这一目标的确切分配方式是什么。任何人都可以对此有所了解吗?

谢谢!!!

【问题讨论】:

  • 如果你能添加一些代码或澄清你想要完成的事情,那就太好了。看起来您尝试使用 x509 中的值设置您的类的值,这对我来说听起来很奇怪,所以请提供更多信息。
  • 添加了代码。 B 类具有 KeyInfo 类型的 publicKey 和 privateKey 成员。 A.sslcertificate.Certificate 给了我们 X509 证书。

标签: c# .net cryptography rsa x509certificate


【解决方案1】:

这是你想要做的吗?很抱歉,我还在想办法。

    using System.Net;
    using System.Security.Cryptography.Xml;
    using System.Security.Cryptography.X509Certificates;

    namespace ConsoleApplication1
    {
        public class A
        {
            private string website = "https://www.chase.com/";
            private X509Certificate m_certificate;

            public X509Certificate Certificate
            {
                get
                {
                    if (m_certificate == null)
                    {
                        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(website);
                        HttpWebResponse response = (HttpWebResponse) request.GetResponse();
                        response.Close();
                        X509Certificate cert = request.ServicePoint.Certificate;
                        m_certificate = cert;
                    }
                    return m_certificate;
                }
            }
            public X509Certificate2 Certificate2
            {
                get
                {
                    return new X509Certificate2(Certificate);
                }
            }
        }

        public class B
        {
            public KeyInfo publicKey { get; set; }
            public KeyInfo privateKey { get; set; }
        }

        class Program
        {
            private static void Main(string[] args)
            {
                A tempA = new A();
                B tempB = new B();

                tempB.privateKey = tempA.Certificate.GetPublicKey(); // fails
            }
        }
    }

【讨论】:

  • 我正在做类似的事情。上面代码中的以下行失败。 tempB.privateKey = tempA.Certificate.GetPublicKey(); // 失败另外,我不知道如何使用 B 类 X509 证书的私钥设置 A 类的私钥字段,因为没有可直接分配的 GetPrivateKey 方法。在我的 Visual Studio 10 IDE 中,我没有将 KeyInfoX509Data 作为可识别的数据类型。请提出建议。
  • 好的,所以我引用了 3 个库 System、System.Security、System.Xml,您可以在上面看到这段代码,这非常匹配。你可以在这里下载源代码zalil.ru/34133542 它将在 2013 年 1 月 13 日之前提供,希望对你有帮助,祝你好运!
【解决方案2】:

假设你有证书:

X509Certificate2 certificate;

你只是

KeyInfo ki = new KeyInfo();
KeyInfoX509Data keyInfoData = new KeyInfoX509Data( certificate );
ki.AddClause( keyInfoData );

这会将整个证书存储在密钥信息中。私有部分和公共部分都可以分开存储,您只需使用其他类型的子句初始化 KeyInfo。支持子句的完整列表:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.xml.keyinfoclause.aspx

【讨论】:

  • 在我的 Visual Studio 10 IDE 中,我没有将 KeyInfoX509Data 作为可识别的数据类型。它显示错误,无法使用。
  • 很遗憾你没有尝试用谷歌搜索msdn.microsoft.com/en-us/library/…
  • 看来你还是不明白我指出了什么。即使在导入/使用必要的包之后,KeyInfoX509Data 也没有被使用。
  • 这只有在控制台应用程序以客户端框架为目标的情况下才有可能。如果是这样,请将您的项目重新定位到完整的框架。在任何其他情况下,该类必须可用,它是网络框架的一部分,没有理由不提供它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多