如何在go中驗證SSL憑證

更新於 發佈於 閱讀時間約 5 分鐘

👨‍💻如何在go中驗證SSL憑證

因之前玩過監控證書,最近在接觸golang因此來看看有甚麼方法能夠取得憑證到期日,最後發現有crypto/tls這個module可以用,驗證步驟簡單三步如下

1. 確認網站是否有SSL證書

package main

import (
"crypto/tls"
)
func main() {
conn, err := tls.Dial("tcp", "example.com:80", nil)
if err != nil {
panic("Server doesn't support SSL certificate err: " + err.Error())
}
}

上述程式碼首先使用 tls.Dial 建立TLS連線,語法規則為

tls.Dial(protocol, website, tls config)

連線成功則返回一個tls.Conn

執行後會噴以下錯誤

panic: Server doesn't support SSL certificate err: tls: first record does not look like a TLS handshake

接著將網站改為google重新執行一次程式碼,沒有任何輸出表示正常,也代表網站有啟用SSL

package main

import (
"crypto/tls"
)
func main() {
conn, err := tls.Dial("tcp", "www.google.com:443", nil)
if err != nil {
panic("Server doesn't support SSL certificate err: " + err.Error())
}
}

2. 確認SSL憑證和網站hostname是否吻合

可使用conn.VerifyHostname驗證server的憑證與hostname是否吻合

package main

import (
"crypto/tls"
)
func main() {
conn, err := tls.Dial("tcp", "www.google.com:443", nil)
if err != nil {
panic("Server doesn't support SSL certificate err: " + err.Error())
}
err = conn.VerifyHostname("www.google.com")
if err != nil {
panic("Hostname doesn't match with certificate: " + err.Error())
}
}

3. 驗證SSL憑證的到期日

我們可以透過conn.ConnectionState().PeerCertificates來取得憑證,然後透過NotAfter來取得憑證到期日

package main

import (
"crypto/tls"
"fmt"
)
func main() {
conn, err := tls.Dial("tcp", "www.google.com:443", nil)
if err != nil {
panic("Server doesn't support SSL certificate err: " + err.Error())
}
err = conn.VerifyHostname("www.google.com")
if err != nil {
panic("Hostname doesn't match with certificate: " + err.Error())
}
expiry := conn.ConnectionState().PeerCertificates[0]
fmt.Printf("Issuer Name: %s\n", expiry.Issuer)
fmt.Printf("Expiry: %s \n", expiry.NotAfter.Format("2006-01-02"))
fmt.Printf("Common Name: %s \n", expiry.Issuer.CommonName)
}

📚Reference

留言
avatar-img
留言分享你的想法!
avatar-img
Alan的開發者天地
19會員
83內容數
golang
Alan的開發者天地的其他內容
2023/10/04
👨‍💻 簡介 最近想要透過小實作來撰寫筆記,達到做中學的效果,因此就來實作個小爬蟲順便結合前面學到的package做一個小複習。
Thumbnail
2023/10/04
👨‍💻 簡介 最近想要透過小實作來撰寫筆記,達到做中學的效果,因此就來實作個小爬蟲順便結合前面學到的package做一個小複習。
Thumbnail
2023/09/28
👨‍💻簡介 今天來介紹一個自己開發後端蠻常用的一個 package,promptui,拿來做menu真的很方便,promptui有兩個主要的輸入模式: Prompt:跳出單行使用者輸入。 Select:提供一個選項列表供使用者選擇。
Thumbnail
2023/09/28
👨‍💻簡介 今天來介紹一個自己開發後端蠻常用的一個 package,promptui,拿來做menu真的很方便,promptui有兩個主要的輸入模式: Prompt:跳出單行使用者輸入。 Select:提供一個選項列表供使用者選擇。
Thumbnail
2023/09/26
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
Thumbnail
2023/09/26
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
Thumbnail
看更多
你可能也想看
Thumbnail
這篇文章將會提供在伺服器上安裝憑證的步驟,包括下載憑證,設定php.ini以及重新啟動Web Server等。
Thumbnail
這篇文章將會提供在伺服器上安裝憑證的步驟,包括下載憑證,設定php.ini以及重新啟動Web Server等。
Thumbnail
授權碼模式連線流程 用戶端請求自己的伺服器。 伺服器發現用戶沒登入,就導向認證伺服器。 認證伺服器顯示授權頁面,等待用戶授權。 用戶確認授權後,授權頁面會向認證伺服器請求授權碼。 用戶獲取授權碼。 用戶將授權碼傳給伺服器。 伺服器拿授權碼向認證伺服器取得token。 應用註冊
Thumbnail
授權碼模式連線流程 用戶端請求自己的伺服器。 伺服器發現用戶沒登入,就導向認證伺服器。 認證伺服器顯示授權頁面,等待用戶授權。 用戶確認授權後,授權頁面會向認證伺服器請求授權碼。 用戶獲取授權碼。 用戶將授權碼傳給伺服器。 伺服器拿授權碼向認證伺服器取得token。 應用註冊
Thumbnail
配置 idleTimeout:在httpClient請求結束後,會繼續保持連線,直到超過idleTimeout值才會關閉連接。 connectionTimeout:和伺服器建立連線逾時,如果超過connectionTimeout值則會拋出SocketException異常。 maxConnec
Thumbnail
配置 idleTimeout:在httpClient請求結束後,會繼續保持連線,直到超過idleTimeout值才會關閉連接。 connectionTimeout:和伺服器建立連線逾時,如果超過connectionTimeout值則會拋出SocketException異常。 maxConnec
Thumbnail
Google Cloud Engine VM 有點問題, OS 是 Debian 7 ,我要進去查看問題在哪邊,用 gcloud compute ssh 指令 SSH 進去,不過卻跳出 Permission denied (publickey) 的錯誤,經過一番排查終於解決 SSH 無法登入的問題。
Thumbnail
Google Cloud Engine VM 有點問題, OS 是 Debian 7 ,我要進去查看問題在哪邊,用 gcloud compute ssh 指令 SSH 進去,不過卻跳出 Permission denied (publickey) 的錯誤,經過一番排查終於解決 SSH 無法登入的問題。
Thumbnail
有遇過 pull 自己的私有倉庫無法 pull 下來的問題嗎,今天來教大家如何解決無法 pull image 問題,可暫時解決狀況 錯誤訊息 出現以下訊息代表,這個 docker registry 並沒有經過 https 憑證,所以 docker 會把它擋下來 Error response f
Thumbnail
有遇過 pull 自己的私有倉庫無法 pull 下來的問題嗎,今天來教大家如何解決無法 pull image 問題,可暫時解決狀況 錯誤訊息 出現以下訊息代表,這個 docker registry 並沒有經過 https 憑證,所以 docker 會把它擋下來 Error response f
Thumbnail
當開發大型Web應用時,TypeScript可以提供靜態類型檢查,幫助開發者捕捉潛在的錯誤。結合Gin,你可以建立強大的、類型安全的後端API。
Thumbnail
當開發大型Web應用時,TypeScript可以提供靜態類型檢查,幫助開發者捕捉潛在的錯誤。結合Gin,你可以建立強大的、類型安全的後端API。
Thumbnail
👨‍💻 簡介 最近想要透過小實作來撰寫筆記,達到做中學的效果,因此就來實作個小爬蟲順便結合前面學到的package做一個小複習。
Thumbnail
👨‍💻 簡介 最近想要透過小實作來撰寫筆記,達到做中學的效果,因此就來實作個小爬蟲順便結合前面學到的package做一個小複習。
Thumbnail
👨‍💻簡介 在軟體開發中,錯誤無所不在。無論是網路請求失敗、檔案不存在,還是數學計算錯誤,處理錯誤是任何開發者的日常工作,系統的穩定度基本取決於對於錯誤處理是否全面,好的錯誤處理也可以產生適當的錯誤訊息,讓 Debug 更加容易。
Thumbnail
👨‍💻簡介 在軟體開發中,錯誤無所不在。無論是網路請求失敗、檔案不存在,還是數學計算錯誤,處理錯誤是任何開發者的日常工作,系統的穩定度基本取決於對於錯誤處理是否全面,好的錯誤處理也可以產生適當的錯誤訊息,讓 Debug 更加容易。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News