C# 无法使用python中的X509Certificate对数据进行签名

C# 无法使用python中的X509Certificate对数据进行签名,c#,python,encryption,x509certificate,signing,C#,Python,Encryption,X509certificate,Signing,我对安全性没有太多经验,但现在我必须用python实现一个签名过程 我有一张证书somename.cer。我有一个c#实现示例,说明如何使用该字符串为我的字符串签名,如下所示: CertColl是证书的集合,其中相关代码在前几行中查找带有指纹的相关证书,并返回证书列表 X509Certificate2 cert = certColl[0] RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PrivateKey; retur

我对安全性没有太多经验,但现在我必须用python实现一个签名过程

我有一张证书
somename.cer
。我有一个
c#
实现示例,说明如何使用该字符串为我的字符串签名,如下所示:

CertColl是证书的集合,其中相关代码在前几行中查找带有
指纹的相关证书,并返回证书列表

X509Certificate2 cert = certColl[0]
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PrivateKey;
return Convert.ToBase64String(rsa.SignData(Encoding.GetEncoding(1251).GetBytes(my_string), new SHA1CryptoServiceProvider()));
my_string
是要在代码中签名和构造的字符串,但我不需要在这里添加这些步骤

因此,我试图在Python中借助

正如我所期望的,现在我可以用这个签名
我的_字符串

rsa_key.sign("Hello World", "")
但我收到以下错误:

TypeError:私钥在此对象中不可用


我是否做错了什么,比如在python中使用错误的方法来模拟rsa.SignData?

您的证书不包含私钥

从我在你的C#代码中看到的情况来看,我猜你是从Windows证书商店获取证书的。此存储区可以包含带有或不带有私钥的证书

另一方面,
.cer
文件(通常)不包含私钥-它们只有公钥。这就是为什么与它签约是不可能的

我猜您已经从Windows证书存储导出了
.cer
文件,并且没有选择“导出私钥”选项。如果您以
.pfx
.pvk
格式重新导出该文件并尝试使用该文件签名,您的运气会更好

rsa_key.sign("Hello World", "")