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

如何在C#中使用.key文件?,c#,C#,我正在设置AS2通信,以便向客户签署文件。据我所知,要通过AS2通信进行签名,我们将使用私钥对发送的数据进行签名,他们将使用我们的公钥进行验证 我的问题: 我的IT部门给了我一个.cer和一个.key文件。.cer文件中没有私钥,显然.key文件就是私钥。客户将把.cer文件添加到其受信任的根目录中,以验证我们的消息。我无法理解如何使用.key文件对数据进行签名。我无法将其添加到个人证书存储中,因此我无法简单地获取证书并执行以下操作: //Open my Personal cert store.

我正在设置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文件不能存储在证书存储中,作为RSACryptServiceProvider,我如何直接使用.key文件获取私钥?

我以稍微不同的方式做了类似的事情。原谅我,如果这是没有任何帮助,我可以删除它

我没有在这里签字,但你也许能从中找到答案

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]);

我以稍微不同的方式做过类似的事情。原谅我,如果这是没有任何帮助,我可以删除它

我没有在这里签字,但你也许能从中找到答案

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]);

我只知道如何处理PFX文件,但将密钥文件转换为PFX应该不会有问题。见此帖:

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

// This you should know
var certPath = @"path-to-file.pfx";
var certPass = @"password-goes-here";

// Create a collection object and populate it using the PFX file
X509Certificate2Collection collection = new X509Certificate2Collection();

collection.Import(certPath, certPass, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

//Then you can iterate over the collection:
foreach (X509Certificate2 cert in collection)
{
     // Bingo

     // Here you can do whatever you want with "cert"
}

我只知道如何处理PFX文件,但将密钥文件转换为PFX应该不会有问题。见此帖:

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

// This you should know
var certPath = @"path-to-file.pfx";
var certPass = @"password-goes-here";

// Create a collection object and populate it using the PFX file
X509Certificate2Collection collection = new X509Certificate2Collection();

collection.Import(certPath, certPass, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

//Then you can iterate over the collection:
foreach (X509Certificate2 cert in collection)
{
     // Bingo

     // Here you can do whatever you want with "cert"
}


您有密钥的密码吗?我有密钥的密码。@Vahlkron您可以使用
pvk2pfx
openssl
等工具将这两个文件转换为既包含私钥又包含公钥的
.pfx
.p12
证书文件。确定。我想知道我是否必须这样做。我唯一的问题是,如果我向我的客户提供这个.pfx,他们有权访问私钥吗?我假设没有,除非他们有或弄清楚密码。你不给客户pfx,你只是用它加密。他们用证书解密你有密钥的密码吗?我有密钥的密码。@Vahlkron你可以使用
pvk2pfx
openssl
等工具将这两个文件转换为既包含私钥又包含公钥的
.pfx
.p12
证书文件。确定。我想知道我是否必须这样做。我唯一的问题是,如果我向我的客户提供这个.pfx,他们有权访问私钥吗?我假设没有,除非他们有或弄清楚密码。你不给客户pfx,你只是用它加密。他们用certAhhh解密,我以前没见过这篇进口文章。我要试一试。非常感谢。导入是我将密钥导入项目所需要的。再次感谢你的帮助!啊,我以前没见过这件进口的作品。我要试一试。非常感谢。导入是我将密钥导入项目所需要的。再次感谢你的帮助!这看起来很有希望。我要试试看。非常感谢你!事实上,这正是我所需要的。它在代码中为我获取私钥。现在,在那之后我有问题,但这完全回答了我的问题。非常感谢。这看起来很有希望。我要试试看。非常感谢你!事实上,这正是我所需要的。它在代码中为我获取私钥。现在,在那之后我有问题,但这完全回答了我的问题。非常感谢。