Golang設置https訪問,以及http如何重定向到https


設置https訪問:

原始代碼為http監聽:

func main() {
	server := &http.Server{
		Addr:           ":8080",
		...
	}

	go func() {
		if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf(err, "Listen: %s\n")
		}
	}()
	
	...
}

變為https監聽:

func main() {
	server := &http.Server{
		Addr:           ":8080",
		...
	}

	go func() {
		if err := server.ListenAndServeTLS("conf/server.crt", "conf/server.key"); err != nil && err != http.ErrServerClosed {
			log.Fatalf(err, "Listen: %s\n")
		}
	}()

	...
}

其中ListenAndServeTLS方法的兩個參數為SSL證書的下載文件,網上有專門生成證書的命令或工具,這種情況得到的證書,雖然可以訪問https,但證書無效,瀏覽器地址欄提示不安全。

騰訊雲可以免費申請SSL證書,但需要對填寫的域名進行驗證,如果不是騰訊雲的域名,還需要去域名對應解析商進行驗證,所以最好使騰訊雲的域名。

新用戶在騰訊雲花1塊錢買了個域名,自帶SSL證書,域名審核通過后,申請免費SSL證書,填寫該域名,選擇自動DNS驗證,驗證通過后,即可下載證書。從下載內容Apache文件夾中取出一個.crt文件和.key文件存放本地,作為server.ListenAndServeTLS()函數的兩個參數,參數傳文件路徑即可。

此時啟動項目,訪問:https://localhost:8080 可行,訪問:http://localhost:8080 不可行。

https訪問,提示不安全,證書無效:

如圖:
在這里插入圖片描述
這種情況,只需把ip替換成證書對應的域名即可,前提是域名已經和你的服務器ip進行了解析。這里我用剛申請的域名和我本地電腦ip進行了解析,用域名進行訪問后,顯示正常,不再提示不安全:
在這里插入圖片描述

http重定向到https:

此處結合Gin框架處理,http重定向到https,用到第三方包:

go get github.com/unrolled/secure

利用secure包寫一個中間件,設置http重定向到https具體哪個url上:

//設置http重定向到https
func TlsHandler() gin.HandlerFunc {
	return func(c *gin.Context) {
		secureMiddleware := secure.New(secure.Options{
			SSLRedirect: true,
			SSLHost:     "dubinyang.xyz:8081",
		})
		
		err := secureMiddleware.Process(c.Writer, c.Request)
		if err != nil {
			return
		}
		
		c.Next()
	}
}

main函數里同時監聽http和https:

func main() {
	g:= gin.Default()
	//加載中間件
    g.Use(TlsHandler())

	server := &http.Server{
		Addr:           ":8080",
		...
	}

	//監聽http
	go func() {
		if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf(err, "Listen: %s\n")
		}
	}()

	//監聽https
	go func() {
		//端口不可重復監聽
		//此處更換8080端口為8081,直接用gin的RunTLS()函數進行監聽
		//繼續用server的ListenAndServeTLS()函數效果一樣,建server2,Addr變為為":8081"即可
		if err := g.RunTLS(":8081", "conf/server.crt", "conf/server.key"); err != nil && err != http.ErrServerClosed {
			log.Fatalf(err, "Listen: %s\n")
		}
	}()

	...
}

此時訪問:http://localhost:8080,會自動重定向到:https://dubinyang.xyz:8081。

如果http監聽80端口,https監聽443端口,兩個端口都可隱藏,重定向時地址欄不會發生端口變化。

公眾號:李田路口

Alt


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM