使用Go添加HTTPS的实现代码示例!
简介
现在的网站没有HTTPS都不好意思见人了.
超文本传输安全协议(英语:HyperTextTransferProtocolSecure,缩写:HTTPS;常称为HTTPoverTLS、HTTPoverSSL或HTTPSecure)是一种通过计算机网络进行安全通信的传输协议。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,keyFilestring)error
对比一下就知道了,只需要两个参数就可以实现HTTPS了.
这两个参数分别是证书文件的路径和私钥文件的路径.
通常要获取这两个文件需要从证书颁发机构获取.
虽然有免费的,但还是比较麻烦,通常还需要域名.
为了简单起见,这里使用自签名证书,当然,这样的证书是不会被浏览器信任的.
生成证书和私钥
如果是window系统,可以在gitbash中运行.
MSYS_NO_PATHCONV=1是专为gitbash设置的环境变量,没有的话会报错.
MSYS_NO_PATHCONV=1opensslreq-new-nodes-x509-outserver.crt-keyoutserver.key-days3650-subj"/C=CN/ST=SH/L=SH/O=CoolCat/OU=CoolCatSoftware/CN=127.0.0.1/emailAddress=coolcat@qq.com"
PowerShell版本,需要指定配置路径-config,默认应该是"C:\ProgramFiles\Git\usr\ssl\openssl.cnf".
opensslreq-config"C:\ProgramFiles\Git\usr\ssl\openssl.cnf"-new-nodes-x509-outserver.crt-keyoutserver.key-days3650-subj"/C=CN/ST=SH/L=SH/O=CoolCat/OU=CoolCatSoftware/CN=127.0.0.1/emailAddress=coolcat@qq.com"
Linux下就可以直接运行吧.
opensslreq-new-nodes-x509-outserver.crt-keyoutserver.key-days3650-subj"/C=CN/ST=SH/L=SH/O=CoolCat/OU=CoolCatSoftware/CN=127.0.0.1/emailAddress=coolcat@qq.com"
这个命令会在当前目录生成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") ifcert!=""&&key!=""{ gofunc(){ //等待http服务正常启动 <-wait logrus.Infof("启动服务器在httpsaddress:%s",addrTLS) srv.Addr=addrTLS iferr:=srv.ListenAndServeTLS(cert,key);err!=nil&&err!=http.ErrServerClosed{ logrus.Fatalf("listenonhttps:%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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。