[C#] 透過 httpclient 模擬判斷憑證是不是過期

2025-10-20

最近遇到一些管理的憑證到期,忘記續約,後來決定寫一隻程式來檢查一下,因為很多管理端都不是在我這邊

所以有點麻煩,但是我得幫忙續約 :'( 


這邊我就封裝成一個 function ,這樣就可以直接呼叫是否過期,如果要改寫就自行採用,可以在判斷 NotAfter 的部分

改寫成如果過期前幾天開始就發送提醒的通知,這邊就自行改寫吧,因為為了避免一些直接跟 host 產生的 shaking 問題

這邊後來我改成 httpclient 去模擬瀏覽器去抓取會比較準

public static void CheckSslCertificate(string url) { try { // 建立 HttpClientHandler 並攔截憑證驗證 using var handler = new HttpClientHandler(); handler.ServerCertificateCustomValidationCallback = (request, cert, chain, errors) => { var x509 = new X509Certificate2(cert); Console.WriteLine("=== SSL 憑證資訊 ==="); Console.WriteLine("網站:" + url); Console.WriteLine("主題:" + x509.Subject); Console.WriteLine("頒發者:" + x509.Issuer); Console.WriteLine("生效日:" + x509.NotBefore); Console.WriteLine("到期日:" + x509.NotAfter); Console.WriteLine("是否過期:" + (DateTime.Now > x509.NotAfter ? "是" : "否")); Console.WriteLine("剩餘天數:" + (x509.NotAfter - DateTime.Now).TotalDays + " 天"); Console.WriteLine("===================="); return true; }; using var client = new HttpClient(handler); // 模擬瀏覽器 User-Agent,避免被 CDN 阻擋 client.DefaultRequestHeaders.Add( "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " + "(KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" ); var task = client.GetAsync(url); task.Wait(); var response = task.Result; Console.WriteLine("HTTP 狀態碼: " + (int)response.StatusCode); } catch (Exception ex) { Console.WriteLine("發生錯誤:" + ex.Message); } }

呼叫端

CheckSslCertificate("https://www.google.com"); CheckSslCertificate("https://blog.no2don.com"); //沒有SSL CheckSslCertificate("https://no2don.com");


result:


reference:
程式碼部分採用 AI 輔助撰寫 




當麻許的碎念筆記 2014 | Donma Hsu Design.