用 HAproxy 实现 HTTPS 反向代理

听闻水果要求 APP 全面开启 HTTPS 协议了,作为微信企业号的使用者,也会连带受到影响。为了解决这一即将到来的问题,需要购买证书,并快速实现实现已有业务的 HTTPS 访问。本文针对这两个问题简要介绍一下。


首先,稍微解释一下加密证书。

有一个最基本的常识就是你自己生成的自签名证书是无效的,譬如 12306.cn 那样自己给自己颁发的证书,大家的浏览器都不能识别,就总会被提示为不安全。(一直想不通铁总那么大的盘子,为啥舍不得花那点买证书的钱。)

自签名加密证书不能使用,原因在于浏览器能够识别的加密证书,其颁发机构的根证书是随着操作系统一起安装到每个用户的 PC 或手机中的,只有这些颁发机构所签名过的加密证书,浏览器才会认。目前,有两种方法获得办法机构签名的证书,其一是花钱购买,其二是申请免费使用。

两种方法都很简单,但还是先说说传统的购买方式。互联网上有专门从事加密证书销售的中介机构,譬如证书巴士。但通常他们的网站上都有各种各样的颁发机构的不同类型证书在叫卖,价格相差也比较大,应该如何选购呢?这就要稍微了解一下数字证书的分类。

从用途上,数字证书分为很多种,比较常用的是用于 WEB 服务器、邮件服务器等与客户端之间进行加密通信的,以及用于应用程序签名的。很显然,为了应对水果的新规定,需要购买前者。

为 WEB 服务器通信提供加密的证书,根据其功能和价格,还可以分成三种:

  1. 仅仅提供加密通信:这类证书中仅仅携带了该证书所对应的网站域名以及证书的有效期,通过证书,不能获知网站由哪个机构管理。
  2. 提供网站管理者识别信息:这类证书在第一类证书的基础上增加了管理机构的信息,但这些信息必须由网站访问者点开证书才能查看到。
  3. 直接在地址栏上显示网站管理者识别信息:这类证书在第二类证书的基础上,直接将网站管理者的信息显示在地址栏上。

最后,还有一个要考虑的问题就是你所拥有的二级域名数量,如果需要启用 HTTPS 访问的二级网站较多,并且已经使用或者准备使用 HAproxy/nginx 或土豪专用的 F5/A10 集中管理应用发布,那么可以考虑购买泛域名证书。

所谓泛域名证书,就是 *.xxx.edu.cn 这种域名的所有二级网站都能用(三级是不能用的)。但需要注意的是,泛域名证书必须集中部署,如果安装在各种应用服务器上并且失窃,就达不到保护传输数据不被窃取的目的了。

购买证书,并不仅仅是一个花钱的过程,而是一个小小的技术活儿:

  1. 为域名生成私钥,这个东西,任何中介机构和证书颁发机构都是不需要的,必须自己保管好;
  2. 用私钥签名 CSR(证书请求)文件,相当于你填了张申请表;
  3. 把 CSR 文件提交给中介机构或颁发机构;
  4. 颁发机构要检验你的身份真实性,越贵的证书检查的内容项就越多,说不定还要填表盖章签字画押,便宜的通常只要用个特定名称的邮箱做验证就行;
  5. 颁发机构经过一番审查,会生成一个证书文件通过邮件发给你,你的数字证书就拿到手了;
  6. 赶快检查一下你第一步生成的私钥还在不在手里,要是搞丢了,就跳转回步骤1。

如果不习惯使用 OpenSSL 的命令行,可以使用 xca 做证书管理。

XCA界面

免费申请的证书,仅仅提供加密通信,并且必须提供准确域名,一个证书中最多包含 100 个域名。目前比较有名的证书提供组织是 Let's Encrypt,申请很方便,但有效期较短,以后有机会详说。

现在,证书已经到手,该部署了。


后面的工作,假设你手里已经有了私钥文件 edu.key 和含完成签名链的证书文件 edu.pem,两者都为 PEM 格式。所谓完整签名链,就是你的证书通常并非由颁发机构的根证书直接签名,而是由其某个子证书签名的,这时需要把根证书、子证书和你域名的证书放到一个文件里。不会做的话,xca 导出的时候可以直接选择的。

安装一台 Linux 服务器,可以是任何你喜欢的版本,本文以 CentOS 6 为例,这种服务器通常 2C/2G 内存就差不多了,访问量特别大的,可以考虑增加一些资源。

1. 确认服务器上安装了最新版的编译工具和库文件:

# yum install make gcc pcre-devel openssl-devel

2. 下载 haproxy-1.6 的源代码

# cd /usr/local/src
# wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.10.tar.gz
# tar xf  haproxy-1.6.10.tar.gz

3. 编译安装 haproxy-1.6

# cd haproxy-1.6.10
# make TARGET=linux26 USE_PCRE=1 USE_OPENSSL=1
# make install

此时运行 haproxy -v ,应该能看到版本号信息。

4. 安装数字证书

把 edu.key 和 edu.crt 两个文件复制到服务器上,然后执行命令将其合并

# mkdir /etc/certs/private
# cat edu.pem edu.key > /etc/certs/private/edu.pem

5. 创建配置文件

创建配置文件 /etc/haproxy/haproxy.cfg 内容如下:

global
    log /dev/log   local0
    log /dev/log   local1 notice
    pidfile     /var/run/haproxy-http.pid
    user nobody
    group nobody
    #daemon

    # Default SSL material locations
    #ca-base /etc/ssl/certs
    #crt-base /etc/ssl/private

    # Default ciphers to use on SSL-enabled listening sockets.
    # For more information, see ciphers(1SSL). This list is from:
    #  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
    ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
    ssl-default-bind-options no-sslv3
    tune.ssl.default-dh-param 2048

defaults
    log     global
    mode    http
    option                  httplog
    option                  dontlognull
    option http-server-close
    option httpclose
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          60m
    timeout http-keep-alive 10s
    timeout check           10s

frontend http
    # 绑定 80 端口,启动 http
    bind :80
    # 绑定 443 端口,启动 https
    bind :443 ssl crt /etc/certs/private/edu.pem
    # 根据域名生成 acl 规则
    acl is_weixin_bit_edu_cn hdr(host) -i weixin.bit.edu.cn weixin.bit.edu.cn:443
    # 根据 acl 规则选择后端
    use_backend weixin_bit_edu_cn if is_weixin_bit_edu_cn
 
backend weixin_bit_edu_cn
    # 如果未使用 https 则自动跳转,此处未开启
    #redirect scheme https if !{ ssl_fc }
    server weixin 10.0.0.250:8080 maxconn 100 check

6. 启动 haproxy

haproxy -f /etc/haproxy/haproxy.cfg -D

其中 -D 参数是使其进入后台运行

现在,就可以开启浏览器访问网站了,记得地址前缀为 https://


成文匆忙,如有不妥,欢迎指正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 原文地址 http://blog.csdn.net/u012409247/article/details/4985...
    0fbf551ff6fb阅读 3,516评论 0 13
  • 一、作用 不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。 (1)窃听风险...
    XLsn0w阅读 10,500评论 2 44
  • 本文部分内容参考果壳网对HTTPS的介绍,这里是原文链接:http://www.guokr.com/post/11...
    OliverGao阅读 3,800评论 3 29
  • 其实,我对https以前只有一个大概的了解,最近工作中遇到一个问题从而将https协议做了一个彻底的学习和认知,下...
    一条鱼的星辰大海阅读 3,480评论 0 1
  • 无聊、寂寞、孤独是三种不同的心境。无聊是把自我消散 于他人之中的欲望,它寻求的是消遣。寂寞是自我与他人共在的欲望,...
    米浩阅读 399评论 1 1