設置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端口,兩個端口都可隱藏,重定向時地址欄不會發生端口變化。
公眾號:李田路口