最近开发一个需求,涉及获取服务端https证书。一般进行https调用我们都不太关心底层细节,直接使用WebClient或者HttpWebRequest来发送请求,这两种方法都无法获取证书信息,需要用到ServicePoint,这个类用于提供HTTP连接的管理。


写个Demo,拿新浪首页试一下:

usingSystem;usingSystem.Net;usingSystem.Security.Cryptography.X509Certificates;namespaceGetServerCertificateDemo{classProgram{staticvoidMain(string[]args){//用WebClient访问新浪首页varhttp=newWebClient();varuri=newUri("https://www.sina.com.cn");http.DownloadString(uri);//通过Uri获取ServicePointvarservicePoint=ServicePointManager.FindServicePoint(uri);//取服务端证书,X509Certificate格式,转一下varserverCert=newX509Certificate2(servicePoint.Certificate);Console.WriteLine("颁发给:{0}",serverCert.Subject);Console.WriteLine("颁发者:{0}",serverCert.Issuer);Console.WriteLine("序列号:{0}",serverCert.SerialNumber);Console.WriteLine("指纹:{0}",serverCert.Thumbprint);Console.WriteLine("起始:{0}",serverCert.NotBefore);Console.WriteLine("过期:{0}",serverCert.NotAfter);}}}


运行看效果:


上半部分是程序运行结果,下面是用Firefox查看的服务端证书信息,各项信息都能对应上。如果程序中涉及多个不同服务器的访问也没关系,关键在于根据Uri获取ServicePoint,然后取到的证书就是此服务器的了。