• 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
    ")
    		}
    	}()
    	
    	...
    }
    

    变为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
    ")
    		}
    	}()
    
    	...
    }
    

    其中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
    ")
    		}
    	}()
    
    	//监听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
    ")
    		}
    	}()
    
    	...
    }
    

    此时访问:http://localhost:8080,会自动重定向到:https://dubinyang.xyz:8081。

    如果http监听80端口,https监听443端口,两个端口都可隐藏,重定向时地址栏不会发生端口变化。

    公众号:李田路口

    Alt

  • 相关阅读:
    vue自定义select组件
    基于better-scroll封装一个上拉加载下拉刷新组件
    vue自定义tap指令
    vue实现分页器(仿element)
    js异步队列之理解
    Element源码阅读(2)
    Element源码阅读(1)
    unity3d模仿魔兽世界鼠标对游戏操作
    unity3d制作小地图(MiniMap)的简单Demo
    利用unity3d自带的CharacterController包制作第一人称控制模型的简单Demo
  • 原文地址:https://www.cnblogs.com/dubinyang/p/12129926.html
Copyright © 2020-2023  润新知