从数据库中检索证书时验证数字签名

时间:2013-07-01 16:45:27

标签: c# digital-signature

我遇到一个非常奇怪的问题,我根本无法理解为什么会这样。

我有一个客户端和一个服务器。这两个应用程序通过SOAP Web服务进行通信。现在,在能够与服务器通信之前,客户端必须在服务器的网站上注册并上传数字证书。服务器将数字证书保存在数据库中。

当客户进行网络服务呼叫时,他会使用他在供应商网站上传的数字证书的私钥将详细信息连同一起的详细信息的数字签名一起发送。

然后,客户端将详细信息和数字签名发送到服务器。服务器识别客户端,从数据库中检索他的证书并提取公钥以验证数字签名。

奇怪的是,双方的公钥完全相同。

另一个奇怪的事情是,当我在服务器上更改代码时,不是从数据库中检索证书,而是从证书存储区检索它(就像我在客户端中所做的那样),数字签名正确匹配。

我真的不知道出了什么问题。有人可以帮忙吗?我非常感激。

1 个答案:

答案 0 :(得分:0)

经过几个小时的调试和绝望,我终于找到了问题所在。当我从数据库加载证书时,显然它不允许程序访问公钥。

出于这个原因,我在表格中为公钥添加了一列,并在注册过程中提取了公钥,并将其保存为XML字符串,如下所示:

RSACryptoServiceProvider csp = (RSACryptoServiceProvider)cert.PublicKey.Key;
string public_key = csp.ToXMLString(false); //to store public key only

然后我把它保存在数据库中。为了验证签名,我从数据库加载密钥并将其传递给csp,如下所示:

RSACryptoServiceProvider csp = new RSACryptoServiceProvider();
csp.FromXMLString(public_key);

我希望这个答案对某些人有帮助,因为很难为我追踪问题,而且我浪费了很多时间。