HTTPS服務對於一個前端開發者來講是一個每天打招呼的老夥計了,可是以前我跟HTTPS打交道的場景一直是抓包,本身沒有親自搭建過HTTPS服務,對HTTPS的底層知識也是隻知其一;不知其二。最近正好遇到一個用戶場景,頁面須要調起手機的攝像頭,這就要求頁面服務必須是HTTPS的,因此就嘗試搭建了HTTPS的靜態服務,過程挺曲折的,因此總結一下分享給你們,但願能給看過本文的朋友一點幫助,提升工做效率。前端
本文主要講三個點:HTTPS基本原理、證書的獲取和httpd的https配置。數據庫
HTTPS = HTTP + TSL(transport layer security)在應用層和傳輸層之間添加了一個會話層,會話層採用SSL協議,完成數據的加密、身份認證、數據完整性校驗。以下圖所示:瀏覽器
要完成以上功能,TLS的鏈接在TCP鏈接的基礎之上,須要增長握手次數,以下圖所示:測試
總結一下,HTTPS使用的過程當中,主要是須要一個認證中心簽名的證書,用該證書證實服務端返回的公鑰是可信的,而後用該公鑰加密瀏覽器端生成的對稱密鑰,服務端用本身私鑰解密獲得瀏覽器發送的對稱密鑰,而後瀏覽器和服務端經過對稱密碼進行加密通訊。所以,搭建HTTPS服務首先要從認證中心申請到簽名證書。ui
因爲正規的證書申請,CA機構是要收費的,因此測試過程當中咱們須要自建CA來頒發證書。加密
利用openssl包能夠建立CA,前提是須要openssl.conf的要求,建立自建CA所需的文件和目錄,具體能夠參見相關文章。這裏主要指出幾個必要的文件和目錄:spa
(1)建立CA私鑰code
cd CA_PATH #CA_PATH爲demoCA的上級目錄,由於配置文件中CA默認的私鑰路徑是./demoCA/private/cakey.pem,因此必定要在該目錄執行命令,不然會報錯
openssl genrsa -out ./demoCA/private/cakey.pem 2048
(2)建立CA證書申請xml
openssl req -new -in ./demoCA/private/cakey.pem -days 365 -out ./demoCA/cacsr.pem
申請的過程當中須要輸入用戶信息,如Country Name,Organization Name,Email Address等,注意本身填寫的信息。blog
(3)建立自簽證書
openssl x509 -req -in ./demoCA/cacsr.pem -out ./demoCA/cacert.pem -signkey ./demoCA/private/cakey.pem -days 3650
在任意機器或路徑下建立用戶私鑰
(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
通過以上兩步的操做,咱們拿到了用戶證書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>