如何爲網站啓用HTTPS加密傳輸協議

前言

當今時代對上網的安全性要求比之前更高,chrome和firefox也都大力支持網站使用HTTPS,蘋果也從2017年開始在iOS 10系統中強制app使用HTTPS來傳輸數據,微信小程序也是要求必須使用HTTPS請求,因而可知HTTPS勢在必行。nginx

部落在這裏主要給你們介紹一下什麼是HTTPS,以及如何使用Let’s Encrypt免費證書爲網站啓用HTTPS加密傳輸協議。web

HTTPS簡介

HTTP協議被用於在Web瀏覽器和網站服務器之間傳遞信息。HTTP協議以明文方式發送內容,不提供任何方式的數據加密,若是攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就能夠直接讀懂其中的信息,所以HTTP協議不適合傳輸一些敏感信息,好比信用卡號、密碼等。chrome

爲了解決HTTP協議的這一缺陷,須要使用另外一種協議:安全套接字層超文本傳輸協議HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer) 。爲了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證服務器的身份,併爲瀏覽器和服務器之間的通訊加密。shell

http與https的幾點區別:
一、https協議須要到CA申請證書,通常是收費的。
二、http協議運行在TCP之上,全部傳輸的內容都是明文,https運行在SSL/TLS之上,SSL/TLS運行在TCP之上,全部傳輸的內容都通過加密的。
三、http與https是兩種不一樣的連接方式,端口也不同,http使用80端口,https使用443端口。
四、http的鏈接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。小程序

HTTPS解決的問題

信任主機的問題
採用https的服務器必須從CA (Certificate Authority)申請一個用於證實服務器用途類型的證書。該證書只有用於對應的服務器的時候,客戶端纔信任此主機。後端

通信過程當中的數據的泄密和被篡改
因爲http協議下傳輸的內容都是明文,在數據傳輸的整個鏈路中任意一個節點(路由器、WIFI熱點、網絡運營網等等)均可以拿到傳輸的數據從而進行竄改(好比強行插入廣告)。微信小程序

HTTPS SSL證書的選擇

SSL證書,用於加密HTTP協議,也就是HTTPS。隨着淘寶、百度等網站紛紛實現全站Https加密訪問,搜索引擎對於Https更加友好,加上互聯網上愈來愈多的人重視隱私安全,站長們給網站添加SSL證書彷佛成爲了一種趨勢。瀏覽器

若是是首次考慮爲網站部署HTTPS,估計在選擇證書上會有些頭疼,查閱一些資料後發現這裏要考慮的因素確實有不少,好比是否支持多域名、泛域名、保額、證書的價格還有瀏覽器上的小圖標樣式區別等等。
目前主注的SSL證書主要分爲DV SSL、OV SSL、EV SSL、還有自簽名證書。安全

 

DV SSL( Domain Validation SSL)

DV SSL證書是隻驗證網站域名全部權的簡易型(Class 1級)SSL證書,可10分鐘快速頒發,能起到加密傳輸的做用,但沒法向用戶證實網站的真實身份。 目前市面上的免費證書都是這個類型的,只是提供了對數據的加密,可是對提供證書的我的和機構的身份不作驗證。服務器

OV SSL (Organization Validation SSL)

OV SSL,提供加密功能,對申請者作嚴格的身份審覈驗證,提供可信身份證實。 和DV SSL的區別在於,OV SSL 提供了對我的或者機構的審覈,能確認對方的身份,安全性更高。 因此這部分的證書申請是收費的。

EV SSL ( Extended Validation SSL Certificate)

最安全、最嚴格EV SSL證書遵循全球統一的嚴格身份驗證標準,是目前業界安全級別最高的頂級 (Class 4級)SSL證書。 金融證券、銀行、第三方支付、網上商城等,重點強調網站安全、企業可信形象的網站,涉及交易支付、客戶隱私信息和帳號密碼的傳輸。 這部分的驗證要求最高,申請費用也是最貴的。

以上證書在瀏覽器上都會顯示紅色小鎖頭的圖標,例如:
0SRQ1fZzqkzic7Kic5jwSYgs62cOTeAmhWiaa8jBUCNRqvgib2yofEgFHHDmpK6cXKbFE8Ql6tzZ9bvj6qE4jHF9Kg
也能夠經過瀏覽器來查看某個網站的證書信息來得知這個網站使用的是什麼機構提供的證書。

本文重點講解免費DV證書的選擇,通常我的網站或創業公司初期的網站均可以選用此類證書。

Let’s Encrypt SSL證書

0SRQ1fZzqkzic7Kic5jwSYgs62cOTeAmhW31DVv4cTHVlnAnOtdbDPVKIicUfAody5ESkzIAbAP7Zpu9OC7Ne4R7Q
一、Let’s Encrypt是國外一個公共的免費SSL項目,由 Linux 基金會託管,它的來頭不小,由Mozilla、思科、Akamai、IdenTrust和EFF等組織發起,目的就是向網站自動簽發和管理免費證書,以便加速互聯網由HTTP過渡到HTTPS。
二、Let’s Encrypt安裝部署簡單、方便,目前也已經有現成的安裝腳本,能夠很快的完成證書的申請及發放。
三、目前Let’s Encrypt免費證書的有效期只有90天,因爲Let’s Encrypt的證書屬於自動簽發的,因此咱們也能夠本身寫腳原本實現按期自動更新Let’s Encrypt證書,達到一勞永逸的效果。

StartSSL證書

0SRQ1fZzqkzic7Kic5jwSYgs62cOTeAmhW8zicCVicqKmbgiaUTyHzJHbBTGx2nWIic9v0Gx4GJMK71dX3mln5RT2fXw
一、StartSSL是StartCom公司旗下的SSL證書,應該算是免費SSL證書中的「鼻祖」,最先提供徹底免費的SSL證書而且被各大瀏覽器所支持的恐怕就只有StartSSL證書了。任何我的均可以從StartSSL中申請到免費一年的SSL證書。
二、若是你有看新聞,也許已經知道了「Mozilla正式提議將中止信任 WoSign 和 StartCom 簽發的新證書」,對於StartSSL請觀察事態發展後再謹慎使用。

Let’s encrypt證書安裝

0SRQ1fZzqkzic7Kic5jwSYgs62cOTeAmhWuDceudAdsxXDInBw3Dn0Duniau5qic1LnfMYtqMxTLHNynzYTzypqnwg
利用腳本快速獲取Let’s Encrypt SSL證書,官方推薦的自動化證書頒發和安裝腳本是Certbot,因此這裏也是採用這個腳本進行安裝(執行腳本須要root權限 )。
獲取腳本:

$ wget https://dl.eff.org/certbot-auto
$ chmod a+x certbot-auto
$ mv certbot-auto /usr/local/sbin/

獲取證書:

$ cd /usr/local/sbin
$ ./certbot-auto certonly

獲取證書過程當中Let’s encrypt須要驗證用戶對域名的全部權,根據提示操做便可。
0SRQ1fZzqkzic7Kic5jwSYgs62cOTeAmhW69l8cSV3gCfT21O6aBet4xDs93kyuib7tIc9E8J7Z5uKV8NHr5wImjg
選擇第一個使用webroot方式進行身份驗證

0SRQ1fZzqkzic7Kic5jwSYgs62cOTeAmhWjrg4H8YJ5cicKoB7xUfbtt0lO4VYkyakWdn6oWCrvr1INejJcPaXBdQ
輸入你的郵箱

0SRQ1fZzqkzic7Kic5jwSYgs62cOTeAmhWcNG8kJCib3vfxr6KDheDwnOwgiajLDrzibppIFfIE6MnDdmlBjIibzBmTg
Agree

0SRQ1fZzqkzic7Kic5jwSYgs62cOTeAmhWU5cbxak6tRV3uvUn4a8GeKB8y6b3yrxlWMC0FGiavUpH39QLZuMgrUA
輸入你的域名(以空格分割)domain.com www.domain.com

0SRQ1fZzqkzic7Kic5jwSYgs62cOTeAmhWE0zAVBnJcRL5QeiaEKjZCl5bicop8jeYhyLucMI1htfeQ0pZKicj1qXDw
輸入並選擇本身的站點根目錄,也能夠本身指定一個目錄,要確保可以訪問到,獲取證書過程當中Let’s encrypt會在站點目錄下隨機生成一個文件,並在外部訪問,以驗證你是否對這個域名有全部權。

自定義目錄,以下Nginx配置:

location /.well-known/acme-challenge/ {
    root /var/www/challenges/;
}

驗證過程及生成證書過程輸出:

0SRQ1fZzqkzic7Kic5jwSYgs62cOTeAmhWlv07RWD2hZhhMT4BQXcxEb38SfCKYKpMcJF8QxxPYI9ibxicz0eBrnkg

以上圖形安裝步驟過程也能夠統一使用一條命令指定參數來實現,直接在命令行中指定webroot目錄以及須要獲取證書的域名:

$ ./certbot-auto certonly --webroot -w /var/www/challenges -d example.com -d www.example.com

最終輸出以下內容,表示證書已經獲取成功:

0SRQ1fZzqkzic7Kic5jwSYgs62cOTeAmhWDcIuRHibCJUDpiaD1Ef7fJdrSflhN4OZyjfDLliczPAn7JlxaibJoEbiajw

查看一下生成的證書等文件:

0SRQ1fZzqkzic7Kic5jwSYgs62cOTeAmhWMZ2ibYqlc95SAoNgXWeL1ISxibp4S6ZbIofHOZicv79UHIyEWcvGzt9KQ

若是網站是多臺服務器集羣,也不須要再從新執行以上步驟,直接拷貝這個證書目錄/etc/letsencrypt到集羣中另外的服務器便可,注意這裏面有4個軟連接須要重建。

配置網站使用HTTPS訪問,在Nginx中須要同時綁定兩個Server分別監聽80(HTTP)及443(HTTPS)端口。
Nginx關鍵配置清單:

server {
    listen  80;
    server_name  yourdomain.com www.yourdomain.com;
    ##80端口接收的請求直接重定向到HTTPS端口
    return 301 https://www.yourdomain.com$request_uri;
    ##....
}
server {
    listen 443 default ssl;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    server_name  yourdomain.com www.yourdomain.com;
    ##...
}

配置完成後重載入Nginx配置便可生效,再次經過瀏覽器訪問你的網站就能夠看到綠色小鎖頭的圖標了。

部分頁面&請求配置HTTPS

若是是隻想部分頁面使用HTTPS的話,則須要在兩個server{}分別進行設置,監聽80端口的server經過location來識別,若是是須要加HTTPS的請求路徑,把這個請求rewrite到https(443),監聽443端口的server經過location來識別,若是是不須要加HTTPS的請求時,把這個請求rewrite到http(80)。

配置部分HTTPS略爲麻煩一些,由於還要考慮到頁面上加載的一些資源,加HTTPS的頁面中引用的資源也要是HTTPS的,否則這個HTTPS就沒有什麼意義(其中引用的js腳本仍是有被篡改的風險)。

頁面上若是引用了非https的資源,瀏覽器上的小圖標就變成了不是綠色的,這時候須要本身逐步排查。

若是是作微信的小程序開發或者APP開發時必須要用HTTPS請求,而對應網站又不想使用HTTPS時,使用此方案便可。

假如想實現登陸頁使用HTTPS,其它頁面仍然是HTTP,可參考以下,

Nginx部分配置清單:

server {
    listen  80;
    ##其它請求轉到後端服務器處理
    location / {
        proxy_pass http://server_list;
        proxy_set_header X-Real-IP $remote_addr;
    }
    ##若是是登陸頁面請求,重定向到https
    location ^~ /login{
        rewrite ^ https://$server_addr$request_uri? permanent;
    }
    ##...
 }
server {
    listen 443 ssl;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    ##其它請求重定向到http端口進行處理
    location / {
        rewrite ^ http://$server_addr$request_uri? permanent;
    }
    ##若是是登陸頁面請求,轉到後端服務器處理
    location ^~ /login{
        proxy_pass http://server_list;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    ##...
}

Let’s Encrypt 自動更新證書

Let’s Encrypt 證書的有效期爲90天,建議是每60天更新證書,以避免有偏差影響正常服務,證書自動更新能夠經過運行certbot-auto來進行。
爲全部已安裝證書的域名更新,運行以下命令:

$ ./certbot-auto renew

命令執行過程會檢查證書的到期日期,若是證書還未到期會提示你的證書還沒有到期,輸出以下:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/yourdomain.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal
The following certs are not due for renewal yet:
  /etc/letsencrypt/live/yourdomain.com/fullchain.pem (skipped)
No renewals were attempted.

注意:若是你建立了多個域名的證書,這裏也只顯示基本域名的信息,但證書更新會對證書包含的全部域名有效。
爲確保證書永不過時,須要增長一個cron的按期執行任務,因爲更新證書腳本首先會檢查證書的到期日期,而且僅當證書距離少於30天時纔會執行更新,所以能夠安全的建立每週甚至天天運行的cron任務。
編輯crontab來建立一個定時調度任務(須要root權限),運行:

$ sudo crontab -e

添下如下代碼:

30 3 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/letsencrypt-renew.log
40 3 * * 1 /usr/local/nginx/sbin/nginx -s reload

以上代碼爲建立兩個定時調度任務,先是在每週一的上午3:30執行certbot-auto renew命令來更新證書,而後是在每週一上午3:40時從新加載Nginx,以使用更新的證書,命令生成的log將經過管道輸出到/var/log/letsencrypt-renew.log日誌文件。
至此,你的網站就已經開使用免費的Let’s Encrypt TLS/SSL證書來安全地提供HTTPS內容。

總結

整個過程配置完畢後發現HTTPS沒有想像中那麼難(中大型網站例外,要考慮的因素要多一些),配置HTTPS這部分工做通常是由運維部門的同事來進行,與開發同窗的關係不是很大,瞭解便可。

相關文章
相關標籤/搜索