1. 程式人生 > >HTTP 之 HTTPS實現

HTTP 之 HTTPS實現

https ssl

1 概述

HTTPS(全稱:httpover ssl,Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。 它是一個URI scheme(抽象標識符體系),句法類同http:體系。用於安全的HTTP數據傳輸。https:URL表明它使用了HTTP,但HTTPS存在不同於HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)。這個系統的最初研發由網景公司(Netscape)進行,並內置於其瀏覽器Netscape Navigator中,提供了身份驗證與加密

通訊方法。現在它被廣泛用於萬維網上安全敏感的通訊,例如交易支付方面。

https性能相對http差,所以https在保護隱私上有提高了,但是性能降低了

2 SSL會話的簡化過程

(1) 客戶端發送可供選擇的加密方式,並向服務器請求證書

(2) 服務器端發送證書以及選定的加密方式給客戶端

(3) 客戶端取得證書並進行證書驗證

如果信任給其發證書的CA,執行以下五步:

(a) 驗證證書來源的合法性;用CA的公鑰解密證書上數字簽名

(b) 驗證證書的內容的合法性:完整性驗證

(c) 檢查證書的有效期限

(d) 檢查證書是否被吊銷

(e) 證書中擁有者的名字,與訪問的目標主機要一致

(4) 客戶端生成臨時會話密鑰(對稱密鑰),並使用服務器端的公鑰加密,此數據發送給服務器,完成密鑰交換

(5) 服務用此密鑰加密用戶請求的資源,響應給客戶端

.註意:SSL是基於IP地址實現,IP的主機僅可以使用一個https虛擬主機

3 https實現

3.1 開啟dns

在dns服務器上配置對這臺https服務器的解析

3.2 服務器安裝mod_ssl

安裝語句yum -yinstall 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站點。

3.3 服務器生成證書請求文件

在服務器創建證書簽署請求,這裏是客戶端生成證書請求文件,Common Name要和網站的域名一樣,可以使用泛域名,如*.ghbsunny.com。其他的相關信息,根據根CA的配置文件/etc/pki/tls/openssl.cnf的policy規定的,默認證書要求countryName,stateOrProvinceName,organizationName要和根CA一致

3.4 服務器向根CA申請證書

http服務器將生成的證書申請文件發給CA

3.5 CA簽證

這裏要註意要指定證書的有效期,簽發完成後,根CA頒發服務器的證書給到服務器,同時把根的證書cacert.pem也一起發給服務器服務器。

3.6 配置httpd支持使用ssl和使用的證書

http服務器上ssl.conf配置文件指定服務器證書的路徑,服務器私鑰路徑,同時指定更根CA的證書的路徑

配置文件:/etc/httpd/conf.d/ssl.conf,一般只需要修改以下的選項

DocumentRoot

#調整加密主站點的路徑,沒有調整的話,默認就是http主配置的站點,如果#這裏可以調整DocumentRoot http不一樣,那麽就會導致http https的主站點目錄不一樣。因為這裏配置文件配置了虛擬主機,基於443端口,所以出現了一臺機器兩個主站點,默認httphttps是同一主站點

 DocumentRoot  "/var/www/html"

ServerName

 ServerName www.ghbsunny.com:443

SSLCertificateFile

SSLCertificateFile  /etc/pki/tls/certs/cent63.crt

SSLCertificateKeyFile

 SSLCertificateKeyFile  /etc/pki/tls/private/client.192.168.32.63.key

SSLCertificateChainFile

SSLCertificateChainFile   /etc/pki/tls/certs/cacert.pem

日誌路徑

#以下定義了log的文件,路徑是/etc/httpd/logs,和httplog區分開

ErrorLog  logs/ssl_error_log
TransferLog  logs/ssl_access_log

3.7 測試基於https訪問相應的主機

a 瀏覽器導入證書,可以正常使用

b openssl測試

openssl s_client [-connect host:port] [-cert filename] [-CApathdirectory][-CAfilefilename]

例子

openssl s_client -connect www.ghbsunny.com:443

註意,本地的這臺dns要指向能夠解析www.ghbsunny.com dns服務器

c curl測試:

curl  -cacert  cacert.crt  https://www.ghbsunny.com:443

其中,cacert.crt是給http服務器頒發證書的根服務器的證書文件

4 http重定向https

重定向是指將http請求轉發至httpsURL。這裏建議將httphttps的主站點設置為同一個站點。因為跳轉是會將設置目錄下的所有http請求進行跳轉,如果https沒有http站點的目錄,比如http默認主站點是/var/www/html/,但是https下的主站點是/var/www/https,而且沒有/var/www/https/web1的站點,當有請求http://www.ghbsunny.com/web1,則跳轉會顯示網頁不存在而導致網頁打不開

建議使用HSTS技術進行跳轉

基於redirect跳轉

Redirect技術跳轉的時候,默認客戶端發送不加密的請求到服務器端,然後服務器端告訴客戶端說,網站已經轉到加密站點,然後客戶端再發一個加密請求的站點過來,服務器才返回https的結果給客戶端,中間經過4步。

.重定向格式如下

Redirect [status] URL-path URL

URL-path指網站上的站點路徑

.status狀態:有兩個值 Permanent Temp

.Permanent:Returnsa permanentredirect status (301) indicating that the resource has moved permanently
.Temp:Returnsa temporary redirectstatus (302). This is the default

基於HSTS跳轉

目前主流是采用HSTSHTTP StrictTransport Security)技術進行跳轉

服務器端配置支持HSTS後,會在給瀏覽器返回的HTTP首部中攜帶HSTS字段。瀏覽器獲取到該信息後,會將所有HTTP訪問請求在內部做307跳轉到HTTPS。而無需任何網絡過程。當客戶端第一次發http請求過來,服務器端響應https的結果給客戶端,只有兩步,這個是相對安全的機制,下次客戶端瀏覽器再次訪問的時候,瀏覽器端自動會將http轉換為https,然後以https發請求給服務器

基於HSTS preload list

HSTS preload listChrome瀏覽器中的HSTS預載入列表,在該列表中的網站,使用Chrome瀏覽器訪問時,會自動轉換成HTTPSFirefoxSafariEdge瀏覽器也會采用這個列表。這個是在瀏覽器配置的,是要網站向google申請,谷歌瀏覽器才會支持

例子

.基於redirect示例:

vim /etc/httpd/conf.d/rediect.conf
Redirect   temp  /var/www/html https://www.magedu.com/

基於HSTS示例:

vim /etc/httpd/conf.d/hsts.conf
Header always setStrict-Transport-Security "max-age=15768000"
#以上這段代碼,告訴客戶端瀏覽器下次訪問的時候以https來訪問
#max-age=15768000在這段時間內訪問都自動調整為https來訪問
RewriteEngine on
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1  [redirect=301]



本文出自 “陽光運維” 博客,請務必保留此出處http://ghbsunny.blog.51cto.com/7759574/1970515

HTTP 之 HTTPS實現