超詳細網站部落格域名和二級域名、子域名升級HTTPS免費申請SSL證書配置nginx指南

Tz一號發表於2021-04-26

隨著網際網路的飛速發展,我們的工作生活已經離不開網際網路,HTTP雖然使用極為廣泛, 但是存在不小的安全缺陷, 主要是其資料的明文傳送和訊息完整性檢測的缺乏, 而這兩點恰好是網路支付,網路交易等網站應用中安全方面最需要關注的。

谷歌、火狐、360等瀏覽器開始要求強制使用HTTPS網站,小程式開發也必須是HTTPS網站,企業、網站網頁部署HTTPS加密似乎已經勢不可擋,今天來講解一下怎麼通過Nginx快速把我們的http網站升級成https

HTTPS介紹

再此之前我們先簡單瞭解一下HTTP和HTTPS;

什麼是HTTPS???

HTTPS是一種通過計算機網路進行安全通訊的傳輸協議,經8*由HTTP進行通訊利用SSL/TLS建立全通道**,加密資料包。HTTPS使用的主要目的是提供對網站伺服器的身份認證,同時保護交換資料的隱私與完整性。

特點

  • 內容加密:採用混合加密技術,中間者無法直接檢視明文內容;
  • 驗證身份:通過證書認證客戶端訪問的是自己的伺服器;
  • 保護資料完整性:防止傳輸的內容被中間人冒充或者篡改。

總結: HTTPS牛X!

HTTP和HTTPS的原理

HTTPS 主要由兩部分組成:HTTP + SSL / TLS,也就是在 HTTP 上又加了一層處理加密資訊的模組。服務端和客戶端的資訊傳輸都會通過 TLS 進行加密,所以傳輸的資料都是加密後的資料。

HTTP 原理

① 客戶端的瀏覽器首先要通過網路與伺服器建立連線,該連線是通過TCP來完成,一般 TCP 連線的埠號是80。 建立連線後,客戶機傳送一個請求給伺服器,請求方式的格式為:統一資源識別符號(URL、協議版本號,後邊是MIME資訊包括請求修飾符、客戶機資訊和許可內容。

② 伺服器接到請求後,給予相應的響應資訊,其格式為一個狀態行,包括資訊的協議版本號、一個成功或錯誤的程式碼,後邊是 MIME 資訊包括伺服器資訊、實體資訊和可能的內容。

HTTPS 原理

① 客戶端將它所支援的演算法列表和一個用作產生金鑰的隨機數傳送給伺服器

② 伺服器從演算法列表中選擇一種加密演算法,並將它和一份包含伺服器公用金鑰的證書傳送給客戶端;該證書還包含了用於認證目的的伺服器標識,伺服器同時還提供了一個用作產生金鑰的隨機數;

③ 客戶端對伺服器的證書進行驗證(有關驗證證書,可以參考數字簽名),並抽取伺服器的公用金鑰;然後,再產生一個稱作 pre_master_secret 的隨機密碼串,並使用伺服器的公用金鑰對其進行加密(參考非對稱加 / 解密),並將加密後的資訊傳送給伺服器;

④ 客戶端與伺服器端根據pre_master_secret以及客戶端與伺服器的隨機數值獨立計算出加密和 MAC金鑰;

⑤ 客戶端將所有握手訊息的 MAC 值傳送給伺服器;

⑥ 伺服器將所有握手訊息的 MAC 值傳送給客戶端;

HTTPS優缺點

人有悲歡離合,月有陰晴圓缺,世間萬物皆不可稱完美,HTTPS自然也有它的優缺點。

優點

  • 使用 HTTPS 協議可認證使用者和伺服器,確保資料傳送到正確的客戶機和伺服器;
  • HTTPS 協議是由 SSL+HTTP構建的可進行加密傳輸、身份認證的網路協議,要比 HTTP安全,可防止資料在傳輸過程中被竊取、改變,確保資料的完整性;
  • HTTPS 是現行架構下最安全的解決方案,雖然不是絕對安全,但它大幅增加了中間人攻擊的成本;

缺點

  • 相同網路環境下,HTTPS 協議會使頁面的載入時間延長近 50%,增加 10%到 20%的耗電。此外,HTTPS 協議還會影響快取,增加資料開銷和功耗;
  • 成本增加。部署 HTTPS 後,因為 HTTPS 協議的工作要增加額外的計算資源消耗,例如 SSL 協議加密演算法和 SSL 互動次數將佔用一定的計算資源和伺服器成本。

配置HTTPS

在網路安全如此重要的今天,HTTPS的必要性還是毋庸置疑的,話不多說,沖沖衝!

需要準備的資源

一臺可用的伺服器

首先需要有一臺可用的伺服器,後續用作域名解析。如果沒有伺服器可以先購買一臺雲伺服器。

一個備案過的域名

需要一個備過案的域名,用於解析伺服器的IP地址。在對應購買的域名的服務商網站控制檯可以完成備案。

SSL證書

SSL證書有免費和收費兩個渠道。

我們這邊主要介紹騰訊雲和阿里雲(排名不分先後)兩個免費申請SSL證書的方式,當然資金允許情況下也可以直接購買。

阿里雲申請免費SSL證書

阿里雲免費證書規則:自2021年起,免費證書申請將切換到證書資源包下每個實名個人/企業主體在一個自然年內可以一次性領取20張免費證書,免費證書每張證書有效期一年。免費證書僅支援繫結一個單域名,不支援繫結萬用字元域名或者IP。

阿里雲申請免費SSL證書文件:官方文件地址

騰訊雲申請免費SSL證書

騰訊雲免費證書規則:只支援繫結1個域名,可以支援繫結二級域名 abc.com、或是三級域名 example.abc.com。同一主域最多隻能申請20張免費證書,每張有效期一年,免費證書到期後如需繼續使用證書,需要重新申請並安裝。

騰訊雲申請免費SSL證書文件:官方文件地址

域名升級成HTTPS

我們如果直接用域名解析IP地址,域名也是可以訪問的,但是是HTTP環境的。
我們使用的Nginx來配置升級HTTPS

登入伺服器

市場上有很多終端登入工具,比如:xshell、Putty、FinalShell等等,大家可以根據自己的喜好自行安裝SSH工具進入伺服器(下文以FinalShell工具為示例)。

下載並安裝FinalShell

大家也可自行搜尋下載SSH客戶端,登入頁面大同小異,下面以FinalShell工具為例,安裝完成後開始登入我們的伺服器。

伺服器安裝Nginx

  Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,在BSD-like 協議下發行。其特點是佔有記憶體少,併發能力強,在SSH連線工具連線成功後,輸入命令安裝Nginx;

// 安裝nginx
yum install -y nginx

// 設定nginx開機啟動
systemctl start nginx.service
systemctl enable nginx.service

但是nginx預設使用埠 80, 我們購買的伺服器例項一般預設不開啟埠80,預設只有 22 和 3389埠,我們可以通過設定,開啟80和443埠;登入相應伺服器管理網站開啟埠服務,我們這邊以阿里云為例開始設定。


設定好之後,我們直接訪問我們伺服器的公網IP地址,就可以看到如下畫面,就代表Nginx設定好了;

Nginx伺服器安裝SSL證書

單域名升級HTTPS

Github地址:完整的單域名nginx.conf檔案配置(清晰註釋) -- 點選進入


當我們在上面申請成功免費的SSL證書之後,點選下載證書。

下載完成會得到一個壓縮包,我們解壓之後選擇Nginx資料夾,裡面的兩個檔案就是我們後續需要配置的檔案。
下載到本地的壓縮檔案包解壓後Nginx資料夾包含:

  • .crt檔案:是證書檔案,crt是pem檔案的副檔名。
  • .key檔案:證書的私鑰檔案。

這時候我們開啟我們的SSH工具,進入Nginx的配置:

// 進入nginx目錄,預設安裝在/etc/nginx,這個目錄如果未找到,可以根據nginx安裝的位置進入
cd /etc/nginx
步驟一

在Nginx的安裝目錄下建立cert目錄,並且將下載的全部檔案拷貝到/etc/nginx/cert目錄中(使用SSH工具附帶的本地檔案上傳功能,將本地證書檔案和金鑰檔案上傳到Nginx伺服器的證書目錄[示例中為/etc/nginx/cert])。如果申請證書時是自己建立的CSR檔案,請將對應的私鑰檔案放到cert目錄下並且命名為a.key;


步驟二

然後開始Nginx配置,編輯Nginx配置檔案(nginx.conf)

```
// 進入nginx目錄,預設安裝在/etc/nginx,這個目錄如果未找到,可以根據nginx安裝的位置進入
cd /etc/nginx

// 編輯nginx的配置檔案
vi nginx.conf
```

步驟三

修改與證書相關的配置內容按i鍵進入編輯模式,增加程式碼,監聽443埠,如下

```
  server {
        listen       443 ssl;
        listen       [::]:443;
        server_name  localhost;
         ssl on;

                root /usr/share/nginx/html;
                index index.html index.htm;
        #證書檔名稱
        ssl_certificate cert/a.crt;
        #私鑰檔名稱
        ssl_certificate_key cert/a.key;

        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
```

修改完成後,按Esc鍵、輸入`:wq!`並按Enter鍵,儲存修改後的配置檔案並退出編輯模式。

步驟四

執行命令/sbin/nginx -s reload 重啟伺服器即可!(如果重啟未成功,說明配置檔案nginx.conf錯誤,檢查是否有錯誤,後執行重啟)


步驟五

驗證是否安裝成功,證書安裝完成後,可通過訪問證書的繫結域名驗證該證書是否安裝成功。例如:https://www.域名.com

二級域名配置HTTPS

Github地址:完整的單域名+ 二級域名nginx.conf檔案配置(完美註釋) -- 點選進入


上述步驟成功之後,我們就可以通過https://www.域名.com 來訪問我們網站了,但是問題來了,因為我們申請的免費SSL證書是單域名繫結,也就是隻能讓https://www.域名.com 下的內容實現HTTPS訪問,我們的二級域名api.域名.com還是隻能HTTP訪問。

假設我們現在希望api.域名.com以HTTPS訪問應該怎麼辦呢?

新增二級域名解析

首先我們需要新增二級域名的解析,首先保證httpL//api.域名.com可以正常訪問,IP地址處就填寫我們的公網IP地址。

二級域名申請SSL證書

申請SSL證書的步驟與上面一致,這裡就不在贅述了。最多可以申請20張免費證書,只是申請域名SSL證書的時候,記得填寫我們的api.域名.com,申請成功後我們下載到本地。

把下載的證書檔案放入伺服器

這裡步驟與上述一致,這裡簡單說下:
這時候我們開啟我們的SSH工具,進入Nginx的配置:

// 進入nginx目錄
cd /etc/nginx

在Nginx的安裝目錄下建立cert目錄,並且將下載的全部檔案拷貝到/etc/nginx/cert目錄中(使用SSH工具附帶的本地檔案上傳功能,將本地證書檔案和金鑰檔案上傳到Nginx伺服器的證書目錄[示例中為/etc/nginx/cert])。

為了避免與其他證書檔案呼嘯,我們可以將對應的私鑰檔案放到cert目錄下並且命名為api.key、api.crt;

編輯nginx.conf檔案
    // 進入nginx目錄,預設安裝在/etc/nginx,這個目錄如果未找到,可以根據nginx安裝的位置進入
    cd /etc/nginx

    // 編輯nginx的配置檔案
    vi nginx.conf
    
    
    // 我們也可以把**nginx.conf檔案**儲存至本地然後開啟編輯修改,
    
# 我們也可以把nginx.conf檔案儲存至本地然後修改
開啟監聽8100埠用於二級域名使用

nginx.conf檔案中新增監聽8100埠(別忘記檢查伺服器是否開啟了8100埠):

    server {
        listen       8100 default_server;
        listen       [::]:8100 default_server;
        server_name  _;
        # 這裡root表示指向的目錄,可以根據自身配置路徑
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
二級域名指向8100埠並配置SSL證書

nginx.conf檔案中再次新增監聽443介面:

    server {
        listen       443 ssl;
        # 注:域名處修改成自己的域名地址
        server_name  api.域名.com;
	 ssl on;
        
		
        #證書檔名稱
        ssl_certificate cert/api.crt;
        #私鑰檔名稱
        ssl_certificate_key cert/api.key;

        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  5m;
	ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	ssl_prefer_server_ciphers on;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

		

		location / {
                    # 注:域名處修改成自己的域名地址
		   proxy_pass http://www.域名.com:8100;
		   proxy_set_header Host $host;
        # 獲取請求的ip地址
        proxy_set_header X-real-ip $remote_addr;
        # 獲取請求的多級ip地址,當請求經過多個反向代理時,會獲取多個ip,英文逗號隔開

        }
        
		root /usr/share/nginx/html;
		index index.html index.htm;
		
        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

http自動重定向至https

其實很簡單隻需要在80埠配置那裡新增rewrite重定向即可,

    server {
		# 80埠配置
        listen       80 default_server;
        listen       [::]:80 default_server;
        
        
        
	# 注意這裡改寫成自己的域名!!!
	server_name www.域名.com;
	# http請求時直接重定向到https
    	rewrite ^(.*)$ https://${server_name}$1 permanent; 
        
        
        root         /usr/share/nginx/html/video;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
		
		# location部分用於匹配網頁位置
        location / {
        }
		# 404 配置
        error_page 404 /404.html;
            location = /40x.html {
        }
		# 5xx 配置
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

結尾

好了,以上就是本篇全部的配置內容啦。

如果遇到問題可以在下方評論區貼出,一定會第一時間回覆!

碼字不易。如果覺得本篇文章對你有幫助的話,希望能可以留言點贊支援,非常感謝~

參考資料

HTTPS原理 - 百度百科

感悟

前兩天有位老哥評論我兩年的一篇部落格(搜尋引擎搜尋標題:JS做一個可輸入分鐘的倒數計時鐘功能就可以搜到這篇部落格),當時寫的一個倒數計時的Demo有個bug,沒想到在2021年被這位老哥發現了,記得當時想了很久也沒找到解決那個bug的方案,兩年後的現在發現燕來並沒有想象的那麼難。

估計現在覺得痛苦萬分的事情,也許兩年後也會淡然一笑吧。

我會變得更好的,是因為你,但不是為了你

相關文章