我在做一个项目,利用 windows server 2003 的“证书颁发机构”自建了CA(要求这样),然后从该CA申请了“客户端验证” 类型的数字证书安装到浏览器中。目前已经实现了用户申请浏览网站的一些信息的时候获取它的客户端证书、判断,根据限定决定是否有访问的权限(就是用HttpClientCertificate类完成的)。
   偶就是想要实现利用用户从CA申请的数字证书来对他要“传送信息”进行数字签名,偶想只有获取了该证书的“私钥”才能进行数字签名,查了很多资料可是还是无果。下面是偶根据自己想的写的代码,可是运行不成功,希望能够帮忙看看,谢谢! 
  
//****************************下面是偶的一些实践,代码是点击Button中的(但是有问题)************************//
 
 HttpClientCertificate cert = Request.ClientCertificate;if (cert.IsPresent)
                {
                    //string ObjectName = GetObjectName();//获取客户端证书的CN 
                    string ObjectName = "olivia";//测试数据                // 打开证书存储区
                X509Store store = new X509Store(StoreName.My);
                store.Open(OpenFlags.ReadWrite);                // 检索证书 
               X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySubjectName, ""+ObjectName+"", false); 
               
                if (certs.Count == 0) return;
                X509Certificate2 ClientCertificate = certs[0];
                store.Close(); // 关闭存                if (ClientCertificate.HasPrivateKey)
                    {                    RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
                    rsaProvider.FromXmlString(ClientCertificate.PrivateKey.ToXmlString(true));//加在私钥 
                    string SignContract = Convert.ToBase64String(rsaProvider.Encrypt(HashContract, false));//数字签名
                    Session["SignContract"] = SignContract;//存储数字签名
                       }
                    else
                    {
                        Response.Write("<scrip defer>alter('证书中不包含私钥!');</script>");
                    }                }//如果证书存在验证其有效性
                else
                {
                    Response.Write("<scrip defer>alter('您没有获得数字证书!');</script>");
                }
                   
//*******************************************************************************//
问题:1、我是想要获取客户端证书中的cn后,根据这个cn来在客户端的本地(机子)的证书存储块中根据cn来查找,可是这段程序的运行结果是“certs.Count == 0“,就没有办法找到,偶不知道自己的想法是不是有什么错误啊? 
2、偶还作了关于HasPeivateKey 的实验。从客户端的浏览器中把申请的证书“导出“(奇怪,导出证书的时候不允许导出“私钥“),然后在本地作了测试:
   X509Certificate2 ClientCert = new X509Certificate2(X509Certificate2.CreateFromCertFile("c:\\olivia.cer"));//读取客户端证书内容可是ClientCertificate.HasPrivateKey 竟然是false,也就是说不包含“私钥“,这又是怎么回事情啊? 是不是因为私钥没有随证书一起导出呢(它默认的那一项是灰的不允许选)?    或者觉得偶得想法有问题,也可以根据目的-想要实现“利用从自建CA申请的数字证书实现数字签名“提出您的想法(最好能够有代码) 期盼尽快得到您的回复,小女子在此谢过了!
  或者给偶邮件也可以[email protected]

解决方案 »

  1.   

    怎么没有高人进来指点一下啊?
    偶又做了实验,大概知道问题所在,可是没有想出来怎么解决。
    因为HttpClientCertificate获取客户端证书肯定是不能获得证书的私钥匙的(这个先前也是知道的)可是偶本来的想法是通过它获取这个客户端证书中CN的值(其实也就是证书所有者),然后在证书所有者本地的“证书存储区”来根据CN的值获取其对应的证书,然后获取PrivateKey进行数字签名。偶觉得这样是可以实现的,要不然数字证书是怎样进行数字签名的呢,肯定是可以获取证书以及证书中的PriavateKey的。
       上面的代码是没有写错的,可是问题是:好像没有权限获取客户端证书存储区的内容,也就是无法获取它里面的任何证书,包括certs.cout值都没有办法获得。这个结论是通过自己试验获得的:也就是说本地的证书存储区明明是有证书的,可是返回来的certs.cout值仍旧是0。
      不知道应该怎样解决这个问题,还是偶的想法有什么问题么?
      其实偶就是要最终实现利用申请的数字证书完成数字签名,然后通过网络传输带有数字签名的信息。请高手给与指点啊~``~~~~~~~
       偶的邮件:[email protected]
             msn:[email protected]分值不够可以加的哈,急切盼望解救哈~
      

  2.   

    联系MVM郑子颖问一下,他比较熟,他的msn和yahoo messager等联系方式发留言给你了。
      

  3.   

    关于这个问题有了新的认识,请大家看看新发的问题贴,高手们帮帮忙哈啊!
    新的问题帖子地址:
    http://community.csdn.net/Expert/topic/4659/4659808.xml?temp=.7890436
      

  4.   

    谁有vs2005lpha版哈,需要里面的system.security.dll 
       [email protected]
    谢谢哈~