https會話建立的過程
http與https都是基於TCP協議的,所以得先三次握手,確保對方的主機在線。三次握手成功之后,客戶端和服務器端就可以建立SSL會話了。而建立SSL會話首先應該協商單向加密算法、對稱算法、公鑰加密算法,並選擇雙方都支持的算法,選擇完成之后,Server發送自己的證書給客戶端。客戶端對證書驗證完成之后如果發現沒有問題,客戶端會生成一個對稱密鑰(可能是隨機的)並將其使用Server的公鑰加密發送給服務器端,而Server將Client發送的對稱密鑰使用自己的私鑰解密,接下來就可以使用對稱密鑰加密Client請求的內容並傳送給客戶端了,所以SSL會話就建立了。
在三次握手建立完成之后進行協商SSL,這個SSL的建立與主機名無關,因為兩台主機之間的通信靠的是IP和端口,因此兩台主機通信沒辦法基於主機名作區分。這就意味着,若服務器只有一個IP地址,即若當前主機實現了基於域名的虛擬主機,那么它只能為一個虛擬主機提供SSL功能,即SSL會話僅能基於IP地址進行。
https的實現
- 安裝SSL模塊
要想讓Web服務器能夠支持SSL的功能,第一步得安裝SSL模塊
查看模塊:
可發現沒有SSL模塊,因此需要安裝:
生成的/etc/httpd/conf.d/ssl.conf會作為主配置文件的一部分,因此需要重啟才能生效。
一般來講,SSL新增了端口,而只要涉及到新端口(套接字)的話,必須得重啟或重新裝載才能生效。
/var/cache/mod_ssl:SSL會話的緩存數據
- 提供CA
首先CA自簽證書,然后服務器生成一段密鑰,把公鑰發送給CA服務器,讓CA實現簽名。
生成自簽證書:
生成私鑰:
修改默認配置:
certs:生成的證書放置的目錄;
crl:證書吊銷列表放置的目錄
new_certs_dir:新簽的證書;
index.txt:記錄簽署的證書及證書名稱等索引信息;
serial:序列號;
之所以在/etc/pki/CA目錄下,是因為生成的證書默認在此目錄下,為了不修改目錄,而且名稱就叫cacert.pem,因此使用此目錄。
cacert.pem
cakey.pem:私鑰,在private目錄下;
生成自簽證書
創建文件:
- Web Server服務器端,生成一對密鑰,將公鑰保證成證書簽署請求發送給CA服務器
注意:信息需要與CA保持一致,但hostname為需要使用證書的那一個虛擬主機的主機名。
- CA服務器簽署證書
- 將Web Server服務器的證書復制至Web服務器
刪除CA服務器的server服務器的證書頒發請求,避免被竊取:
- 配置Web服務器使用此證書
備份配置文件:
配置文件內容:
<VirtualHost _default_:443>:監聽在443端口的虛擬主機;若有多個IP地址,這個虛擬主機應該監聽在某一特定地址上;
修改如下:
DocumentRoot:需要與對應的虛擬主機的DocumentRoot保持一致;
SSLEngine:是否啟用SSL功能,需要為on;
SSLProtocol:支持的SSL協議,all -SSLv2表示不使用SSLv2,那就只有SSLv3或TLSv1了。
SSLCipherSuite:加密機制,加密套件,ALL所有的但不包括ADH,不使用SSLv2
SSLCertificateFile:證書文件的位置;
SSLCertificateKeyFile:私鑰文件的位置;
- Windows客戶端測試
出現上述提示是因為對於頒發這個證書的機構,我們客戶端未表示信任
因此需要將證書發送給Windows客戶端(使用ftp傳輸工具即可),並命名為*.crt,雙擊安裝即可。
在瀏覽器中查看證書:
需要再次強調的是,請求的URL名稱(即主機名稱)一定要與證書服務器的名稱保持一致。此外,一個地址上只能建立一個虛擬主機。