聽聞水果要求 APP 全面開啟 HTTPS 協議了,作為微信企業號的使用者,也會連帶受到影響。為了解決這一即將到來的問題,需要購買證書,并快速實現實現已有業務的 HTTPS 訪問。本文針對這兩個問題簡要介紹一下。
首先,稍微解釋一下加密證書。
有一個最基本的常識就是你自己生成的自簽名證書是無效的,譬如 12306.cn 那樣自己給自己頒發的證書,大家的瀏覽器都不能識別,就總會被提示為不安全。(一直想不通鐵總那么大的盤子,為啥舍不得花那點買證書的錢。)
自簽名加密證書不能使用,原因在于瀏覽器能夠識別的加密證書,其頒發機構的根證書是隨著操作系統一起安裝到每個用戶的 PC 或手機中的,只有這些頒發機構所簽名過的加密證書,瀏覽器才會認。目前,有兩種方法獲得辦法機構簽名的證書,其一是花錢購買,其二是申請免費使用。
兩種方法都很簡單,但還是先說說傳統的購買方式。互聯網上有專門從事加密證書銷售的中介機構,譬如證書巴士。但通常他們的網站上都有各種各樣的頒發機構的不同類型證書在叫賣,價格相差也比較大,應該如何選購呢?這就要稍微了解一下數字證書的分類。
從用途上,數字證書分為很多種,比較常用的是用于 WEB 服務器、郵件服務器等與客戶端之間進行加密通信的,以及用于應用程序簽名的。很顯然,為了應對水果的新規定,需要購買前者。
為 WEB 服務器通信提供加密的證書,根據其功能和價格,還可以分成三種:
- 僅僅提供加密通信:這類證書中僅僅攜帶了該證書所對應的網站域名以及證書的有效期,通過證書,不能獲知網站由哪個機構管理。
- 提供網站管理者識別信息:這類證書在第一類證書的基礎上增加了管理機構的信息,但這些信息必須由網站訪問者點開證書才能查看到。
- 直接在地址欄上顯示網站管理者識別信息:這類證書在第二類證書的基礎上,直接將網站管理者的信息顯示在地址欄上。
最后,還有一個要考慮的問題就是你所擁有的二級域名數量,如果需要啟用 HTTPS 訪問的二級網站較多,并且已經使用或者準備使用 HAproxy/nginx 或土豪專用的 F5/A10 集中管理應用發布,那么可以考慮購買泛域名證書。
所謂泛域名證書,就是 *.xxx.edu.cn 這種域名的所有二級網站都能用(三級是不能用的)。但需要注意的是,泛域名證書必須集中部署,如果安裝在各種應用服務器上并且失竊,就達不到保護傳輸數據不被竊取的目的了。
購買證書,并不僅僅是一個花錢的過程,而是一個小小的技術活兒:
- 為域名生成私鑰,這個東西,任何中介機構和證書頒發機構都是不需要的,必須自己保管好;
- 用私鑰簽名 CSR(證書請求)文件,相當于你填了張申請表;
- 把 CSR 文件提交給中介機構或頒發機構;
- 頒發機構要檢驗你的身份真實性,越貴的證書檢查的內容項就越多,說不定還要填表蓋章簽字畫押,便宜的通常只要用個特定名稱的郵箱做驗證就行;
- 頒發機構經過一番審查,會生成一個證書文件通過郵件發給你,你的數字證書就拿到手了;
- 趕快檢查一下你第一步生成的私鑰還在不在手里,要是搞丟了,就跳轉回步驟1。
如果不習慣使用 OpenSSL 的命令行,可以使用 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://
。
成文匆忙,如有不妥,歡迎指正。