如何搭建一個HTTPS服務(wù)端
關(guān)于 HTTPS 的基本原理大家都已經(jīng)不再陌生,今天和大家說說如何搭建一個支持 HTTPS 的服務(wù)端。
服務(wù)端的 HTTPS
HTTPS 已經(jīng)幾乎成為了當(dāng)前互聯(lián)網(wǎng)推薦的通信方式,它能最大化保證信息傳輸?shù)陌踩?,從去年蘋果的強制 HTTPS ,到如今各大網(wǎng)站都支持了 HTTPS。它會越來越普及。
之前寫過幾篇關(guān)于 HTTPS 原理的文章,有用戶留言希望了解一些如何在服務(wù)端搭建 HTTPS 服務(wù)的內(nèi)容,這次就和大家聊聊這個話題。
SSL 證書
搭建一個 HTTPS 站點,第一步要做的就是申請 SSL 證書, 而且要在標(biāo)準(zhǔn)的證書頒發(fā)機構(gòu)來申請。 當(dāng)然,從技術(shù)上來說,你可以使用自簽名證書,但自簽名證書會被所有的瀏覽器視為不安全的證書,并且會給用戶報錯,就像這樣:
所以,還是需要申請一個正規(guī)的證書的。 可申請證書的頒發(fā)機構(gòu)有很多,比如 GoDaddy,Comodo,Verisign 等等。價格從一年幾美金到幾十美金不等。
我們就以 GoDaddy 為例,帶大家了解一下流程。 在 GoDaddy 的首頁有一個 Web Security 標(biāo)簽,點擊這個標(biāo)簽后可以找到 SSL Certificates 選項:
點擊進去, 就可以看到可選的幾個證書形式,有單域名的,還有允許多個二級域名的等:
避免廣告嫌疑,下面的價格信息略去了~,這里只給大家介紹流程,幫助大家了解。 證書服務(wù)商大家可以自行選擇。
接下來,證書頒發(fā)機構(gòu)會讓你填寫一個叫做 CSR 的東西, 如果大家搞 iOS 開發(fā)對這個應(yīng)該不陌生,申請?zhí)O果開發(fā)者證書的時候大家也做過類似的事情。
CSR 全稱 Certificate Signing request。 顧名思義就是用于申請證書必須的一些信息,在 Lunix 系統(tǒng)中,它可以通過命令生成(大多數(shù)的服務(wù)端應(yīng)該都是基于 Linux 的,所以我們用它來作為例子):
- $ openssl req -new -newkey rsa:2048 -nodes -keyout yourdomain.key -out yourdomain.csr
openssl 命令,如果你的系統(tǒng)沒有安裝的話,可以通過包管理先安裝。 需要把這里面的 yourdomain.key 和 yourdomain.csr 替換成你自己的名稱,可以是域名,也可以是其他標(biāo)識。
生成成功后,可以用 cat 命令輸出 yourdomain.csr 中的內(nèi)容:
- $ cat yourdomain.csr
會在命令行輸出 CSR 的內(nèi)容,把這段內(nèi)容復(fù)制到前面截圖中的文本框中,然后點擊生成就好了。
注意,這里的 yourdomain.key 文件你要保管好。 這是你證書的私鑰,后面配置 HTTPS 的時候需要用到它。 并且它不能重新生成,而且不能泄露出去。原因可以參考我前面關(guān)于 HTTPS 原理的相關(guān)文章。
與此同時,證書頒發(fā)機構(gòu)在你提交 CSR 之后,會給你生成證書文件, Godaddy 會生成兩個證書,一個是你站點的證書,一個是根證書。 把它們下載到你的服務(wù)器上面。
Apache 服務(wù)端配置
證書準(zhǔn)備好之后,我們要對服務(wù)端程序進行配置,讓它支持 HTTPS。這里我給大家以 CentOS 7 操作系統(tǒng), Apache 2.x 服務(wù)端程序為例。
Apache 的 HTTPS 配置文件一般在 /etc/httpd/conf.d/ssl.conf 這個位置。 用 vim 編輯器打開它, 然后加入這樣一個節(jié)點:
- <VirtualHost *:443>
- SSLEngine On
- SSLCertificateFile /root/yoursite.crt
- SSLCertificateKeyFile /root/yoursite.key
- SSLCACertificateFile /root/rootcert.crt
- ServerAdmin admin@yoursite.com
- ServerName yoursite.com
- DocumentRoot /var/www/html/
- </VirtualHost>
這里用到了我們前面準(zhǔn)備的證書和秘鑰。 SSLCertificateFile 是你站點的證書, SSLCACertificateFile 是根證書, SSLCertificateKeyFile 是只保存在你服務(wù)器的私鑰。
有了這些信息后,Apache 就可以正確的處理 HTTPS 請求了。 在這之前我們還需要在做最后一步操作, 編輯 /etc/httpd/conf/httpd.conf 文件, 這個是 Apache 的主配置文件, 加入這樣一行:
- Listen 443
這個是讓你的服務(wù)端同時監(jiān)聽 443 端口。 因為 HTTPS 的默認(rèn)端口是 443, 所以這個設(shè)置是必須要有的。
一切都就緒后,重啟你的服務(wù)器:
- systemctl restart httpd
然后再用瀏覽器輸入 https://yoursite.com 訪問你的站點時,就應(yīng)該可以看到 HTTPS 驗證成功的小鎖頭了。
防火墻設(shè)置
如果配置都就緒,你重啟了之后,依然不能正常訪問,有可能是你的防火墻把 443 端口攔截了,把它打開:
- iptables -A INPUT -p tcp -m tcp --sport 443 -j ACCEPT
- iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
結(jié)束
目前成熟的 Web 服務(wù)程序都有對 HTTPS 很好的支持,只需要經(jīng)過簡單的配置,即可完成 HTTPS 服務(wù)器的搭建。 而 HTTPS 之所以相對性能消耗更大,是因為每次數(shù)據(jù)傳輸都需要進行加密和解密的操作。 作為 APP 開發(fā)者們,可能對服務(wù)端的技術(shù)了解的并沒有那么深,可以把它作為一個備忘錄,日后用到的時候再來看看。