本文詳細介紹如何在 Linux 環境下,為 Nginx 或 Tengine 伺服器安裝 SSL 憑證,實現 HTTPS 安全訪問。內容涵蓋認證的下載與上傳、伺服器配置步驟、密鑰參數設定、安裝效果驗證,以及常見問題的排查與處理方法。
適用範圍
開始配置前,確保滿足以下條件:
認證狀態:已擁有由權威機構簽發的 SSL 憑證。若認證即將到期或已到期,請先續約SSL認證。
網域名稱匹配:確保認證能夠匹配所有需保護的網域名稱。如需添加或修改網域名稱,可根據需求購買正式認證或追加和更換網域名稱。
精確網域名稱:僅對指定網域名稱生效。
example.com僅對example.com生效。www.example.com僅對www.example.com生效。
萬用字元網域名稱:僅對其一級子網域名稱生效。
*.example.com對www.example.com、a.example.com等一級子網域名稱生效。*.example.com對根網域名稱example.com和多級子網域名稱a.b.example.com不生效。
說明如需匹配多級子網域名稱,綁定網域名稱中需包含該網域名稱(如
a.b.example.com),或包含相應的萬用字元網域名稱(如*.b.example.com)。伺服器許可權:需要使用
root賬戶或一個具有sudo許可權的賬戶。網域名稱解析:網域名稱已配置解析記錄並解析至伺服器的公網 IP。
操作步驟
步驟一:準備SSL認證
進入SSL認證管理頁面,在目標認證操作列單擊更多進入認證詳情頁面,然後在下載頁簽中下載伺服器類型為Nginx的認證。
解壓下載的認證壓縮包:
若同時包含認證檔案(.pem)和私密金鑰檔案(.key),請妥善儲存上述檔案,後續部署時均需使用。
若僅包含認證檔案(.pem),不含私密金鑰檔案(.key),需配合您本地儲存的私密金鑰檔案一起部署。
說明若申請認證時使用 OpenSSL、Keytool 等工具產生 CSR 檔案,私密金鑰檔案僅儲存在您本地,下載的認證包中不包含私密金鑰。如私密金鑰遺失,認證將無法使用,需重新購買正式認證並產生CSR和私密金鑰。
將解壓後的認證檔案(.pem)和私密金鑰檔案(.key)上傳至伺服器,並存放在一個安全的外部目錄(
/etc/ssl/cert目錄)。說明您可以使用遠程登入工具的本地檔案上傳功能來上傳檔案。例如PuTTY、Xshell或WinSCP等工具。如果您使用的是阿里雲Elastic Compute Service,關於上傳檔案的具體操作,請參見上傳或下載檔案。
步驟二:配置系統與網路環境
確保安全性群組和防火牆允許外部流量訪問。
在伺服器終端執行以下命令,檢測443連接埠的開放情況:
RHEL/CentOS
command -v nc > /dev/null 2>&1 || sudo yum install -y nc # 請將以下的 <當前伺服器的公網 IP> 替換為當前伺服器的公網 IP sudo ss -tlnp | grep -q ':443 ' || sudo nc -l 443 & sleep 1; nc -w 3 -vz <當前伺服器的公網 IP> 443如果輸出
Ncat: Connected to <當前伺服器公網 IP>:443,則表明443連接埠已開放。否則需在安全性群組和防火牆中開放443連接埠。Debian/Ubuntu
command -v nc > /dev/null 2>&1 || sudo apt-get install -y netcat # 請將以下的 <當前伺服器的公網 IP> 替換為當前伺服器的公網 IP sudo ss -tlnp | grep -q ':443 ' || sudo nc -l -p 443 & sleep 1; nc -w 3 -vz <當前伺服器的公網 IP> 443若輸出
Connection to <當前伺服器公網 IP> port [tcp/https] succeeded!或[<當前伺服器公網 IP>] 443 (https) open,則表明443連接埠已開放。否則需在安全性群組和防火牆中開放443連接埠。在安全性群組配置開放443連接埠。
重要若您的伺服器部署在雲平台,請確保其安全性群組已開放 443 連接埠 (TCP),否則外部無法訪問服務。以下操作以阿里雲 ECS 為例,其他雲平台請參考其官方文檔。
進入Elastic Compute Service執行個體,單擊目標執行個體名稱進入執行個體詳情頁面,請參考添加安全性群組規則,在安全性群組中添加一條授權策略為允許、協議類型為 TCP、目的連接埠範圍為 HTTPS(443)、授權對象為任何位置(0.0.0.0/0)的規則。
在防火牆中開放443連接埠。
執行以下命令,識別系統當前的防火牆服務類型:
if command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet firewalld; then echo "firewalld" elif command -v ufw >/dev/null 2>&1 && sudo ufw status | grep -qw active; then echo "ufw" elif command -v nft >/dev/null 2>&1 && sudo nft list ruleset 2>/dev/null | grep -q 'table'; then echo "nftables" elif command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet iptables; then echo "iptables" elif command -v iptables >/dev/null 2>&1 && sudo iptables -L 2>/dev/null | grep -qE 'REJECT|DROP|ACCEPT'; then echo "iptables" else echo "none" fi若輸出為
none,則無需進一步操作。否則,請根據輸出的類型(firewalld、ufw、nftables、iptables),執行以下命令開放 443 連接埠:firewalld
sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reloadufw
sudo ufw allow 443/tcpnftables
sudo nft add table inet filter 2>/dev/null sudo nft add chain inet filter input '{ type filter hook input priority 0; }' 2>/dev/null sudo nft add rule inet filter input tcp dport 443 counter accept 2>/dev/nulliptables
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT為避免 iptables 規則在系統重啟後失效,請執行以下命令持久化 iptables 規則:
RHEL/CentOS
sudo yum install -y iptables-services sudo service iptables saveDebian/Ubuntu
sudo apt-get install -y iptables-persistent sudo iptables-save | sudo tee /etc/iptables/rules.v4 >/dev/null
步驟三:安裝 SSL 憑證到 Nginx
為 Nginx 安裝 SSL 模組。
執行以下命令,若輸出
--with-http_ssl_module則說明已安裝 SSL 模組,否則需進行安裝。nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'說明若系統提示
nginx: command not found,請根據 Nginx 的實際安裝路徑(如/usr/local/nginx/sbin/nginx)運行命令,例如:/usr/local/nginx/sbin/nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'。請根據 Nginx 的安裝方式(編譯安裝或包管理工具安裝),選擇對應的 SSL 模組安裝方法:
重要在升級 Nginx 過程中,Nginx 服務可能會短暫中斷,影響線上業務。
請務必提前備份所有 Nginx 設定檔和網站資料,並選擇業務低峰期操作,完成升級後及時恢複配置並驗證服務正常。
包管理工具安裝
在伺服器終端執行以下命令:
RHEL/CentOS
# 添加 Nginx 官方倉庫 sudo tee /etc/yum.repos.d/nginx.repo <<EOF [nginx-stable] name=nginx stable repo baseurl=https://nginx.org/packages/centos/\$releasever/\$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true EOF # 升級 Nginx sudo yum upgrade nginxDebian/Ubuntu
# 升級 Nginx sudo apt-get update sudo apt-get install --only-upgrade nginx編譯安裝
安裝依賴包。
RHEL/CentOS
sudo yum install -y gcc pcre-devel zlib-devel openssl-develDebian/Ubuntu
sudo apt-get update sudo apt-get install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev查看當前 Nginx 編譯參數。
nginx -V記錄
configure arguments:後的所有參數,後續重新編譯時間需要全部保留。下載與當前 Nginx 版本一致的源碼包。
執行
nginx -v查看當前 Nginx 版本(以 1.14.2 為例)。然後下載當前 Nginx 版本所對應的源碼包並解壓:wget http://nginx.org/download/nginx-1.14.2.tar.gz tar -zxvf nginx-1.14.2.tar.gz cd nginx-1.14.2重新編譯 Nginx,添加 SSL 模組。
在前面步驟複製的參數(
configure arguments:後的所有參數)基礎上,加上--with-http_ssl_module,重新設定和編譯:# 注意:一定要保留所有原有參數,以免丟失現有功能模組。 ./configure <原有參數> --with-http_ssl_module make說明若在執行 make 時出現錯誤
error: ‘ENGINE_by_id’ is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations],說明 Nginx 某些代碼在 OpenSSL 3.0 及以上版本中已被標記為廢棄,編譯器將其視為錯誤。可通過以下命令忽略此類警告,完成編譯:make CFLAGS='-Wno-error=deprecated-declarations'。替換 nginx 可執行檔。
備份原有 nginx(以原有 nginx 可執行檔路徑為
/usr/local/nginx/sbin/nginx為例):# 請將 /usr/local/nginx/sbin/nginx 替換為 nginx 檔案的實際路徑 sudo cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak覆蓋原有 nginx 可執行檔:
# 請將 /usr/local/nginx/sbin/nginx 替換為 nginx 檔案的實際路徑 sudo cp objs/nginx /usr/local/nginx/sbin/nginx驗證 SSL 模組是否安裝成功。
nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'若輸出
--with-http_ssl_module則說明 SSL 模組已安裝成功。
在 Nginx 中配置 SSL 憑證和私密金鑰檔案。
重要本文以 Nginx 1.14.2 版本、設定檔路徑
/etc/nginx/nginx.conf為例進行說明,其同樣適用於與 Nginx 配置相容的 Tengine。如需尋找設定檔的位置,請參見如何尋找 Nginx 使用的設定檔。執行以下命令開啟設定檔。
sudo vim /etc/nginx/nginx.conf添加監聽 443 連接埠的 server 塊。
將現有監聽 80 連接埠的 server 塊複製為新的配置塊,修改其監聽連接埠為
listen 443 ssl,並補充 SSL 憑證配置(包括ssl_certificate和ssl_certificate_key指令),其餘配置項維持不變。# 原有監聽 80 連接埠的 server 塊 server { listen 80; server_name example.com www.example.com; # 其它配置 location / { proxy_pass http://127.0.0.1:8000; } } # 複製已有監聽 80 連接埠的 server 塊,新增為一個新的 server 塊 server { # 將原有 listen 80 修改為 listen 80 改為 listen 443 ssl listen 443 ssl; # 原有 server_name,可繼續新增更多當前認證支援的網域名稱 server_name example.com www.example.com; # ======================= 認證配置開始 ======================= # 指定認證檔案(中間認證可以拼接至該pem檔案中),請將 /etc/ssl/cert/ssl.pem 替換為您實際使用的認證檔案的絕對路徑 ssl_certificate /etc/ssl/cert/ssl.pem; # 指定私密金鑰文檔,請將 /etc/ssl/cert/ssl.key 替換為您實際使用的私密金鑰檔案的絕對路徑 ssl_certificate_key /etc/ssl/cert/ssl.key; # 配置 SSL 會話緩衝,提高效能 ssl_session_cache shared:SSL:1m; # 設定 SSL 會話逾時時間 ssl_session_timeout 5m; # 自訂設定使用的TLS協議的類型以及加密套件(以下為配置樣本,請您自行評估是否需要配置) ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # 指定允許的 TLS 協議版本,TLS協議版本越高,HTTPS通訊的安全性越高,但是相較於低版本TLS協議,高版本TLS協議對瀏覽器的相容性較差 ssl_protocols TLSv1.2 TLSv1.3; # 優先使用服務端指定的加密套件 ssl_prefer_server_ciphers on; # ======================= 認證配置結束 ======================= # 其它配置 }可選:設定 http 請求自動跳轉到 https。在原有監聽 80 連接埠的
server塊中添加return指令即可。# 原有監聽 80 連接埠的 server 塊 server { listen 80; server_name example.com www.example.com; # 設定HTTP請求自動跳轉到HTTPS return 301 https://$host$request_uri; # 原有其它配置 }執行以下命令驗證設定檔的合法性與正確性。若輸出
syntax is ok和test is successful則表示測試通過,否則需根據提示修正配置,直至測試通過。sudo nginx -t -c /etc/nginx/nginx.conf
重載 Nginx 服務。
重要本文以 Nginx 使用預設設定檔路徑啟動為例。如有自訂安裝路徑或設定檔,請根據實際情況相應調整命令和路徑。
請根據 Nginx 當前的運行狀態選擇合適的操作:
若 Nginx 服務已啟動
執行以下命令可重新載入 Nginx 設定檔,無需重啟服務進程且不中斷現有串連。如重載失敗,請參考常見問題進行排查。
sudo nginx -s reload若 Nginx 服務未啟動
執行以下命令以啟動 Nginx 服務。
nginx
步驟四:驗證部署結果
請通過 HTTPS 訪問您已綁定認證的網域名稱(如
https://example.com,example.com需替換為實際網域名稱)。若瀏覽器地址欄顯示安全鎖表徵圖,說明認證已成功部署。如訪問異常或未顯示安全鎖,請先清除瀏覽器緩衝或使用無痕(隱私)模式重試。

Chrome 瀏覽器自 117 版本起,地址欄中的
已被新的
替代,需單擊該表徵圖後查看安全鎖資訊。
如仍有問題,請參考常見問題進行排查。
應用於生產環境
在生產環境部署時,遵循以下最佳實務可提升安全性、穩定性和可維護性:
使用非管理員權限使用者運行:
為應用建立專用的、低許可權的系統使用者,切勿使用擁有管理員權限的賬戶運行應用。
說明建議使用網關層配置 SSL的方案,即將認證部署在Server Load Balancer上,由其終結 HTTPS 流量,再將解密後的 HTTP 流量轉寄到後端應用。
憑證外部化管理:
切勿將密碼等敏感資訊寫入程式碼在代碼或設定檔中。使用環境變數、Vault 或雲端服務商提供的Key Management Service來注入憑證。
啟用 HTTP 到 HTTPS 強制跳轉:
確保所有通過 HTTP 訪問的流量都被自動重新導向到 HTTPS,防止中間人攻擊。
配置現代 TLS 協議:
在伺服器配置中禁用老舊且不安全的協議(如 SSLv3, TLSv1.0, TLSv1.1),僅啟用 TLSv1.2 和 TLSv1.3。
認證監控與自動續期:
建議在認證部署完成後,為網域名稱開啟網域名稱監控功能。阿里雲將自動檢測認證有效期間,並在認證到期前發送提醒,協助您及時續期,避免服務中斷。具體操作請參見購買並開啟公網網域名稱監控。
常見問題
安裝或更新認證後,認證未生效或 HTTPS 無法訪問
常見原因如下:
伺服器安全性群組或防火牆未開放 443 連接埠。請參見配置系統與網路環境。
認證的綁定網域名稱未包含當前訪問的網域名稱。請參見網域名稱匹配。
修改 Nginx 設定檔後,未重載(reload) Nginx 服務。具體操作可參見重載 Nginx 服務。
認證檔案未正確替換,或 Nginx 配置未正確指定憑證路徑。請檢查 Nginx 設定檔和所用認證檔案是否為最新且有效。
網域名稱已接入 CDN、SLB 或 WAF 等雲產品,但未在相應產品中安裝認證。請參閱流量經過多個雲產品時認證的部署位置完成相關操作。
當前網域名稱的 DNS 解析指向多台伺服器,但認證僅在部分伺服器上安裝。需分別在每個伺服器中安裝認證。
如需進一步排查,請參考:根據瀏覽器錯誤提示解決認證部署問題 和 SSL認證部署故障自助排查指南。
如何更新(替換)Nginx 中已安裝的 SSL 憑證
請先備份伺服器上原有的認證檔案(.pem 和 .key),然後登入數位憑證管理服務控制台,下載新的認證檔案(.pem 和 .key),並上傳到目標伺服器覆蓋原有檔案(確保路徑和檔案名稱一致)。最後,重載(reload)Nginx 服務,使新認證生效。
如何尋找 Nginx 使用的設定檔
在終端執行 ps -ef | grep '[n]ginx: master' | grep -- ' -c ',若輸出類似 -c /etc/nginx/custom.conf,則 Nginx 使用的是 /etc/nginx/custom.conf 設定檔;否則執行 nginx -V 2>&1 | grep -oP -- '--conf-path=[^ ]*'查看其預設設定檔路徑(如 --conf-path=/etc/nginx/nginx.conf,表示預設使用 /etc/nginx/nginx.conf)。
如何在 Nginx 中關閉 TLSv1.0 和 TLSv1.1 以避免部分瀏覽器提示“認證不符合標準”
在 Nginx 監聽 443 連接埠的 server 塊中,將 ssl_protocols 僅保留 TLSv1.2 和 TLSv1.3,最終配置為ssl_protocols TLSv1.2 TLSv1.3;。此時將禁用不安全的 TLSv1.0 和 TLSv1.1。配置完成後,執行 nginx -s reload 使設定生效。
nginx -t 檢查配置時報錯:bind() to 0.0.0.0:443 failed (98: Address already in use)
這個錯誤表示 443 連接埠已被其他程式佔用。執行 sudo ss -tlnp | grep :443 命令尋找佔用連接埠的進程,並根據情況停止或修改該進程的配置。常見的佔用者可能是另一個 Web 服務器(如 Apache)或一個未正常關閉的 Nginx 進程。
測試組態檔案報錯:cannot load certificate "/etc/nginx/ssl/domain.pem" : BIO_new_file() failed
認證檔案 /etc/nginx/ssl/domain.pem 的路徑不正確,請將 Nginx 設定檔中的認證檔案路徑修改為正確的地址。
重載(reload)Nginx 時報錯:the "ssl" parameter requires ngx_http_ssl_module
您需要為 Nginx 安裝 SSL 模組,具體操作請參見為 Nginx 安裝 SSL 模組。
重載(reload)Nginx 時報錯:No such file or directory:fopen('/cert/3970497_demo.aliyundoc.com.pem','r') error
認證檔案 /cert/3970497_demo.aliyundoc.com.pem 路徑不正確,請將 Nginx 設定檔中的認證檔案路徑修改為正確的地址。
重載(reload)Nginx 時報錯:permission denied
檢查 Nginx 設定檔(如 nginx.conf)中,user指令所指定的使用者(如 nginx)是否有許可權訪問認證檔案及目錄。