有人问起怎么在.NET 1.1里面用byte[]创建X509Certificate实例,以及怎么用X509Certificate来访问需要客户端证书的Web Service。MSDN里面对.NET 1.1里面怎么用证书讲的不是很完整,虽然有例子代码,但是第一次用的人还是需要费一番精神才能搞出来。我从硬盘里找了段以前的code给了他,顺便也在这里贴一下,也好让各种搜索引擎访问到:
//.net 1.1 version
bdk bd = new bdk();
StreamReader reader = new StreamReader(path); //path of .cer file
string certbody = reader.ReadToEnd();
certbody=certbody.Replace("-----END CERTIFICATE-----","");
certbody=certbody.Replace("-----BEGIN CERTIFICATE-----","");
certbody=certbody.Replace("\r\n","");
// Get client certificate
byte[] certbytes = System.Convert.FromBase64String(certbody);
X509Certificate cert = new X509Certificate(certbytes);
bd.ClientCertificates.Clear();
bd.ClientCertificates.Add(cert);
//Then we can TestConnection
//if failed , TestConnection will throw an SoapException, try to catch it
string aa;
bd.TestConnection("input", out aa);
这里的.cer文件是从Certificates MMC里面export出来的,或者也可以从IE的option里面导出。导出时候要选择"Not to export private key",用"Base64 Encode"格式导出。这里的"bdk"类就是一个Web Service的proxy类,TestConnection()是一个WebMethod。
在.NET 2.0里面,代码就可以简洁得多了,只需要一个调用就可以了,不需要自己手工读文件、去头去尾以及转换成byte[]了。
打印 | 张贴于 2006-03-25 06:04:00 | Tag:Dot NET


留言反馈
请给点帮助吧。
bao_jrmt@163.com
现在遇到了一个问题,想要请教:
程序是b/s 结构的,现在偶想要从程序中利用Request.ClientCertificate来获取客户端的数字证书,然后从中提取数字证书上的SubjectName,根据此SubjectName来利用VS.NET 2005中的X509Store类从客户端本地读取相应的证书,然后获取私钥,对要发送的信息进行数字签名,然后发送。
问题:我的想法是像上面一样的,可是具体实现的时候却有一个问题,好像没有权限对客户端本地的证书存储区进行访问,没有办法读取里面的证书。不知道怎样解决这个问题,因为证书存储区好像只是一个“逻辑上的名称”,具体数字证书到底在本地机子上的哪个物理区域存放偶并不知道,也没有找到相关资料。
请帮帮忙吧,谢谢了。偶的电子邮件地址是olivia0318@vip.sina.com 期盼尽快得到您的回复。
HttpWebRequest httpReq = (HttpWebRequest)HttpWebRequest.Create( url );
System.Security.Cryptography.X509Certificates.X509Certificate certificate = System.Security.Cryptography.X509Certificates.X509Certificate.CreateFromCertFile( ClientInfo.Certificateinfo );
httpReq.ClientCertificates.Add( certificate );
错了,是这样的代码。
X509Certificate cert = new X509Certificate();
cert.Clear();
cert.Add(@"c:\windows\mycert.cer");
不过后来我就不搞Windows Mobile了。后来我跑到MSN组了,一直到现在。:)