HTTP即超文本傳輸協議(Hypertext Transfer Protocol)。html
這是一個文件的傳輸協議,咱們上網的時候,全部的文件都是經過HTTP這個協議,從服務器上傳輸到客戶端的電腦裏面的。同時HTTP協議工做在應用層,因此想要運行這個協議必須有相應的應用程序支撐。nginx
這裏咱們就先了解下什麼是客戶端,什麼是服務端web
客戶端:一般是指咱們的瀏覽器,好比谷歌瀏覽器、火狐瀏覽器、IE等,瀏覽器安裝在客戶使用的電腦上,因此,在描述http時,客戶端一般也代指那些安裝了瀏覽器的電腦。算法
服務端:一般是指那些安裝了web服務軟件的計算機,如httpd apache,nginx,lighttpd,這些服務端的計算機被稱爲服務器。apache
當咱們從客戶端到服務端拉取文件時,這些服務器就會根據你的請求命令給你返回你所須要的資源。而這些資源在傳輸過程當中都會以靜態的html格式文件傳輸,同時它的傳輸方式是明文的。這樣的傳輸方式就會使你的一些重要信息被一些有心人截取下來,因此基於http的傳輸方式並非安全的。vim
這就使HTTPS得以出現瀏覽器
HTTPS(全稱:httpover ssl,Hyper Text Transfer Protocol over Secure Socket Layer),它是以安全爲目標的HTTP通道,簡單講就是HTTP的安全版。即在HTTP下加入了SSL子層,HTTPS的安全基礎是SSL。SSL會使用各類對稱加密算法、非對稱加密算法來加密傳送數據,HTTPS和SSL支持使用X.509數字認證,它提供了通訊雙方的身份驗證,保證客戶端到服務器端的通訊都在被保護起來。因此有了這些就使得數據的傳輸獲得了安全保障。緩存
經過SSL創建會話的過程須要如下幾步:安全
一、客戶端與服務端交換協議版本號服務器
二、選擇雙方都支持的加密方式,並向服務器請求證書
三、服務器端發送證書以及選定的加密方式給客戶端
四、客戶端取得證書並進行證書驗證
客戶端接收到證書後,執行如下五步:
(a) 驗證證書來源的合法性;用CA的公鑰解密證書上數字簽名
(b) 驗證證書的內容的合法性:完整性驗證
(c) 檢查證書的有效期限
(d) 檢查證書是否被吊銷
(e) 證書中擁有者的名字,與訪問的目標主機要一致
四、客戶端生成臨時會話密鑰(對稱密鑰),並使用服務器端的公鑰加密,將此數據發送給服務端,完成祕鑰交換
五、服務端用此密鑰加密用戶請求的資源,響應給客戶端
HTTPS的實現
一、http想實現爲https 就須要爲配置ssl,及其使用的證書。這些在http裏有專門的mod_ssl模塊來支持。
yum -y install mod_ssl #安裝mod_ssl模塊
安裝該模塊後,它會自動修改配置文件,增長LoadModule ssl_module modules/mod_ssl.so在httpd的子配置文件/etc/httpd/conf.d/ssl.conf裏,同時也打開了443端口,同時指定了證書的存放路徑。
緣由是安裝的時候,安裝包裏會有腳本去生成私鑰文件/etc/pki/tls/private/localhost.key,同時也生成證書文件/etc/pki/tls/certs/localhost.crt,而這個證書文件是自簽名的,此時https網站已經能夠訪問,可是因爲這個https服務器的證書有問題,頒發給的機構不對,不是對應的站點名稱。因此須要要從新向CA申請,在獲取CA頒發的證書後才能正確使用https站點。
二、申請CA證書
要生成證書就須要爲服務端生成私鑰,並用它來爲其提供證書文件;
mkdir /etc/httpd/ssl && cd /etc/httpd/ssl #創建目錄存放私鑰文件
(umask 077; openssl genrsa -out httpd.key 1024) #生成1024位的私鑰
openssl req -new -key httpd.key -out httpd.csr #用此私鑰生成簽署證書文件,並把生成的文件提交給CA機構進行證書的簽署
注意:證書裏的國家、省份等名稱要與根CA的名稱保持一致,而主機服務名必定要寫未來對外提供Web服務的服務名稱
三、CA簽證
CA簽發完成後,根CA會把服務器的證書再傳給服務器,同時把根的證書cacert.pem也一塊兒發給服務器服務器。
簽署後的證書爲:/etc/httpd/ssl/httpd.crt
CA的根證書爲:/etc/httpd/ssl/cacert.pem
四、修改配置文件:/etc/httpd/conf.d/ssl.conf 須要修改的就是下面這幾項
DocumentRoot /var/www/html #指明共享文件的根目錄,這個目錄會覆蓋/etc/httpd/conf/http.conf裏的設置
ServerName www.Webname.com #指明這個Web網站服務器的名字
SSLCertificateFile /etc/httpd/ssl/httpd.crt #指明證書存放的位置
SSLCertificateKey /etc/httpd/ssl/httpd.key #指明私鑰文件的存放位置
SSLCACertificateFile /etc/httpd/ssl/cacert.pem #指明根證書的存放位置
五、從新加載配置
service httpd reload #重載配置文件
六、測試是否配置成功
測試命令:
openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
例:openssl s_client -connect HostIP:443 #若是出現證書文件內容,則說明https已經搭建成功
這裏的HostIP也能夠寫成你的服務器域名,前提是你的域名已經在DNS服務器上作過域名解析了。
七、http重定向到https
重定向就是將http 請求轉發至https 的URL。通常用戶在向Web服務器請求文件時不會專門記這個網站是否爲加密網站。因此就須要在服務端自動的將用戶的http請求轉換爲https請求。
這裏建議將http和https的主站點設置爲同一個站點。由於跳轉會將設置目錄下的全部http請求進行跳轉,若是https沒有http站點的目錄,好比http默認主站點是/var/www/html/,可是https下的主站點是/var/www/https,並且沒有/var/www/https/web這個站點,當有請求去請求這個/var/www/https/web頁面時,則跳轉會顯示網頁不存在而致使網頁打不開。
重定向:
(1)基於redirect進行跳轉
基於redirect的跳轉須要服務器內配置跳轉文件,並指明跳轉的路徑。
redirect的語法格式:
redirect [status] URL-path URL
status 的兩個狀態:
Permanent:Returns a permanent redirect status(301) indicating that the resource has moved permanently(永久跳轉)
Temp:Returns a temporary redirect status (302).This is the default(臨時跳轉)
例:vim /etc/httpd/conf.d/redirect.conf
redirect Permanent /var/www/html https://www.Webname.com #添加一條跳轉路徑,指明跳轉後的根目錄
(2)基於HSTS跳轉
目前主流都是採用HSTS(HTTP StrictTransport Security)技術進行跳轉。服務器端配置支持HSTS後,會在給瀏覽器返回的HTTP首部中攜帶HSTS字段。瀏覽器獲取到該信息後,會將全部HTTP訪問請求在內部作重寫307 跳轉到HTTPS。而無需任何網絡過程。當客戶端第一次發http請求過來,服務器端響應https的結果給客戶端,客戶端會把這個響應緩存下來,下次客戶端瀏覽器再次訪問的時候,在瀏覽器端自動會將http轉換爲https,而後以https發請求給服務器。HSTS能夠很大程度上解決SSL剝離攻擊,由於只要瀏覽器曾經與服務器建立過一次安全鏈接,以後瀏覽器會強制使用HTTPS,即便連接被換成了HTTP。
HSTS preload list
HSTS preload list是Chrome瀏覽器中的HSTS預載入列表,在該列表中的網站,使用Chrome瀏覽器訪問時,會自動轉換爲HTTPS。Firefox、Safari、Edge瀏覽器也會採用這個列表。這個是在瀏覽器內配置的,因此是要網站向各瀏覽器服務商申請,瀏覽器纔會支持的。
配置HSTS轉發:
vim /etc/httpd/conf/httpd.conf
Header always set Strict-Transport-Security "max-age=63072000" #告訴瀏覽器下次須要用https進行訪問,這個信息的失效時間爲兩年
RewriteEngine on #打開重寫引擎
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301] #定義重寫規則
最後,修改完成後不要忘了從新加載配置。