这篇文章会大略先容https的连接过程,然后用go措辞实现一个大略的http做事,末了用例子演示了如何用nginx和腾讯负载均衡来改造http做事,使其切换到https。
一、为什么要拥抱httpshttps可以理解为http over ssl,既把http明文流量通过ssl协议进行加密传送,从而担保数据的安全性。这里依赖的是非对称加密和对称加密。网上干系先容的文章很多,大略列一下。
客户端在利用HTTPS办法与Web做事器通信时有以下几个步骤,如图所示。

(1)客户利用https的URL访问Web做事器,哀求与Web做事器建立SSL连接。
(2)Web做事器收到客户端要求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
(3)客户真个浏览器与Web做事器开始协商SSL连接的安全等级,也便是信息加密的等级。
(4)客户真个浏览器根据双方赞许的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
(5)Web做事器利用自己的私钥解密出会话密钥。
(6)Web做事器利用会话密钥加密与客户端之间的通信。
引自:https://www.cnblogs.com/wqhwe/p/5407468.html
在http传输前建立了一个安全的加密通道。几个地方小白可能不清晰,阐明下:
我们后面申请https的证书便是图中第1步返回的公钥,用于非对称加密。非对称加密只是用于客户端和做事端之间,协商好一个对称加密的密钥,后面的内容都利用对称机密。为什么不直接全部用非对称加密呢?由于非对称加密很慢,性能差;对称加密性能更高。https的好处:
基于 SSL 证书,可将站点由 HTTP(Hypertext Transfer Protocol)切换到 HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)—— 即基于安全套接字层(SSL)进行安全数据传输的加密版 HTTP协议。
站点运用 HTTPS 后将有以下上风:
1. 防流量挟制
全站 HTTPS 是根治运营商、中间人流量挟制的办理方案,不仅可以杜绝网页中被插入的小广告,更可以保护用户隐私安全。
2. 提升搜索排名
采取 HTTPS 可以帮忙搜索排名的提升,提高站点的可信度和品牌形象。
3. 杜绝钓鱼网站
HTTPS 地址栏绿色图标可以帮助用户识别出钓鱼网站,保障用户和企业的利益不受危害,增强用户信赖。
二、一个大略的http做事下面会用golang实现一个大略web做事,它会返回get要求参数中name的参数,并返回当前做事器的韶光。web做事走http,作为例子方便后面的演示。
2.1 腾讯云做事器go环境支配
买了个最低配的腾讯云做事器,操作系统是:Ubuntu Server 16.04.1 LTS 64位。
登录做事器,然后go该当是没有安装的。先下载当前最新的go安装包:
ubuntu@VM-45-13-ubuntu:~$ wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
解压缩:
ubuntu@VM-45-13-ubuntu:~$ sudo tar -C /usr/local -xzf go1.11.linux-amd64.tar.gz
设置环境变量,文件~/.profile中增加一行:
export PATH=$PATH:/usr/local/go/bin
生效:
source ~/.profile
测试下,查看当前go版本:
ubuntu@VM-45-13-ubuntu:~$ go versiongo version go1.11 linux/amd64
2.1.2 运行web做事
设置go的workplace的路径为$HOME/go,在文件~/.profile中增加一行:
export GOPATH=$HOME/go
然后source下:
source ~/.profile
创建文件夹:
mkdir -p ./go/src/testhttps/
2.2 本地支配大略的web做事
我写了个大略的web做事,创建文件main.go:
vi ~/go/src/testhttps/main.go
将下面代码复制进去:
package mainimport (\"大众fmt\公众\公众log\"大众\"大众net/http\"大众\"大众time\"大众)func sayHelloTime(w http.ResponseWriter, r http.Request) {r.ParseForm() //parse requestlog.Print(r.Form)name := r.Form.Get(\公众name\"大众) // get argumentresult := fmt.Sprintf(\公众Hello, %s! Current time : %s\n\"大众, name, time.Now()) // send data to clientfmt.Fprintf(w, result)}func main() {http.HandleFunc(\"大众/\"大众, sayHelloTime)err := http.ListenAndServe(\"大众127.0.0.1:8765\公众, nil) // run on 127.0.0.1:8765if err != nil {log.Fatal(\"大众error:\公众, err)}}
然后就可以运行啦,go build会天生一个可实行文件testhttps:
cd ~/go/src/testhttpsgo build./testhttps
另开个ssh,我们发送get要求,地址http://127.0.0.1:8765/?name=jj。返复书息如下:
ubuntu@VM-45-13-ubuntu:~$ curl http://127.0.0.1:8765/?name=jjHello, jj! Current time : 2018-10-03 01:09:45.860019907 +0800 CST m=+23.075722862
这时候web做事是跑在本地端口,外部网络是访问不到了。接下来要设置反向代理,让外部访问到。
2.3 设置nginx反向代理
安装nginx:
sudo apt-get install nginx
设置反向代理,文件/etc/nginx/sites-available/default中添加如下:
server { listen 8766; server_name .test.cn;#这里乱弄得,后面有用 location / { proxy_pass http://localhost:8765; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; }}
上面的意思是,nginx监听外部8766端口,将要求转发给localhost:8765。
打开浏览器访问网址,http://你的腾讯云公网ip:8766/。可以看到,我们在外网访问到了该做事。
8766转发可以访问到
8765端口外部访问不到
三、切换https接下来,我们将上面利用http协议的web做事切换到https。
3.1 申请证书
对付https协议,我们可以大略理解为:通过非对称加密技能建立起一个加密通道,然后http的明文走加密信道,担保安全。这里的根本是非对称加密,以是哀求有公钥和私钥。而常日说的https证书,它里面包含了公钥等信息。我们向可信的证书颁发机构申请证书,浏览器收到做事器发来的证书会去机构进行署名验证,确认无误后就可以进行开始建立安全的加密通信了。
企业型证书购买用度
写到这里就会想到很多事情:
由于国外技能的先入和垄断,这些颁发证书的机构一样平常都是国外巨子,我们申请证书虽然有免费的,但是企业型证书须要交一笔不菲的用度。这些证书颁发机构拥有你的私钥和公钥,以是说如果他们想要做恶或者透露了,你的加密就没有任何意义了。不知道大家是否有留神,之前用web登录12306购票网站,会弹出证书不屈安,由于他们是用的自己颁发的证书,而不是去机构申请,可能便是考虑到这点。但我刚登录了12306,创造现在已经切换为美国DigiCert机构颁发的证书。不仅https证书,还有申请域名、解析等等都要费钱,凭什么这些中介机构就能躺着赢利呢?现在区块链技能的涌现,给用技能冲破不信赖,颠覆这些中介构造带来了曙光!我还是很看好的!
12306的证书
言归正传,我用腾讯云里购买的域名作为例子:
3.1.1 腾讯云购买域名
这里不进行详细描述了,直接买了交钱就行。
3.1.2 申请免费证书
腾讯云SSL证书管理掌握台(https://console.cloud.tencent.com/ssl)
进入可以申请亚洲诚信颁发的免费1年的域名型证书,按照提示申请即可,通过审核后可以下载证书。
进入可以申请亚洲诚信颁发的免费1年的域名型证书,按照提示申请即可,通过审核后可以下载证书。
3.2 两种方案
3.2.1 nginx
利用web做事器来做,这里以nginx为例子。
文件/etc/nginx/sites-available/default中添加如下,www.example.com更换为自己的域名。
server { listen 443 ssl; server_name www.example.com; ssl_certificate /etc/nginx/www.example.com.crt;# crt的位置 ssl_certificate_key /etc/nginx/www.example.com.key;# key的位置 proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2; location / { proxy_pass http://localhost:8765; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; }
443端口默认是https利用,然后我们将要求转发给http://localhost:8765。这里还有一步便是须要设置域名解析到此云做事器ip。可以看到,https正常访问,返回结果正常,我们的域名前有把锁啦!
https设置成功
3.2.2 腾讯云负载均衡
证书支配到负载均衡
利用腾讯云的负载均衡来实现https是更推举的,2个缘故原由:
https是有一定的性能影响的。由于涉及到加解密,对付相应和做事器性能都有一定的影响,这也便是为什么https已涌现多年没有全面遍及的一个缘故原由。那么现在客户端到负载均衡间是https连接,性能问题由负载均衡搞定,由腾讯进行硬件级的优化等;负载均衡再将要求用http转发给我们后台的做事器,之前的代码也不须要做变动。当流量过大时,可以方便地进行横向扩展。负载均衡可以设置按权重、iphash等办法分发流量给后台。有唯一一个弊端便是,目前公网负载均衡是收费的,0.02元每小时,折算每个月才15块钱。以是大家可以根据自己的情形来做选择,我因此为这点钱无所谓额。
基本流程:负载均衡CLB便是一台做事器,给我们转发用。以是我们对域名设置解析,A类型记录,ip填入负载均衡CLB的vip。访问域名就会直接找到负载均衡CLB,然后CLB再把要求分发给我们绑定的云做事器。
ps:这里我们针对第二部分的http后台做事改造,端口8766。
A.购买负载均衡
先购买一个运用型负载均衡实例:
B.证书支配到负载均衡
然后将https证书支配至该负载均衡上,证书列表:https://console.cloud.tencent.com/ssl
C.设置负载均衡
然后就去负载均衡里面配置,这里的观点实在文档描述的并不足清晰,我捋一下:
首先,创建HTTP/HTTPS监听器。由于我们走的是默认443端口,如下图填入。这是客户端连接负载均衡的时候要访问的那个端口。然后,连续点+,创建HTTP/HTTPS转发规则。这里的意思可以根据域名后面的url路径来分发流量,我们设置为/。例如这里可以设置/image转发给某台机器,/text转发给某台机器。均衡办法便是设置用什么方法来分发流量。后面连续下一步填康健检讨和会话保持。末了,绑定云做事器CVM和端口。这里的意思,命中了转发规则后,分发给哪些云做事器、以及端口啊?由于我们的http后台做事在云做事器的8766端口,填入即可。我们测试下https,可以看到证书和返回结果都正常,成功。
四、总结
这里只是大略举例,个中还涉及到很多东西没有席卷进来。例如依赖负载均衡来实现https,如何进行自动伸缩?云做事器如何设置安全组?等等,后面会连续写文章。
文中一些内容和示例还略简陋,抛砖引玉,共同互换~