HTTPS靜態服務搭建過程詳解
HTTPS服務對於一個前端開發者來說是一個天天打招呼的老夥計了,但是之前我跟HTTPS打交道的場景一直是抓包,自己沒有親自搭建過HTTPS服務,對HTTPS的底層知識也是一知半解。最近正好遇到一個使用者場景,頁面需要調起手機的攝像頭,這就要求頁面服務必須是HTTPS的,所以就嘗試搭建了HTTPS的靜態服務,過程挺曲折的,所以總結一下分享給大家,希望能給看過本文的朋友一點幫助,提高工作效率。
本文主要講三個點:HTTPS基本原理、證書的獲取和httpd的https配置。
HTTPS基本原理
HTTPS = HTTP + TSL(transport layer security)在應用層和傳輸層之間添加了一個會話層,會話層採用SSL協議,完成資料的加密、身份認證、資料完整性校驗。如下圖所示:
要完成以上功能,TLS的連線在TCP連線的基礎之上,需要增加握手次數,如下圖所示:
新增的往返過程可以簡單根據下圖示意理解。總結一下,HTTPS使用的過程中,主要是需要一個認證中心簽名的證書,用該證書證明服務端返回的公鑰是可信的,然後用該公鑰加密瀏覽器端生成的對稱金鑰,服務端用自己私鑰解密得到瀏覽器傳送的對稱金鑰,然後瀏覽器和服務端通過對稱密碼進行加密通訊。因此,搭建HTTPS服務首先要從認證中心申請到簽名證書。
證書的獲取
證書的獲取過程是:向證書認證中心—CA提出申請,在CA判明申請者的身份後,為其分配一個公鑰,然後CA將該公鑰與申請者的身份資訊綁在一起,然後用CA的私鑰為其加密簽名,簽名後頒發給申請者。證書中的內容是使用者公鑰、使用者資訊、頒發機構、有效期等。分配的公鑰可以通過證書請求中的使用者私鑰來獲取。使用者想要鑑別證書的真偽,只能用CA的公鑰對證書上的簽字進行驗證。下圖是證書獲取過程的示意圖:由於正規的證書申請,CA機構是要收費的,所以測試過程中我們需要自建CA來頒發證書。
1.自建CA
利用openssl包可以建立CA,前提是需要openssl.conf的要求,建立自建CA所需的檔案和目錄,具體可以參見相關文章。這裡主要指出幾個必要的檔案和目錄:
new_certs_dir = $dir/newcerts # 新證書存放位置 private_key = $dir/private/cakey.pem #CA私鑰 database = $dir/index.txt #證書索引資料庫檔案 serial = $dir/serial 頒發證書的序列號(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 ca -selfsign -in careq.pem -out ./demoCA/cacert.crt
2. 使用者申請證書
在任意機器或路徑下建立使用者私鑰
(1)建立使用者私鑰
openssl genrsa -out userkey.pem 2048
(2)建立使用者證書申請
openssl req -new -in userkey.pem -days 365 -out usercsr.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/userkey.pem -out ./demoUser/user.crt
httpd的https配置
經過以上兩步的操作,我們拿到了使用者證書user.crt和使用者金鑰userkey.pem,接下來就要在httpd的配置檔案中配置https。
(1)確認ssl模組(mod_ssl.so)開啟 (2)設定https相應的虛擬埠配置,預設為443埠 配置程式碼如下:<VirtualHost *:443> ServerName www.example.com DocumentRoot /www/example.com/htdocs SSLengine on SSLProtocol all -SSLv3 SSLcertificatefile USER_CRT_PATH/user.crt SSLcertificatekeyfile USER_KEY_PATH/user.key </VirtualHost>(3)重啟httpd即可