如何在C#中使用.key文件?

时间:2016-02-01 15:58:45

标签: c#

我正在设置AS2通信,以便将文件签名给客户。据我所知,签署通过AS2通信工作,我们将使用我们的私钥对我们发送的数据进行签名,他们将使用我们的公钥对其进行验证。

我的问题: 我的IT部门给了我一个.cer和一个.key文件。 .cer文件中没有私钥,显然.key文件是私钥。客户将.cer文件添加到其受信任的根目录以验证我们的消息。我无法理解如何使用.key文件签署我的数据。这不是我可以添加到个人证书商店的东西,因此我无法获得证书并执行此操作:

//Open my Personal cert store.
X509Store my = new X509Store(StoreName.My, StoreLocation.LocalMachine);
my.Open(OpenFlags.ReadOnly);

RSACryptoServiceProvider csp = null;

foreach (X509Certificate2 cert in my.Certificates)
{
    if (cert.Subject.Contains("My certificate subject"))
    {
        // We found it. 
        // Get its associated CSP and private key
        csp = (RSACryptoServiceProvider)cert.PrivateKey;
    }
}

// Hash the data
SHA256Managed sha256 = new SHA256Managed();
UnicodeEncoding encoding = new UnicodeEncoding();
byte[] hash = sha256.ComputeHash(arMessage);

// Sign the hash
return csp.SignHash(hash, CryptoConfig.MapNameToOID("SHA256"));

如何直接使用.key文件将我的私钥作为RSACryptoServiceProvider获取,因为.key文件不能存储在证书存储中?

2 个答案:

答案 0 :(得分:1)

我以稍微不同的方式完成了类似的事情。请原谅我,如果这根本没用,我可以删除它。

我在这里没有做任何签名,但你可以从中弄清楚如何。

var collection = new X509Certificate2Collection();
collection.Import(System.Web.Hosting.HostingEnvironment.MapPath(pathToPrivateKey), privateKeyPassword, X509KeyStorageFlags.MachineKeySet);

var requestToPing = (HttpWebRequest)WebRequest.Create(dropOffURL);
requestToPing.Method = "POST";
requestToPing.PreAuthenticate = true;
requestToPing.ClientCertificates.Add(collection[0]);

答案 1 :(得分:1)

我只知道如何处理PFX文件,但将KEY文件转换为PFX应该不是问题。看这篇文章:

Is it possible to convert an SSL certificate from a .key file to a .pfx?

稍后,您可以使用以下方法手动打开证书文件:

{{1}}