Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过X509Certificate加载时,私钥证书不支持数字签名_C#_.net_Security_Openssl_X509certificate - Fatal编程技术网

C# 通过X509Certificate加载时,私钥证书不支持数字签名

C# 通过X509Certificate加载时,私钥证书不支持数字签名,c#,.net,security,openssl,x509certificate,C#,.net,Security,Openssl,X509certificate,最近,我遇到了一个需要与java web服务交换SOAP消息的问题,在java web服务中,通信必须对消息进行数字签名。正如预期的那样,该过程是使用私钥对消息进行签名,以便对方站点使用公共密钥e.t.c对其进行验证。这次唯一的区别是,对方是授权机构本身 我最初使用以下命令创建一个证书请求 openssl req -new -newkey rsa:1024 -keyout myprivatekey.pem -out myrequest.pem 上面的命令创建私钥和我的证书请求。之后,我(通

最近,我遇到了一个需要与java web服务交换SOAP消息的问题,在java web服务中,通信必须对消息进行数字签名。正如预期的那样,该过程是使用私钥对消息进行签名,以便对方站点使用公共密钥e.t.c对其进行验证。这次唯一的区别是,对方是授权机构本身

我最初使用以下命令创建一个证书请求

openssl req -new -newkey rsa:1024 -keyout myprivatekey.pem  -out myrequest.pem 
上面的命令创建私钥和我的证书请求。之后,我(通过他们的站点)向他们发送证书请求“myrequest.pem”,以便他们授权证书并创建最终(有效)证书。当我收到我的答案(比如授权证书“complete.pem”)以及之前生成的myprivatekey.pem时,我创建了.pfx私钥,该私钥应该可以立即使用

openssl pkcs12 -export -out myprivatekey.pfx -in complete.pem -inkey myprivatekey.pem -name "testcertificate"
上面创建了myprivatekey.pfx,我成功地根据证书验证了它。当我尝试使用以下代码通过Studio 2005和WSE 3.0对邮件进行签名时,就会出现问题:

X509Certificate2 cert = new X509Certificate2(path,"pass");
X509SecurityToken certToken = new X509SecurityToken(cert);
certToken的SupportsDigitalSignature属性设置为false,因此我无法对邮件进行签名,因此无法继续。请注意,使用我自己颁发并加载到X509SecurityToken中的自签名证书和私钥的相同过程似乎支持数字签名(属性为true)

我想这与我从他们那里得到的最终授权证书有关,但我开始怀疑我做错了什么


是否知道要检查什么?

将您的证书安装到Windows证书存储(双击资源管理器中的PFX文件)。然后转到Internet Explorer中的“Internet设置”对话框,并在“内容”选项卡上找到“证书”按钮。在打开的对话框中,查找已安装的证书并浏览其详细信息。检查密钥使用字段。它必须包括数字签名(或类似文字)


更新:正如我在下面的评论中提到的,如果是另一方生成了证书,您可以在处理您的请求时询问他们的软件是否正确设置了密钥使用扩展。通常,CA的工作是设置密钥用法,因为他们授权您将此证书用于特定目的

您的证书可能未将数字签名作为有效密钥使用。您可以使用以下命令进行检查:

openssl x509 -in complete.pem -purpose

使用-x509开关生成自签名证书时,会“请求”不同的默认扩展名。检查您的,尤其是req_扩展和x509_扩展部分。

在OP的情况下,证书颁发机构创建证书,CA有责任正确设置密钥使用扩展。很可能他们没有这样做(只是从请求中复制扩展名),并且请求根本不包括密钥用法。@Eugene-当CA有一个系统时,当您向他们提交单个文件请求时,请求是指示您需要哪些用法/扩展名的机制。否。您提交PKCS#10请求,其中可能包含扩展。但是,如果您向CA发送请求,CA将决定要设置的密钥用法。想查查吗?创建SSL请求并尝试使用此请求从任何CA订购代码签名证书。感谢您的回答。正如Damien所说,我的配置文件缺少所需的扩展名,因此我发布了一个具有正确用法的扩展名;然而,权威机构(再次)颁发了一份没有所需密钥用法的证书,所以我想这毕竟是他们的错(正如Eugene所声称的)。这一讨论对我也很有用。当我使用PFXImportCertStore导入第三方CA颁发的PFX时,密钥会自动映射到AT_密钥交换,而不是AT_签名-,但证书的密钥使用表明它用于数字签名、密钥加密等,您是否克服了任何此类问题?为什么会这样奇怪?如何将AT_密钥交换重新映射到AT_签名?谢谢