如何把一个web集群由HTTP转换为HTTPS(LVS+HAProxy+SSL)

简介:

一、环境介绍

    接到通知,要求网站由http改为使用https,目前我的网站前端架构如下图所示:

wKioL1cfFiviTO_AAAEJI0txodI055.jpg

    假设我们有两台物理机,每台物理机上面有很多的tomcat容器,前端使用的是haproxy进行的http层负载均衡,再前端我们使用了LVS负载均衡,整个LVS使用的是DR模型。

    刚开始我打算把tomcat改成https,设置成之后再设置haproxy的时候,发现haproxy不能再使用负载均衡了,因为SSL是在第四层的,所以这个方案就结束了,下面我就尝试在haproxy层设定SSL,到后端还使用普通的连接。


二、设置步骤

1、概述

    如果你的应用使用SSL证书,则需要决定如何在负载均衡器上使用它们。

    单服务器的简单配置通常是考虑客户端SSL连接如何被接收请求的服务器解码。由于负载均衡器处在客户端和更多服务器之间,SSL连接解码就成了需要关注的焦点。

2、有两种主要的策略

wKiom1cgIdbyyPzfAACvrbg2YNE071.jpg

  •     第一种是我们选择的模式,在haproxy这里设定SSL,这样我们可以继续使用七层负载均衡。SSL连接终止在负载均衡器haproxy ----->解码SSL连接并发送非加密连接到后端应用tomcat,这意味着负载均衡器负责解码SSL连接,这与SSL穿透相反,它是直接向代理服务器发送SSL连接的。

  •     第二种使用SSL穿透,SSL连接在每个tomcat服务器终止,将CPU负载都分散到tomcat服务器。然而,这样做会让你失去增加或修改HTTP报头的能力,因为连接只是简单地从负载均衡器路由到tomcat服务器,这意味着应用服务器会失去获取 X-Forwarded-* 报头的能力,这个报头包含了客户端IP地址、端口和使用的协议。

  •     有两种策略的组合做法,那就是第三种,SSL连接在负载均衡器处终止,按需求调整,然后作为新的SSL连接代理到后台服务器。这可能会提供最大的安全性和发送客户端信息的能力。这样做的代价是更多的CPU能耗和稍复杂一点的配置。

  •     选择哪个策略取决于你及应用的需求。SSL终端为我所见过最典型的策略,但SSL穿透可能会更安全。

3、使用HAProxy作为SSL终端

    首先,我们将介绍最典型的解决方案 - SSL 终端。正如前面提到的,我们需要让负载均衡器处理SSL连接。这就意味着要将SSL证书放在负载均衡服务器上。

   记住,在生产环境里使用(而不是自签名)的SSL证书,是不会需要你自己来生成或签名 - 你只需要创建证书签名请求 (csr) 并把它交给那个你向它购买证书的机构即可。

    首先, 我们创建一份自签名的证书作为示范,并在本地使用同一份证书。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
openssl genrsa -out  /etc/haproxy/wzlinux .key 2048
openssl req -new -key  /etc/haproxy/wzlinux .key -out  /etc/haproxy/wzlinux .csr
 
> Country Name (2 letter code) [AU]:CN
> State or Province Name (full name) [Some-State]:Shanghai
> Locality Name (eg, city) []:Shanghai
> Organization Name (eg, company) [Internet Widgits Pty Ltd]:wzlinux
> Organizational Unit Name (eg, section) []:
> Common Name (e.g. server FQDN or YOUR name) []:www.wzlinux.com
> Email Address []:
> Please enter the following  'extra'  attributes to be sent with your certificate request
> A challenge password []:
> An optional company name []:
 
cd  /etc/haproxy
openssl x509 -req -days 3655 - in  wzlinux.csr -signkey wzlinux.key -out wzlinux.crt

    这就生成了wzlinux.csr,wzlinux.key和wzlinux.crt文件了。

    接着,在创建了证书之后,我们需要创建pem文件。pem文件本质上只是将证书、密钥及证书认证中心证书(可有可无)拼接成一个文件。在我们的例子中,我们只是简单地将证书及密钥文件并以这个顺序拼接在一样来创建wzlinux.pem 文件。这是HAProxy读取SSL证书首选的方式。

1
cat  wzlinux.crt wzlinux.key |  tee  wzlinux.pem

    当购买真正的证书 时,你不一定会获取拼接后的文件。你可以要自己拼接它们。然而,很多机构也会提供一份拼接好的文件给你。如果你没有获取到拼接后的文件,则它可能不是一个 pem 文件,而是 bundle、cert、cert、key文件或一些相同概念但名称类似的文件。

    无论如何,只要我们得到了HAProxy使用的pem文件,我们只需经过简单配置就是可以处理SSL连接了。

    下面我们将要配置haproxy来安装SSL证书,配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
     # to have these messages end up in /var/log/haproxy.log you will
     # need to:
     #
     # 1) configure syslog to accept network log events.  This is done
     #    by adding the '-r' option to the SYSLOGD_OPTIONS in
     #    /etc/sysconfig/syslog
     #
     # 2) configure local2 events to go to the /var/log/haproxy.log
     #   file. A line like the following can be added to
     #   /etc/sysconfig/syslog
     #
     # local2.*                       /var/log/haproxy.log
     #
     log         127.0.0.1 local2 warning
     chroot       /var/lib/haproxy
     pidfile      /var/run/haproxy .pid
     maxconn     400000
     user        haproxy
     group       haproxy
     daemon
     tune.ssl.default-dh-param  2048
#    nbproc      3
     # turn on stats unix socket
     stats socket  /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
     mode                    http
     log                     global
     option                  httplog
     option                  dontlognull
     option                  http-server-close
     option forwardfor       except 127.0.0.0 /8
     option                  redispatch
     option                  httpclose
     retries                 3
     timeout http-request    10s
     timeout queue           1m
     timeout connect         10s
     timeout client          1m
     timeout server          1m
     timeout http-keep-alive 10s
     timeout check           10s
     stats  enable
     stats hide-version
     stats uri      /haproxy ?status
     stats realm   Haproxy\ Statistics
     stats auth    admin:asd870719
#   stats admin if TRUE
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
#frontend  main *:5000
#   acl url_static       path_beg       -i /static /images /javascript /stylesheets
#   acl url_static       path_end       -i .jpg .gif .png .css .js
#   use_backend static          if url_static
#   default_backend             app
frontend  wzlinux_ssl
       bind *:80
       bind *:443 ssl crt  /etc/haproxy/wzlinux .pem
       mode http
       default_backend  wzlinux
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
#backend static
#   balance     roundrobin
#   server      static 127.0.0.1:4331 check
backend wzlinux
     mode http
     balance     roundrobin
     option forwardfor
#   option httpchk HEAD / HTTP/1.1\r\nHost:localhost
     server      wzlinux01  10.0.0.9:8080 check inter 15000 rise 2 fall 4
     server      wzlinux02  10.0.0.9:8081 check inter 15000 rise 2 fall 4
     server      wzlinux03  10.0.0.9:8082 check inter 15000 rise 2 fall 4
     server      wzlinux04  10.0.0.9:8083 check inter 15000 rise 2 fall 4
     server      wzlinux05  10.0.0.9:8084 check inter 15000 rise 2 fall 4
     server      wzlinux06  10.0.0.9:8085 check inter 15000 rise 2 fall 4
     server      wzlinux07  10.0.0.9:8086 check inter 15000 rise 2 fall 4
#   http-request set-header X-Forwarded-Port %[dst_port]
#   http-request add-header X-Forwarded-Proto https if { ssl_fc }

    因为 SSL 连接在负载均衡器上终止了,我们依然来发送正常的 HTTP 请求到后台服务器。

只接受SSL连接

    如果你想让网站只接受SSL连接,你可以添加向前端配置加上redirect导向:

1
2
3
4
5
6
frontend wzlinux_ssl
     bind *:80
     bind *:443 ssl crt  /etc/haproxy/wzlinux .pem
     redirect scheme https  if  !{ ssl_fc }
     mode http
     default_backend wzlinux

    上面,我们添加了 redirect 导向,如果连接不是通过SSL连接的,它将http重定向到https。

4、使用HAProxy实现SSL穿透

    使用SSL穿透,我们将让后台服务器处理SSL连接,而非负载均衡器来处理。

    负载均衡器的工作就只是简单地将请求转发到配置好的后台服务器。因为连接还保持加密状态,HAProxy只能将它转发给其他服务器,其他事情就没法做了。

    在这个配置中,我们需要在前端和后台配置中同时使用TCP模式而不是HTTP模式。HAProxy只会把连接当作信息流来转发到其他服务器,而不会使用在HTTP请求上才能使用的功能。

首先,我们调整一下前端配置:

1
2
3
4
5
6
frontend wzlinux_ssl
     bind *:80
     bind *:443
     option tcplog
     mode tcp
     default_backend wzlinux

    这里依然同时绑定80和443端口,以保证正常的HTTP连接和SSL连接都能工作。

    正如上述提到的,转发一个安全连接而服务器而不作任何解码,我们需要使用TCP模式(mode tcp)。这也意味着我们需要设置tcp日志而不是默认的http日志(option tcplog)。

    接着,我们要调整后台end配置。注意,我们还要将这个更改成TCP模式,并删除一些directives以避免因为修改/增加HTTP报头功能所带来的冲突: 

1
2
3
4
5
6
7
8
9
10
11
backend wzlinux
     mode tcp
     balance roundrobin
     option ssl-hello-chk
     server      wzlinux01  10.0.0.9:8080 check inter 15000 rise 2 fall 4
     server      wzlinux02  10.0.0.9:8081 check inter 15000 rise 2 fall 4
     server      wzlinux03  10.0.0.9:8082 check inter 15000 rise 2 fall 4
     server      wzlinux04  10.0.0.9:8083 check inter 15000 rise 2 fall 4
     server      wzlinux05  10.0.0.9:8084 check inter 15000 rise 2 fall 4
     server      wzlinux06  10.0.0.9:8085 check inter 15000 rise 2 fall 4
     server      wzlinux07  10.0.0.9:8086 check inter 15000 rise 2 fall 4

    正如你所看到的,这里设置成了mode tcp - 前端和后台配置都需要设置成这个模式。

    我们还删除了option forwardfor和http-request选项 - 这些不能用于TCP模式,而且我们也不能向已加密的请求添加报头,还有一些前面的默认配置也删去关于http的配置,这里不再演示。

    为了检查正确与否,我们可以使用ssl-hello-chk来检查连接及它处理SSL(特别是SSLv3)连接的能力。


    在这个例子中,我虚构了两个接受SSL证书的后台服务器。如果你有阅读过edition SSL certificates,你会看到如何将它们集成到 Apache 或 Nginx 来创建一个网络服务器后台,以处理SSL通信。使用SSL 穿越,不需要给HAProxy创建或使用SSL证书。后台服务器都能够处理SSL连接,如同只有一台服务器且没有使用负载均衡器那样。 

    在关于如何设定lvs分发这里不再进行设定演示,大家可以查看我有关LVS的文章。






     本文转自 wzlinux 51CTO博客,原文链接:http://blog.51cto.com/wzlinux/1767920,如需转载请自行联系原作者



相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
2月前
|
缓存 安全 网络协议
一起深入了解http和https的区别
HTTP适合于非敏感信息的传输,而HTTPS则是在要求安全性、隐私保护及信任机制的现代互联网环境中不可或缺的标准配置。随着网络安全意识的提高和技术的发展,越来越多的网站和服务都转向使用HTTPS,力求在提供便捷服务的同时保障用户数据的安全。HTTPS将成为未来的基本选择。
45 0
一起深入了解http和https的区别
|
2月前
|
网络协议 Shell 网络安全
实验目的1.编译安装httpd2.优化路径3.并将鲜花网站上传到web服务器为网页目录4.在客户机访问网站http://www.bdqn.com
实验目的1.编译安装httpd2.优化路径3.并将鲜花网站上传到web服务器为网页目录4.在客户机访问网站http://www.bdqn.com
165 0
|
1天前
|
安全 网络协议 算法
【计算机网络】http协议的原理与应用,https是如何保证安全传输的
【计算机网络】http协议的原理与应用,https是如何保证安全传输的
|
2天前
|
网络协议 安全 算法
HTTP协议与HTTPS协议
HTTP协议与HTTPS协议
|
2天前
|
数据采集 缓存 网络协议
静态代理IP是否支持HTTP和HTTPS?
静态代理IP支持HTTP、HTTPS、FTP、Socks5等协议,HTTP协议因其简单、灵活而常用,通常比HTTPS速度快,因无需加密处理。HTTP代理比SOCKS5代理通常更快,因为HTTP专注于HTTP请求,而SOCKS5处理多种网络流量。静态HTTP代理适合浏览器和爬虫,SOCKS5代理支持更多协议,如TCP、UDP。选择取决于应用场景和需求。
|
6天前
|
Kubernetes 应用服务中间件 nginx
Kubernetes v1.12/v1.13 二进制部署集群(HTTPS+RBAC)
Kubernetes v1.12/v1.13 二进制部署集群(HTTPS+RBAC)
|
7天前
|
安全 Go
解决https页面加载http资源报错
请注意,混合内容可能导致安全性问题,因此在使用上述方法时要小心。最好的方式是尽量减少或完全消除混合内容,以确保页面的安全性。
8 0
|
12天前
|
网络协议 网络安全 数据安全/隐私保护
http和https的区别!
http和https的区别!
|
14天前
|
安全 网络协议 前端开发
< 了解 HTTP 这一篇就够了 :什么是 HTTP ?HTTP 和 HTTPS 有什么区别 ? >
在前端开发中,是和浏览器打交道最为频繁的行业之一。但是大部分卷王们,可能仅仅是知道如何使用浏览器,只是知道 URL 跳转到浏览器变成一个完整的网页。 本篇文章将讲述 什么是HTTP、 HTTP 和 HTTPS的区别 及 URL 是如何渲染到页面。 那么到这里,肯定会有人问: 那我们为什么要学习这个呢 ? 问得好,这个分为两方面: 一是学习上述内容,能够厚实我们的理论基础。有些内容,虽然用的不多,但是技多不压身,道理懂吧? 二是学习这个,对我们后续的性能优化、排查浏览器上某些错误 的能力都有提升!
< 了解 HTTP 这一篇就够了 :什么是 HTTP ?HTTP 和 HTTPS 有什么区别 ? >
|
15天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
11 0