HTTPS服務對於一個前端開發者來說是一個天天打招呼的老伙計了,但是之前我跟HTTPS打交道的場景一直是抓包,自己沒有親自搭建過HTTPS服務,對HTTPS的底層知識也是一知半解。最近正好遇到一個用戶場景,頁面需要調起手機的攝像頭,這就要求頁面服務必須是HTTPS的,所以就嘗試搭建了HTTPS的靜態服務,過程挺曲折的,所以總結一下分享給大家,希望能給看過本文的朋友一點幫助,提高工作效率。
本文主要講三個點:HTTPS基本原理、證書的獲取和httpd的https配置。
HTTPS基本原理
HTTPS = HTTP + TSL(transport layer security)在應用層和傳輸層之間添加了一個會話層,會話層采用SSL協議,完成數據的加密、身份認證、數據完整性校驗。如下圖所示:
要完成以上功能,TLS的連接在TCP連接的基礎之上,需要增加握手次數,如下圖所示:

總結一下,HTTPS使用的過程中,主要是需要一個認證中心簽名的證書,用該證書證明服務端返回的公鑰是可信的,然后用該公鑰加密瀏覽器端生成的對稱密鑰,服務端用自己私鑰解密得到瀏覽器發送的對稱密鑰,然后瀏覽器和服務端通過對稱密碼進行加密通信。因此,搭建HTTPS服務首先要從認證中心申請到簽名證書。
證書的獲取

由於正規的證書申請,CA機構是要收費的,所以測試過程中我們需要自建CA來頒發證書。
1.自建CA
利用openssl包可以創建CA,前提是需要openssl.conf的要求,創建自建CA所需的文件和目錄,具體可以參見相關文章。這里主要指出幾個必要的文件和目錄:
(1)創建CA私鑰
cd CA_PATH #CA_PATH為demoCA的上級目錄,因為配置文件中CA默認的私鑰路徑是./demoCA/private/cakey.pem,所以一定要在該目錄執行命令,否則會報錯
openssl genrsa -out ./demoCA/private/cakey.pem 2048
(2)創建CA證書申請
openssl req -new -in ./demoCA/private/cakey.pem -days 365 -out ./demoCA/cacsr.pem
申請的過程中需要輸入用戶信息,如Country Name,Organization Name,Email Address等,注意自己填寫的信息。
(3)創建自簽證書
openssl x509 -req -in ./demoCA/cacsr.pem -out ./demoCA/cacert.pem -signkey ./demoCA/private/cakey.pem -days 3650
2. 用戶申請證書
在任意機器或路徑下創建用戶私鑰
(1)創建用戶私鑰
openssl genrsa -out userkey.pem 2048
(2)創建用戶證書申請
openssl req -new -in userkey.pem -days 365 -out usercsr.pem
同時在當前目錄下產生一個privkey.pem文件。
(3)CA簽名
需要CA簽名的話,就需要將用戶申請文件usercsr.pem拷貝到CA所在的機器上,現在把用戶的文件放置在與demoCA同級的demoUser目錄中。CA默認的私鑰路徑是./demoCA/private/cakey.pem,因此仍需要切換到./demoCA的上級目錄。
cd CA_PATH #CA_PATH為demoCA的上級目錄,因為配置文件中CA默認的私鑰路徑是./demoCA/private/cakey.pem,所以一定要在該目錄執行命令,否則會報錯
openssl ca -in ./demoUser/usercsr.pem -out ./demoUser/usercrt.pem
httpd的https配置
經過以上兩步的操作,我們拿到了用戶證書user.crt和用戶密鑰userkey.pem,接下來就要在httpd的配置文件中配置https。
<VirtualHost *:443> ServerName www.example.com DocumentRoot /www/example.com/htdocs SSLengine on SSLProtocol all -SSLv3 SSLcertificatefile USER_CRT_PATH/usercrt.pem SSLcertificatekeyfile USER_KEY_PATH/privkey.pem </VirtualHost>