用 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閱讀 229,362評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,234評論 2 375

推薦閱讀更多精彩內容

  • 原文地址 http://blog.csdn.net/u012409247/article/details/4985...
    0fbf551ff6fb閱讀 3,541評論 0 13
  • 一、作用 不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文傳播,帶來了三大風險。 (1)竊聽風險...
    XLsn0w閱讀 10,600評論 2 44
  • 本文部分內容參考果殼網對HTTPS的介紹,這里是原文鏈接:http://www.guokr.com/post/11...
    OliverGao閱讀 3,829評論 3 29
  • 其實,我對https以前只有一個大概的了解,最近工作中遇到一個問題從而將https協議做了一個徹底的學習和認知,下...
    一條魚的星辰大海閱讀 3,488評論 0 1
  • 無聊、寂寞、孤獨是三種不同的心境。無聊是把自我消散 于他人之中的欲望,它尋求的是消遣。寂寞是自我與他人共在的欲望,...
    米浩閱讀 418評論 1 1