1. 程式人生 > >Linux裏HTTP實現為HTTPS

Linux裏HTTP實現為HTTPS

它的 inux sts 修改配置 客戶端瀏覽器 驗證 protoc dir 保護

    HTTP即超文本傳輸協議(Hypertext Transfer Protocol)。

    這是一個文件的傳輸協議,我們上網的時候,所有的文件都是通過HTTP這個協議,從服務器上傳輸到客戶端的電腦裏面的。同時HTTP協議工作在應用層,所以想要運行這個協議必須有相應的應用程序支撐。

    這裏我們就先了解下什麽是客戶端,什麽是服務端

    客戶端:通常是指我們的瀏覽器,比如谷歌瀏覽器、火狐瀏覽器、IE等,瀏覽器安裝在客戶使用的電腦上,所以,在描述http時,客戶端通常也代指那些安裝了瀏覽器的電腦。

    服務端:通常是指那些安裝了web服務軟件的計算機,如httpd apache,nginx,lighttpd,這些服務端的計算機被稱為服務器。

    當我們從客戶端到服務端拉取文件時,這些服務器就會根據你的請求命令給你返回你所需要的資源。而這些資源在傳輸過程中都會以靜態的html格式文件傳輸,同時它的傳輸方式是明文的。這樣的傳輸方式就會使你的一些重要信息被一些有心人截取下來,所以基於http的傳輸方式並不是安全的。

    這就使HTTPS得以出現

    HTTPS(全稱:httpover ssl,Hyper Text Transfer Protocol over Secure Socket Layer),它是以安全為目標的HTTP通道,簡單講就是HTTP的安全版。即在HTTP下加入了SSL子層,HTTPS的安全基礎是SSL。SSL會使用各種對稱加密算法、非對稱加密算法來加密傳送數據,HTTPS和SSL支持使用X.509數字認證,它提供了通信雙方的身份驗證,保證客戶端到服務器端的通信都在被保護起來。所以有了這些就使得數據的傳輸得到了安全保障。

    通過SSL建立會話的過程需要以下幾步:

      1、客戶端與服務端交換協議版本號

      2、選擇雙方都支持的加密方式,並向服務器請求證書

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

      4、客戶端取得證書並進行證書驗證

      客戶端接收到證書後,執行以下五步:

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

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

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

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

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

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

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

   HTTPS的實現

    1、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站點。

    2、申請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服務的服務名稱

    3、CA簽證

      CA簽發完成後,根CA會把服務器的證書再傳給服務器,同時把根的證書cacert.pem也一起發給服務器服務器。

      簽署後的證書為:/etc/httpd/ssl/httpd.crt

      CA的根證書為:/etc/httpd/ssl/cacert.pem

    4、修改配置文件:/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  #指明根證書的存放位置

    5、重新加載配置

      service httpd reload  #重載配置文件

    6、測試是否配置成功

      測試命令:

      openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]

      例:openssl s_client -connect HostIP:443  #如果出現證書文件內容,則說明https已經搭建成功

      這裏的HostIP也可以寫成你的服務器域名,前提是你的域名已經在DNS服務器上做過域名解析了。

    7、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]  #定義重寫規則

  最後,修改完成後不要忘了重新加載配置。

Linux裏HTTP實現為HTTPS