如何在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
17會員
83內容數
golang
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
安裝官方 nginx 先在/etc/yum.repos.d新增一個nginx.repo的檔案 並加入以下內容 [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgc
在今天的數字世界中,網站安全性是極為重要的議題。隨著越來越多的網站選擇採用HTTPS協議加密數據傳輸,但這並不意味著它是絕對安全的。事實上,HTTPS本身也存在著一些安全隱患,這些隱患可能會影響網站的安全性和用戶的數據隱私。 1. SSL/TLS 憑證漏洞 HTTPS的加密基於SSL/TLS
在今日數位化的世界中,保護資料的安全性尤為重要。加密憑證(SSL/TLS Certificates)扮演著確保網站和用戶之間資料傳輸安全的重要角色。本文將深入探討加密憑證的原理、作用以及如何選擇適合的加密憑證來保護您的網站。 1. 加密憑證的基本概念 加密憑證是一種數位檔案,用於證明網站身份的真
Thumbnail
前段時間我們有介紹「【Python 軍火庫🧨 - websockets】雙向溝通的渠道」, 這種方式可以達到基本的連線沒問題,但隨著資安意識的抬頭, 我們的websocket連線也會需要在通道之上進行加密, 那麼我們將根據使用情境來教您如何選用適當的連線。 Server端 我們的Serve
大家架站最在意什麼事情呢?最近深陷於建立自己的部落格的水深火熱當中。我想和大家分享一下我對於架站的一些雜談心得。 首先,讓我們來談談SSL。對於架站的初學者來說,SSL可能會聽起來有點高大上,但其實它是非常重要的一個東西。SSL(安全套接層)能夠保護你的網站和訪問者之間的數據傳輸安全,讓你的網
Thumbnail
這篇文章將會提供在伺服器上安裝憑證的步驟,包括下載憑證,設定php.ini以及重新啟動Web Server等。
Thumbnail
ping 指令用於排除網路連線故障,但當你遇到無法時候時?不要慌,這裡有解決方法,錯誤的原因通常有這些: 未安裝 ping 程式 $PATH 環境變數中未設定 ping命令損壞 未使用 sudo 權限存取該指令 我們可以透過一些方法簡單的檢測並且解決,例如我們可以先驗證命令可用性: wh
Thumbnail
授權碼模式連線流程 用戶端請求自己的伺服器。 伺服器發現用戶沒登入,就導向認證伺服器。 認證伺服器顯示授權頁面,等待用戶授權。 用戶確認授權後,授權頁面會向認證伺服器請求授權碼。 用戶獲取授權碼。 用戶將授權碼傳給伺服器。 伺服器拿授權碼向認證伺服器取得token。 應用註冊
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
安裝官方 nginx 先在/etc/yum.repos.d新增一個nginx.repo的檔案 並加入以下內容 [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgc
在今天的數字世界中,網站安全性是極為重要的議題。隨著越來越多的網站選擇採用HTTPS協議加密數據傳輸,但這並不意味著它是絕對安全的。事實上,HTTPS本身也存在著一些安全隱患,這些隱患可能會影響網站的安全性和用戶的數據隱私。 1. SSL/TLS 憑證漏洞 HTTPS的加密基於SSL/TLS
在今日數位化的世界中,保護資料的安全性尤為重要。加密憑證(SSL/TLS Certificates)扮演著確保網站和用戶之間資料傳輸安全的重要角色。本文將深入探討加密憑證的原理、作用以及如何選擇適合的加密憑證來保護您的網站。 1. 加密憑證的基本概念 加密憑證是一種數位檔案,用於證明網站身份的真
Thumbnail
前段時間我們有介紹「【Python 軍火庫🧨 - websockets】雙向溝通的渠道」, 這種方式可以達到基本的連線沒問題,但隨著資安意識的抬頭, 我們的websocket連線也會需要在通道之上進行加密, 那麼我們將根據使用情境來教您如何選用適當的連線。 Server端 我們的Serve
大家架站最在意什麼事情呢?最近深陷於建立自己的部落格的水深火熱當中。我想和大家分享一下我對於架站的一些雜談心得。 首先,讓我們來談談SSL。對於架站的初學者來說,SSL可能會聽起來有點高大上,但其實它是非常重要的一個東西。SSL(安全套接層)能夠保護你的網站和訪問者之間的數據傳輸安全,讓你的網
Thumbnail
這篇文章將會提供在伺服器上安裝憑證的步驟,包括下載憑證,設定php.ini以及重新啟動Web Server等。
Thumbnail
ping 指令用於排除網路連線故障,但當你遇到無法時候時?不要慌,這裡有解決方法,錯誤的原因通常有這些: 未安裝 ping 程式 $PATH 環境變數中未設定 ping命令損壞 未使用 sudo 權限存取該指令 我們可以透過一些方法簡單的檢測並且解決,例如我們可以先驗證命令可用性: wh
Thumbnail
授權碼模式連線流程 用戶端請求自己的伺服器。 伺服器發現用戶沒登入,就導向認證伺服器。 認證伺服器顯示授權頁面,等待用戶授權。 用戶確認授權後,授權頁面會向認證伺服器請求授權碼。 用戶獲取授權碼。 用戶將授權碼傳給伺服器。 伺服器拿授權碼向認證伺服器取得token。 應用註冊