使用Go新增HTTPS的實現程式碼示例
簡介
現在的網站沒有 HTTPS 都不好意思見人了.
超文字傳輸安全協議(英語:HyperText Transfer Protocol Secure,縮寫:HTTPS;常稱為 HTTP over TLS、HTTP over SSL 或 HTTP Secure)是一種通過計算機網路進行安全通訊的傳輸協議。HTTPS 經由 HTTP 進行通訊,但利用 SSL/TLS 來加密資料包。HTTPS 開發的主要目的,是提供對網站伺服器的身份認證,保護交換資料的隱私與完整性。這個協議由網景公司(Netscape)在 1994 年首次提出,隨後擴充套件到網際網路上。
HTTPS 的信任基於預先安裝在作業系統中的證書頒發機構(CA)。因此,到一個網站的 HTTPS 連線僅在這些情況下可被信任:
- 瀏覽器正確地實現了 HTTPS 且作業系統中安裝了正確且受信任的證書頒發機構;
- 證書頒發機構僅信任合法的網站;
- 被訪問的網站提供了一個有效的證書,也就是說它是一個由作業系統信任的證書頒發機構簽發的(大部分瀏覽器會對無效的證書發出警告);
- 該證書正確地驗證了被訪問的網站(例如,訪問https://example.com時收到了簽發給example.com而不是其它域名的證書);
- 此協議的加密層(SSL/TLS)能夠有效地提供認證和高強度的加密。
主要目的在於:
- 安全傳輸資料
- 防止中間人攻擊和竊聽
- 驗證伺服器的可信度
實踐
在 Go 中使用 HTTPS 也很簡單,介面如下:
func (srv *Server) ListenAndServe() error func (srv *Server) ListenAndServeTLS(certFile,keyFile string) error
對比一下就知道了,只需要兩個引數就可以實現 HTTPS 了.
這兩個引數分別是證書檔案的路徑和私鑰檔案的路徑.
通常要獲取這兩個檔案需要從證書頒發機構獲取.
雖然有免費的,但還是比較麻煩,通常還需要域名.
為了簡單起見,這裡使用自簽名證書,當然,這樣的證書是不會被瀏覽器信任的.
生成證書和私鑰
如果是 window 系統,可以在 git bash 中執行.
MSYS_NO_PATHCONV=1
MSYS_NO_PATHCONV=1 openssl req -new -nodes -x509 -out server.crt -keyout server.key -days 3650 -subj "/C=CN/ST=SH/L=SH/O=CoolCat/OU=CoolCat Software/CN=127.0.0.1/[email protected]"
PowerShell 版本,需要指定配置路徑 -config,預設應該是 "C:\Program Files\Git\usr\ssl\openssl.cnf".
openssl req -config "C:\Program Files\Git\usr\ssl\openssl.cnf" -new -nodes -x509 -out server.crt -keyout server.key -days 3650 -subj "/C=CN/ST=SH/L=SH/O=CoolCat/OU=CoolCat Software/CN=127.0.0.1/[email protected]"
Linux 下就可以直接執行吧.
openssl req -new -nodes -x509 -out server.crt -keyout server.key -days 3650 -subj "/C=CN/ST=SH/L=SH/O=CoolCat/OU=CoolCat Software/CN=127.0.0.1/[email protected]"
這個命令會在當前目錄生成 server.crt 證書檔案和 server.key 私鑰檔案,都複製到專案的 conf 目錄下.
修改配置檔案
在配置檔案 conf/config.yaml 中新增 HTTPS 相關的引數.
tls: addr: :443 # HTTPS 繫結埠 cert: conf/server.crt # 自簽發的數字證書 key: conf/server.key # 私鑰檔案
HTTPS 的預設埠就是 443,這裡也配置成 443,就可以在 URL 中省略埠號了.
修改啟動函式
一開始,啟動函式是在 goroutine 中啟動 HTTP 伺服器,
這裡增加一個 goroutine 來啟動 HTTPS 伺服器.
// 啟動 https 服務 cert := viper.GetString("tls.cert") key := viper.GetString("tls.key") addrTLS := viper.GetString("tls.addr") if cert != "" && key != "" { go func() { // 等待 http 服務正常啟動 <-wait logrus.Infof("啟動伺服器在 https address: %s",addrTLS) srv.Addr = addrTLS if err := srv.ListenAndServeTLS(cert,key); err != nil && err != http.ErrServerClosed { logrus.Fatalf("listen on https: %s\n",err) } }() }
啟動之後,就可以通過 https://127.0.0.1/v1/check/cpu 驗證一下了,
瀏覽器中開啟肯定是會顯示不安全的,因為證書無法通過驗證.
總結
HTTPS 是一種趨勢,也是未來. API 介面為了安全性,一般都是需要上 HTTPS 的.
而且在 Go 中使用 HTTPS 也挺簡單的,換個 TLS 結尾的函式就行了.
也可以只使用 HTTPS,禁止 HTTP 對外服務,
修改 HTTP 的配置引數 addr 為 localhost:port 就行.
當前部分的程式碼
作為版本v0.10.0
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。