1. 程式人生 > 程式設計 >使用Go新增HTTPS的實現程式碼示例

使用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

是專為 git bash 設定的環境變數,沒有的話會報錯.

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。