超詳細網站部落格域名和二級域名、子域名升級HTTPS免費申請SSL證書配置nginx指南
- 2021 年 4 月 26 日
- 筆記
隨著互聯網的飛速發展,我們的工作生活已經離不開互聯網,HTTP雖然使用極為廣泛, 但是存在不小的安全缺陷, 主要是其數據的明文傳送和消息完整性檢測的缺乏, 而這兩點恰好是網路支付,網路交易等網站應用中安全方面最需要關注的。
Google、火狐、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錯誤,檢查是否有錯誤,後執行重啟)
步驟五
驗證是否安裝成功,證書安裝完成後,可通過訪問證書的綁定域名驗證該證書是否安裝成功。例如://www.域名.com
二級域名配置HTTPS
Github地址:完整的單域名+ 二級域名nginx.conf文件配置(完美注釋) — 點擊進入
上述步驟成功之後,我們就可以通過//www.域名.com
來訪問我們網站了,但是問題來了,因為我們申請的免費SSL證書是單域名綁定,也就是只能讓//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 //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 ^(.*)$ //${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 {
}
}
結尾
好了,以上就是本篇全部的配置內容啦。
如果遇到問題可以在下方評論區貼出,一定會第一時間回復!
碼字不易。如果覺得本篇文章對你有幫助的話,希望能可以留言點贊支援,非常感謝~
參考資料
感悟
前兩天有位老哥評論我兩年的一篇部落格(搜索引擎搜索標題:JS做一個可輸入分鐘的倒計時鐘功能
就可以搜到這篇部落格),當時寫的一個倒計時的Demo有個bug,沒想到在2021年被這位老哥發現了,記得當時想了很久也沒找到解決那個bug的方案,兩年後的現在發現燕來並沒有想像的那麼難。
估計現在覺得痛苦萬分的事情,也許兩年後也會淡然一笑吧。
我會變得更好的,是因為你,但不是為了你