最近開發一個需求,涉及獲取服務端https證書。一般進行https調用我們都不太關心底層細節,直接使用WebClient或者HttpWebRequest來發送請求,這兩種方法都無法獲取證書信息,需要用到ServicePoint,這個類用於提供HTTP連接的管理。 ...
最近開發一個需求,涉及獲取服務端https證書。一般進行https調用我們都不太關心底層細節,直接使用WebClient或者HttpWebRequest來發送請求,這兩種方法都無法獲取證書信息,需要用到ServicePoint,這個類用於提供HTTP連接的管理。
寫個Demo,拿新浪首頁試一下:
using System; using System.Net; using System.Security.Cryptography.X509Certificates; namespace GetServerCertificateDemo { class Program { static void Main(string[] args) { //用WebClient訪問新浪首頁 var http = new WebClient(); var uri = new Uri("https://www.sina.com.cn"); http.DownloadString(uri); //通過Uri獲取ServicePoint var servicePoint = ServicePointManager.FindServicePoint(uri); //取服務端證書,X509Certificate格式,轉一下 var serverCert = new X509Certificate2(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,然後取到的證書就是此伺服器的了。