在C#中从文件加载公钥

3

我遇到了私钥加载的困难。

我使用以下命令创建了证书:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt

我创建了一个GIST来展示输出结果:https://gist.github.com/anonymous/5592135

    static void Main(string[] args)
    {
        string location = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
        string certLocation = location + "\\assets\\certificate.crt";
        string privateKeyLocation = location + "\\assets\\privateKey.key";
        string xmlDocLocation = location + "\\assets\\sample.xml";

        XmlDocument Doc = new XmlDocument();
        Doc.Load(xmlDocLocation);

        // read up the certificate
        X509Certificate2 cert = new X509Certificate2(certLocation);
        X509Certificate2 privateKey = new X509Certificate2(privateKeyLocation);

    }

我的证书可以正常加载,但我无法加载私钥。我收到“无法找到请求的对象”的消息。
我希望能够从文件中加载私钥和证书,而不是使用存储。这可能吗?我生成证书和私钥时出了问题吗?最终,我想将公钥包含在xml文档中,接收器将解析xml数据并验证私钥和公钥是否匹配。
1个回答

1
如果您想避免使用证书存储,我建议您将CRT和密钥合并成PFX文件。这是一个讨论如何执行此操作的链接(或者只需搜索“openssl create pfx”)。

https://www.globalsign.com/support/import/apache.php

在您的代码中,请记住X509Certificate2对象(例如,您的证书对象)将包含公钥和私钥--所以您不需要一个单独的对象来存储私钥。创建PFX文件时,会提示您输入密码。此密码用于加密PFX的私钥部分。当您创建X509Certificate2对象时,除了密码外还需提供PFX文件的位置。构造函数如下:

http://msdn.microsoft.com/en-us/library/ms148420.aspx

我不确定你的最终目标是什么。如果您希望客户确保XML文件确实来自服务器并且未被更改,您应该考虑使用数字签名。简而言之,发送方使用其私钥对XML文件的哈希进行签名,接收方使用发送方的公钥进行验证。


请注意:如果有人需要示例,我在GitHub上创建了一个存储库:https://github.com/tekguy/SignXMLExample。祝你好运! - TheWebGuy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接