HAProxy可以实现https的证书安全,从客户端到HAProxy服务器之间为https通信,从HAProxy服务器到后端服务器用http通信。不过这种方式会对HAProxy服务器造成较大的压力,基于性能考虑,建议生产中证书还是放在后端服务器(比如nginx)上实现。

    本次实验,笔者准备了四台虚拟机,一台作为客户端,取名client;一台为编译安装过HAProxy4.2.17版本的虚拟机,作为中间的调度器,取名haproxy;两台作为后端web服务器,分别取名web1和web2。

  1. 后端web服务器

    后端两台web服务器均安装并开启Apache服务,同时各自的web主页面中均能显示各自IP。

利用HAProxy实现https_haproxy

利用HAProxy实现https_HTTPS_02

利用HAProxy实现https_服务器_03


  1. HAProxy服务器

2.1 生成自签名证书

    要想实现https功能,需要在HAProxy服务器上生成服务相关的自签名证书。

2.1.1 修改Makefile文件

    在《创建私有CA并进行证书申请》(链接:https://blog.51cto.com/u_15473594/5023546一篇中,笔者演示了如何搭建私有CA和如何针对单个服务颁发CA证书,不过当时是在CentOS8上操作的,此次实验笔者的HAProxy服务器是放在在CentOS7上,而在CentOS7的/etc/pki/tls/certs目录下有个Makefile文件,我们可以直接使用该文件来生成自签名证书。不过直接使用该文件来生成证书相关文件时,会要求进行加密,同时后面每次使用都要输入密*码,相对会比较麻烦,因此要将Makefile文件中“/usr/bin/openssl genrsa”这一行的“-aes128”删除。

利用HAProxy实现https_HTTPS_04

2.1.2 生成自签名证书

    接下来我们就可以在Makefile所在的文件夹通过make命令来生成证书文件,需要我们填写国家、省市、城市等信息,填写完毕,可以看到指定目录下生成了证书文件和私钥文件。

利用HAProxy实现https_haproxy_05

2.1.3 合并证书相关文件

    但是要使用的话,需要将以上生成的两个证书相关文件合并到一块,并且合并后的证书文件需要是pem格式。合并完毕,可以利用openssl命令将文件内容以文本形式输出查看。

利用HAProxy实现https_服务器_06

2.2 修改HAProxy服务配置文件

    配置文件中要设置本机的80端口和443端口均处于监听状态,同时443端口要指定证书文件的路径。因为HAProxy向后端web服务器进行请求的调度时走的还是http协议,因此后端服务器端口依旧是80。

利用HAProxy实现https_haproxy_07


  1. 客户端测试

    当使用客户端或浏览器进行测试时,因为HAProxy服务器设置的是动态轮询调度算法,因此会往后端两台web服务器上轮流调度。

利用HAProxy实现https_HTTPS_08

利用HAProxy实现https_服务器_09

利用HAProxy实现https_服务器_10


  1. 端口重定向

    客户端在访问时,有可能不会主动去输入https,即不走加密协议,因此我们可以使用端口重定向。端口重定向的方式是在HAProxy服务器配置文件中添加一行“redirect scheme https if !{ ssl_fc }”,注意花括号里面前后各有一个空格。

利用HAProxy实现https_HTTPS_11

    客户端直接使用http协议去访问,加上-I选项可看到状态码为302,并且已经进行了重定向到https://www.johnnyfang.com上,加上-Lk选项去访问时已经能按照轮询调度获取后端服务器返回的结果。

利用HAProxy实现https_客户端_12

    在浏览器中访问时,按f12配合控制台可以更直观的看到重定向效果。

利用HAProxy实现https_haproxy_13