相信有上線過自己的網站、小程式經驗的同學深有體會,給服務加上 SSL 證書還挺麻煩的,尤其是沒有運維經驗的同學。本來最省事的方法是買個證書,但是一看價格,還是算了吧,動輒就是幾萬塊一年。作為個人來說,這跟搶錢有什麼區別。
現在不管是網站、小程式還是其他的需要請求後端服務的地方,基本都要求 HTTPS 協議了,就拿小程式來說,如果你的服務介面不是 HTTPS 協議,都沒辦法釋出。
以前只要你買一個雲伺服器就能每年領一個證書,現在能領一年免費證書的雲廠商幾乎沒有了,所以只能自己想辦法了。
目標只有一個,免費又簡單。
我上線的所有網站和小程式都是用今天要介紹的方式配置的,簡單又方便。
接下來演示一下給一個網站配置 HTTPS 和 SSL 免費證書的整個過程。
好的,正文開始。
安裝 Nginx
注意,下面的所有操作都是基於 Ubuntu 22.04完成。
使用如下命令安裝 Nginx,注意,使用這種方式安裝的不是最新版的 Nginx,如果安裝最新版Nginx 還需要使用其他方式,比如原始碼安裝、使用特定的安裝源等。
sudo apt install -y nginx
安裝完成後,使用 systemctl status nginx可以檢視 Nginx 的狀態,看到active(running) 表示成功啟動了。
這時候防火牆如果沒有限制的話,直接訪問 ip 會看到 Nginx 預設首頁。
下面是 Nginx 常用的命令,包括檢視狀態、啟動、停止、重啟和設定開機啟動。
## 檢視狀態 systemctl status nginx # 啟動 systemctl start nginx # 停止 systemctl stop nginx # 重啟 systemctl restart nginx # 設定開機啟動 systemctl enable nginx
配置檔案
稍後設定 HTTPS 和證書會修改配置檔案,所以配置檔案在哪兒必須要搞清楚,這也算是基礎中的基礎了。透過 whereis nginx命令就可以看到 nginx 所有檔案的目錄。
一般情況下,系統自動安裝的 Nginx,預設配置在/etc/nginx目錄下,裡面包含了各種配置資訊,其中 nginx.conf是主配置檔案,也是我們常用的配置各種引數、伺服器、主機、HTTPS 這些的地方。
而在比較新版本的 Nginx 中關於 HTTP 和 HTTPS 主機配置的部分建議放到 /etc/nginx/sites-enabled 裡,在 nginx.conf中有 include /etc/nginx/sites-enabled/*;對這個目錄所有配置檔案的引用。當然了,你都配置在 nginx.conf中也完全沒關係。
配置域名和Server
解析域名
首先到你購買域名的服務商那裏給你想要使用的域名新增一個解析,記錄型別為 A ,表示將域名解析到一個 IP 地址上。
codeuphub.com是我要用的域名,這樣解析完之後,使用ping命令ping這個域名,有如下結果表示解析生效了。
配置 HTTP Server 驗證
接下來我在伺服器根目錄建立一個web子目錄,當做網站的根目錄,並且在其中放入你的網站內容,這裏爲了方便演示,我只放了一個 index.html檔案。
然後開啟 /etc/nginx/sites-enabled/default這個配置檔案(當然了,你也可以放到 nginx.conf中),找到其中 listen 為80的 server 節點,這就是控制 HTTP 協議請求的配置。
修改內容如下,注意 location節點下,root 配置上網站的根目錄,也就是我建立的 web 目錄。
server { listen 80 default_server; listen [::]:80 default_server; root /web; server_name _; location / { try_files $uri $uri/ =404; } }
然後使用systemctl restart nginx 重啟 Nginx,或者使用 nginx -s reload重新載入一下。
然後訪問域名,我的域名是 http://tools66.online,就可以看到 web目錄中的頁面了。
試一下 HTTPS
接下來,我們配置一個 HTTPS 的Server,也就是監聽 443 埠的。像下面這樣配置,然後重啟 Nginx 。
server { listen 443 ssl; listen [::]:443 ssl; server_name tools66.online; client_max_body_size 100m; location / { root /web; index index.html; } }
毋庸置疑,出現的結果肯定是下面這樣。
原因就是沒有 SSL 證書,接下來就到重點了,開始配置免費的 SSL 證書。
配置 SSL 證書
現在有很多免費的 SSL 證書網站可供選擇,例如ZeroSSL、LetSencrypt 等等,每個網站都提供了申請免費證書的方式,但是現在的所有免費證書都只有 3 個月的有效期,過期就要重新申請,重新配置。而且申請免費證書需要專門的客戶端工具,整套流程下來,很麻煩。
在IT圈中,任何操作複雜的工具最終都會被抽象得越來越簡單。acme 就是將申請免費證書、自動部署這個過程簡單化的工具,並且可以自動續期,也就是在證書到達有效期之前自動申請新證書,自動部署使其生效,讓你感覺不到證書其實已經換了。
安裝 acme
在伺服器上,使用下面的命令列快速安裝acme,email 配置為你自己的郵箱。
curl https://get.acme.sh | sh -s email=my@example.com
然後稍等片刻,如下圖,出現Install success 的提示表示安裝成功了。透過安裝日誌,可以看到安裝目錄,並且還看到建立一個 cron job,這個job就是自動更新證書的定時任務。
還有一種克隆倉庫的安裝方式。
git clone https://github.com/acmesh-official/acme.sh.git cd ./acme.sh ./acme.sh --install
安裝位置在這裏,也就是當前使用者home目錄中。
Installing to /root/.acme.sh Installed to /root/.acme.sh/acme.sh Installing alias to '/root/.bashrc'
acme生成證書
初次使用,可能需要註冊賬號,一個郵箱即可(此步可先跳過,等到執行具體命令時如果提示,再註冊不遲)
acme.sh --register-account -m huzhichenghigher@126.com
acme 預設使用的是 ZeroSSL,但是 ZeroSSL 不是很穩定,如果可能的話,可以切換到letsencrypt,當然了,不切換也無所謂。
acme.sh --set-default-ca --server letsencrypt
生成證書
有兩種方式生成證書,一種是 HTTP 方式,另一種是 DNS 方式。
比較推薦使用 DNS 方式,域名不用備案,而且可以自動更新續期。
HTTP 方式
下面這個命令是 HTTP 方式,-d 後面是域名,--webroot 後面是網站根目錄。這種方式會在你的伺服器根目錄生成一個驗證檔案,然後透過80埠訪問
但是先彆着急執行啊,這種方式在國內有個問題,就是你的域名必須要先備案,要不然 80 埠會被工信部的未備案提示頁面攔截,導致沒辦法生成證書。
所以域名在國內或者伺服器在國內,最好還是別用這種方式。
acme.sh --issue -d tools66.online --webroot /web/
DNS 方式和自動更新
這種方式是比較推薦的方式,不管你的域名在阿里雲還是什麼平臺,你不需要任何伺服器, 不需要任何公網 ip, 只需要 dns 的解析記錄即可完成驗證。有一些服務是不提供伺服器的,只要根據他們的規則就可以執行服務,例如 GitHub Page、Vercel這些,所以,沒辦法進到伺服器中,不能用 HTTP 方式驗證,因為HTTP方式需要在伺服器生成檔案。
在這裏 https://github.com/acmesh-official/acme.sh/wiki/dnsapi2 ,可以看到所支援的域名供應商,只要能在這裏麵找到的,都支援 DNS 方式驗證,基本上市面上你能買到域名的地方都可以用這種方式,阿里雲、華為雲、騰訊雲等等都在其中,裡面有具體的引數說明。
以阿里云爲例,因為我這個域名 tools66.online是在阿里雲買的。
在 https://ram.console.aliyun.com/manage/ak 這個頁面中,生成一個 key 和 secret,然後將這兩個值匯入環境變數。
export Ali_Key="LTAIcccc" export Ali_Secret="pIRISKS15ffd"
之後再執行生成證書的命令。
acme.sh --issue --dns dns_ali -d tools66.online
當看到以下結果時,表示證書生成成功了
安裝和配置 SSL 證書
接下來開啟 /etc/nginx/sites-enabled/default,修改前面配置的 HTTPS Server 的部分,主要就是加入了 ssl_certificate 和 ssl_certificate_key ,指定了/etc/nginx/ssl目錄下,這個目錄要提前建立好,acme不會自動建立的。
server { listen 443 ssl; listen [::]:443 ssl; server_name tools66.online; ssl_certificate /etc/nginx/ssl/fullchain.cer; ssl_certificate_key /etc/nginx/ssl/tools66.online.key; client_max_body_size 100m; location / { root /web; index index.html; } }
然後就到了最後一步,將acme生成的證書複製證書到指定目錄。
證書生成後會在 acme 的預設目錄下,但是不建議直接使用這個目錄下的檔案,所以,要使用下面的命令將證書複製到指定的位置。
然後執行下面的命令來將證書複製到前面 Nginx 配置中指定的證書目錄中,注意最後 --reloadcmd 命令裡是做了 Nginx 強制過載的操作。
acme.sh --installcert -d tools66.online \ --key-file /etc/nginx/ssl/tools66.online.key \ --fullchain-file /etc/nginx/ssl/fullchain.cer \ --reloadcmd "service nginx force-reload"
當出現下面的結果時,就表示成功了。
這時候,再次訪問 https 的地址,就能正常看到頁面了。
你現在訪問 https://www.codeuphub.coom 這個地址,就是用這個方式安裝的 SSL 證書。
自動更新acme
現在證書已經可以自動更新了,但是 acme 還沒有。因為各個免費 SSL 證書平臺的規則不是一成不變的,隨著他們的更新,acem也會相應的修改規則。
所以,你可以在伺服器上執行下面的命令,設定acme 自動升級,保證可用性。
acme.sh --upgrade --auto-upgrade