簽排錯(cuò)實(shí)戰(zhàn))
域名解析剛生效瀏覽器地址欄左邊那個(gè)不安全三個(gè)字就先跳出來了——這是很多新手第一次在1Panel上折騰SSL 證書的場(chǎng)景。有人照著教程點(diǎn)了幾步看著面板上綠色的已部署心里踏實(shí)了結(jié)果第二天換個(gè)瀏覽器訪問報(bào)NET::ERR_CERT_AUTHORITY_INVALID還有人圖省事用了自動(dòng)簽發(fā)三個(gè)月后證書到期沒續(xù)上站點(diǎn)直接白屏被用戶當(dāng)成掛了。我在實(shí)際運(yùn)維里見過太多類似事故所以這篇不打算寫成點(diǎn)這里、點(diǎn)那里的截圖流水賬而是把1Panel 部署 SSL 證書這件事拆成幾層講清楚證書在哪一層生效、自動(dòng)簽發(fā)和手動(dòng)上傳各自適用什么場(chǎng)景、反向代理鏈路里證書該怎么擺、續(xù)簽為什么會(huì)失效、出錯(cuò)時(shí)用什么命令一行行查。適合剛接手一臺(tái)云服務(wù)器、準(zhǔn)備把個(gè)人站點(diǎn)或內(nèi)部服務(wù)從 HTTP 遷到 HTTPS 的朋友也適合已經(jīng)會(huì)點(diǎn)面板但沒弄明白原理、遇到報(bào)錯(cuò)只能重裝的人。1. 先把證書在哪一層生效想明白1.1 證書不是面板的一個(gè)開關(guān)而是綁定在監(jiān)聽端口上的新手最容易踩的認(rèn)知坑是把 SSL 證書當(dāng)成 1Panel 里的一個(gè)全局狀態(tài)點(diǎn)一下申請(qǐng)好像整臺(tái)機(jī)器就變安全了。實(shí)際上證書是綁在具體的監(jiān)聽地址和端口上的同一臺(tái)機(jī)器上不同網(wǎng)站、不同端口完全可以用不同的證書甚至有的站還是 HTTP。1Panel 本身是用 OpenResty 做 Web 服務(wù)的每個(gè)網(wǎng)站在配置目錄下會(huì)生成一份獨(dú)立的 server 配置塊證書路徑、私鑰路徑、TLS 版本、加密套件都寫在這個(gè)塊里。你在面板上點(diǎn)選擇證書本質(zhì)是往這份配置里寫入ssl_certificate和ssl_certificate_key兩行。理解這一點(diǎn)之后很多現(xiàn)象就順了為什么面板上顯示證書已部署但我訪問某個(gè)子域名還是報(bào)錯(cuò)因?yàn)槟莻€(gè)子域名壓根沒綁到這個(gè)網(wǎng)站或者綁到了一個(gè)沒配證書的 server 塊。為什么我用 IP 訪問會(huì)提示證書名稱不匹配因?yàn)樽C書是簽給域名的你拿 IP 去訪問瀏覽器比對(duì)的是證書里的域名和地址欄里的地址天生對(duì)不上。證書永遠(yuǎn)服務(wù)于域名 端口這個(gè)組合脫離這個(gè)組合談部署成功沒有意義。所以動(dòng)手前先畫一張小表把要上 HTTPS 的入口列清楚主域名、帶 www 的、API 子域、后臺(tái)管理子域、面板自身。每一項(xiàng)對(duì)應(yīng)哪份證書、走不走 CDN、是不是反向代理到內(nèi)網(wǎng)端口先寫下來后面按表推進(jìn)就不會(huì)亂。1.2 一張圖理清三個(gè)位置網(wǎng)站、面板、反代實(shí)際要配 HTTPS 的地方通常有三處很多教程混著講導(dǎo)致新手以為配一處就夠了。位置訪問入口證書配置在哪常見遺漏業(yè)務(wù)網(wǎng)站域名 443網(wǎng)站 - 配置 - HTTPS只配了主域忘了子域反向代理后端內(nèi)網(wǎng) IP:端口通常不需要證書誤在后端也配證書重復(fù)加密運(yùn)維面板自身面板端口面板設(shè)置里的面板 SSL一直用 HTTP 裸奔第三處最容易被忽略。很多人把業(yè)務(wù)站配得漂漂亮亮運(yùn)維面板還開著 HTTP登錄密碼在公網(wǎng)明文傳輸。1Panel 的面板 SSL 支持上傳自有證書也支持自簽自簽的話瀏覽器會(huì)警告但至少鏈路是加密的配合安全入口和 IP 白名單風(fēng)險(xiǎn)能壓下去一截。至于反向代理的后端絕大多數(shù)情況下不需要證書。反代流量在回環(huán)或內(nèi)網(wǎng)里跑加證書只是徒增一層握手開銷和維護(hù)成本。我在某公司內(nèi)網(wǎng)見過有人給每個(gè) Node 服務(wù)都配了自簽證書結(jié)果到期時(shí)間各不相同每隔一段時(shí)間就有一個(gè)服務(wù) 502排查起來極其難受。除非你的后端要跨公網(wǎng)、或者有合規(guī)要求必須端到端加密否則讓反代終止 TLS 就夠了。1.3 證書類型怎么挑別一上來就買最貴的按驗(yàn)證等級(jí)分 DV、OV、EV按覆蓋范圍分單域名、多域名、泛域名。對(duì)個(gè)人站和內(nèi)部系統(tǒng)DV 完全夠用瀏覽器顯示的小鎖和 OV 是一模一樣的區(qū)別只在證書詳情里有沒有組織信息。只有在需要對(duì)公展示資質(zhì)、或者客戶合同里明確要求時(shí)OV 才有實(shí)際意義。EV 現(xiàn)在主流瀏覽器也不再給地址欄綠標(biāo)了性價(jià)比很低。覆蓋范圍這塊反而更值得算。假設(shè)你有a.example.com、b.example.com、api.example.com三個(gè)子域且以后還會(huì)加。買單域名證書就要買三張、還要維護(hù)三個(gè)到期日一張泛域名證書*.example.com全包但注意泛域名不覆蓋多級(jí)x.y.example.com不在這張證書的范圍內(nèi)。另外泛域名通常只能走 DNS 驗(yàn)證不能走 HTTP 文件驗(yàn)證這一點(diǎn)直接決定了你后面在 1Panel 里該選哪種簽發(fā)方式。2. 部署前的準(zhǔn)備這幾件事沒做后面全白搭2.1 域名解析A 記錄、AAAA 記錄和 TTL 的坑證書簽發(fā)的前提是驗(yàn)證方能確認(rèn)你確實(shí)控制這個(gè)域名。HTTP 驗(yàn)證要求從公網(wǎng)訪問http://你的域名/.well-known/acme-challenge/xxx能拿到指定內(nèi)容這就要求域名解析已經(jīng)指向這臺(tái)機(jī)器且 80 端口通。所以解析必須提前做最好提前半小時(shí)以上因?yàn)?TTL 緩存不是瞬時(shí)生效的。最常出問題的是 AAAA 記錄。如果你的域名同時(shí)有 A 記錄和 AAAA 記錄而機(jī)器只有 IPv4驗(yàn)證方可能優(yōu)先走 IPv6連接失敗簽發(fā)就卡住。我遇到過好幾次解析明明對(duì)、就是驗(yàn)證不過最后都是刪掉 AAAA 記錄解決的。實(shí)操建議簽發(fā)期間只保留 A 記錄等證書下來再按需補(bǔ) IPv6。另外 IPv4 地址填錯(cuò)一位、或者把域名解析到了 CDN 的 IP 上也會(huì)導(dǎo)致驗(yàn)證失敗。走 CDN 的情況需要特別處理后面第 6 節(jié)會(huì)專門說。2.2 端口放行80 和 443 缺一不可HTTP 驗(yàn)證依賴 80訪問走 443。面板的主機(jī)下面有防火墻管理云廠商控制臺(tái)還有一層安全組兩層都要放行。這一點(diǎn)新手經(jīng)常只改一層就以為完事然后對(duì)著超時(shí)干瞪眼。# 在服務(wù)器上確認(rèn)端口監(jiān)聽狀態(tài) ss -lntp | grep -E :(80|443)\b # 確認(rèn)防火墻規(guī)則firewalld 為例 firewall-cmd --list-ports如果ss看不到 443 監(jiān)聽說明 Web 服務(wù)沒起來或者配置沒生效如果本機(jī)能看到監(jiān)聽但外網(wǎng)訪問超時(shí)八成是云廠商安全組沒開。這兩個(gè)方向必須分開判斷別一股腦去改 Nginx 配置。2.3 面板版本、安全入口與一次完整備份動(dòng)手前先做兩件事升級(jí)面板到較新版本做一次快照或備份。1Panel 的版本迭代里證書管理模塊有過功能調(diào)整老版本可能沒有某些驗(yàn)證方式的入口照著新教程找按鈕會(huì)找不到。備份這塊我強(qiáng)調(diào)一次改 HTTPS 前一定要能回滾。最省事的做法是在云廠商那邊打個(gè)快照或者把網(wǎng)站配置目錄整個(gè)打包。tar czf /root/site-conf-backup-$(date %F).tar.gz \ /opt/1panel/apps/openresty/openresty/conf/ 2/dev/null面板里的應(yīng)用和網(wǎng)站數(shù)據(jù)目錄也建議一并備份。配 HTTPS 本身不會(huì)動(dòng)數(shù)據(jù)但一旦你把強(qiáng)制跳轉(zhuǎn)開上又配錯(cuò)了證書用戶訪問會(huì)直接 4xx回滾速度決定故障時(shí)長。我個(gè)人的習(xí)慣是任何涉及 443 的變更先在低峰期做改完立刻用手機(jī)流量不走本地緩存訪問一遍驗(yàn)證。3. 兩條路線自動(dòng)簽發(fā)和手動(dòng)上傳怎么選3.1 自動(dòng)簽發(fā)省心但要選對(duì)驗(yàn)證方式1Panel 的證書菜單里可以申請(qǐng)免費(fèi) DV 證書走 ACME 協(xié)議。填寫郵箱、域名選擇驗(yàn)證方式等待簽發(fā)。驗(yàn)證方式主要有三類適用場(chǎng)景差別很大驗(yàn)證方式需要條件適合場(chǎng)景缺點(diǎn)HTTP 文件驗(yàn)證80 端口公網(wǎng)可達(dá)域名已解析到本機(jī)單域名、機(jī)器直接對(duì)外通配符不支持CDN 會(huì)攔截DNS 接口驗(yàn)證DNS 服務(wù)商提供 API 密鑰通配符、CDN 后方站點(diǎn)需要配 API 權(quán)限手動(dòng) DNS 驗(yàn)證能手動(dòng)加 TXT 記錄臨時(shí)簽發(fā)、無 API 權(quán)限每次續(xù)簽都要人工介入個(gè)人站首選 HTTP 驗(yàn)證配置最簡單。要多子域或者已經(jīng)在 CDN 后面就走 DNS 接口驗(yàn)證。手動(dòng) DNS 驗(yàn)證只適合一次性場(chǎng)景續(xù)簽時(shí)會(huì)很痛苦因?yàn)樽詣?dòng)續(xù)簽流程沒法替你加 TXT 記錄。還有一個(gè)細(xì)節(jié)申請(qǐng)時(shí)填的郵箱最好用一個(gè)能長期收信的地址證書機(jī)構(gòu)在到期前會(huì)發(fā)提醒郵件。這個(gè)提醒曾經(jīng)救過我一次——某臺(tái)機(jī)器上的續(xù)簽任務(wù)因?yàn)榇疟P滿了靜默失敗就是靠郵件發(fā)現(xiàn)的。3.2 手動(dòng)上傳商業(yè)證書和云廠商證書的落地如果你手上已經(jīng)有證書文件1Panel 支持直接上傳。上傳時(shí)要注意幾個(gè)字段的對(duì)應(yīng)關(guān)系搞錯(cuò)了會(huì)簽出證書鏈不完整的錯(cuò)誤證書CRT/PEM服務(wù)器證書有的服務(wù)商給的文件里已經(jīng)包含了中間證書。私鑰KEY和證書配對(duì)的密鑰絕對(duì)不能泄露也不要提交到代碼倉庫。證書鏈/中間證書部分場(chǎng)景單獨(dú)提供一個(gè)文件。判斷是否完整可以用在線工具但更靠譜的是本地驗(yàn)證# 查看證書包含的域名和有效期 openssl x509 -in fullchain.pem -noout -subject -dates -ext subjectAltName # 驗(yàn)證證書鏈?zhǔn)欠裢暾枰到y(tǒng)根證書 openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt fullchain.pem第二條命令返回OK才算鏈完整。如果報(bào)unable to get local issuer certificate就是缺中間證書需要把中間證書拼到服務(wù)器證書后面順序是服務(wù)器證書在前、中間證書在后拼反了照樣報(bào)錯(cuò)。3.3 格式轉(zhuǎn)換pfx 轉(zhuǎn) pem 的兩行命令不少云廠商導(dǎo)出的格式是.pfx或.p121Panel 要的是 pem 文本格式得轉(zhuǎn)一下。轉(zhuǎn)換時(shí)注意-nodes參數(shù)它讓私鑰不加密輸出否則面板讀取私鑰時(shí)會(huì)因?yàn)橐艽a而失敗。# 導(dǎo)出證書鏈包含服務(wù)器證書和中間證書 openssl pkcs12 -in cert.pfx -nokeys -out fullchain.pem -nodes # 導(dǎo)出私鑰 openssl pkcs12 -in cert.pfx -nocerts -nodes -out privkey.pem # 如果 pfx 有密碼命令會(huì)提示輸入轉(zhuǎn)換完先cat fullchain.pem看一眼正常情況下應(yīng)該能看到至少兩段-----BEGIN CERTIFICATE-----。只有一段的話說明這個(gè) pfx 里沒帶中間證書得找服務(wù)商要中間證書文件。4. 真正把 HTTPS 跑起來網(wǎng)站與反向代理配置4.1 新建站點(diǎn)并綁定域名的完整順序正確順序是先建站、配好 HTTP 能訪問再上證書。反過來做一旦 443 出問題你連 HTTP 都沒得測(cè)排查會(huì)陷入兩難。在網(wǎng)站菜單里創(chuàng)建網(wǎng)站填主域名選擇運(yùn)行環(huán)境靜態(tài)站選靜態(tài)PHP 選對(duì)應(yīng)版本Node 項(xiàng)目走反向代理或獨(dú)立運(yùn)行環(huán)境。創(chuàng)建完成后先別急著開 SSL用瀏覽器訪問http://你的域名確認(rèn)能打開。這一步驗(yàn)證的是域名解析、端口放行、站點(diǎn)綁定三件事同時(shí)成立。確認(rèn) HTTP 正常后進(jìn)入網(wǎng)站配置里的 HTTPS 頁簽選擇剛才簽發(fā)或上傳的證書保存。此時(shí) 1Panel 會(huì)往 server 配置塊里寫入證書路徑并重載 OpenResty。刷新頁面地址欄應(yīng)該出現(xiàn)小鎖。如果沒有先看第 6 節(jié)的排查表。4.2 反向代理場(chǎng)景證書放在哪一層前后端分離或者把內(nèi)網(wǎng)服務(wù)暴露出去一般會(huì)建一個(gè)反向代理站點(diǎn)。這時(shí)候證書配置在代理層也就是 1Panel 里的這個(gè)站點(diǎn)上后端服務(wù)保持 HTTP 即可。原理很簡單外部瀏覽器和代理層之間是加密的代理層和內(nèi)網(wǎng)服務(wù)之間是明文兩段獨(dú)立。配置時(shí)注意幾個(gè)容易出問題的點(diǎn)。第一代理目標(biāo)地址要用內(nèi)網(wǎng) IP 或回環(huán)地址不要寫公網(wǎng)域名否則會(huì)繞一圈還可能被安全組攔。第二Host頭要正確傳遞很多后端框架靠這個(gè)頭做路由或生成鏈接透?jìng)麇e(cuò)了會(huì)生成http://開頭的絕對(duì)鏈接瀏覽器在 HTTPS 頁面加載 HTTP 資源直接觸發(fā)混合內(nèi)容攔截。第三超時(shí)時(shí)間要按業(yè)務(wù)調(diào)默認(rèn)幾十秒對(duì)普通頁面夠用對(duì)大文件上傳或長輪詢就不夠。# 反向代理后常見問題后端生成的絕對(duì)鏈接還是 http # 檢查代理配置里是否傳遞了正確的協(xié)議頭 curl -I https://api.example.com/health如果后端框架需要知道外部其實(shí)是 HTTPS通常要在代理層加上X-Forwarded-Proto: https這類頭具體寫法取決于框架這件事我在第 6 節(jié)會(huì)再展開。4.3 強(qiáng)制 HTTPS、HSTS 與 TLS 參數(shù)的取舍證書配好后建議開啟 HTTP 到 HTTPS 的跳轉(zhuǎn)。1Panel 的 HTTPS 頁面有這個(gè)開關(guān)打開后所有 80 請(qǐng)求會(huì) 301 到 443。這一步能避免用戶手打域名時(shí)走進(jìn)明文通道。HSTS 要不要開它的作用是告訴瀏覽器以后這個(gè)域名只許走 HTTPS瀏覽器會(huì)記住一段時(shí)間期間即使用戶輸http://也會(huì)本地轉(zhuǎn)成 HTTPS且不再詢問是否信任證書。好處是防降級(jí)攻擊代價(jià)是一旦你某天證書出問題用戶連點(diǎn)繼續(xù)訪問的選項(xiàng)都沒有。所以我的建議是先在測(cè)試域名上跑一兩周確認(rèn)續(xù)簽穩(wěn)定再逐步把 max-age 從幾百秒加到一年。上線初期直接拉滿一年等于給自己埋雷。TLS 版本方面現(xiàn)在的合理選擇是只保留 TLS 1.2 和 1.3。TLS 1.0/1.1 早已被主流瀏覽器標(biāo)記為不安全留著只會(huì)拉低評(píng)分。加密套件用面板默認(rèn)的現(xiàn)代組合即可除非你要兼容很老的嵌入式客戶端否則沒必要手工指定一堆。注意修改 TLS 版本和加密套件后務(wù)必用舊版客戶端測(cè)一次。有些企業(yè)內(nèi)部還有跑老系統(tǒng)的機(jī)器一刀切禁用低版本會(huì)讓這部分用戶直接連不上。4.4 面板自身的 HTTPS 也別落下業(yè)務(wù)站配完回頭看看運(yùn)維面板。在面板設(shè)置里有面板 SSL 相關(guān)選項(xiàng)可以上傳證書也可以讓面板自簽一份。自簽的缺點(diǎn)是瀏覽器會(huì)警告但鏈路加密是實(shí)打?qū)嵉?。我的常?guī)做法是給面板單獨(dú)用一個(gè)不容易猜到的子域比如ops-隨機(jī)字符串.example.com配上正式證書同時(shí)開啟安全入口、限制訪問 IP。這樣做的收益不只是加密面板一旦暴露在公網(wǎng)且用默認(rèn)端口掃描器幾分鐘就能發(fā)現(xiàn)登錄接口會(huì)被反復(fù)撞庫。加密 隱藏 訪問控制三件事疊加才算及格。改面板 SSL 有個(gè)坑要提前知道改完端口或協(xié)議當(dāng)前會(huì)話可能直接斷開你需要用新的地址重新登錄。所以不要在只有單一網(wǎng)絡(luò)入口、且身邊沒有備用通道的時(shí)候改我吃過一次虧改完發(fā)現(xiàn)防火墻規(guī)則也順手改了最后從云廠商的遠(yuǎn)程連接救回來。5. 續(xù)簽與輪轉(zhuǎn)別讓到期日變成事故日5.1 自動(dòng)續(xù)簽為什么也會(huì)失敗免費(fèi)證書的有效期現(xiàn)在普遍在 90 天左右且趨勢(shì)是越來越短。1Panel 會(huì)為自動(dòng)簽發(fā)的證書安排續(xù)簽任務(wù)正常情況不用管。但它失敗的原因相當(dāng)多樣我按遇到頻率排一下驗(yàn)證方式失效換了 DNS 服務(wù)商、API 密鑰過期或被刪權(quán)限D(zhuǎn)NS 驗(yàn)證直接掛掉。80 端口被占裝了別的服務(wù)搶了 80或者防火墻規(guī)則被改。域名解析變了機(jī)器遷移后忘了改 A 記錄驗(yàn)證方打到舊 IP 上。磁盤或權(quán)限問題寫不進(jìn)證書目錄任務(wù)靜默失敗。CDN 攔截站點(diǎn)掛在 CDN 后面HTTP 驗(yàn)證請(qǐng)求被 CDN 接走了。這些問題的共同點(diǎn)是不會(huì)主動(dòng)通知你只能靠到期日兜底。所以我從來不把自動(dòng)續(xù)簽當(dāng)成免維護(hù)的承諾而是當(dāng)成一個(gè)需要定期抽查的機(jī)制。5.2 手動(dòng)證書的輪轉(zhuǎn)清單手動(dòng)上傳的證書不會(huì)自動(dòng)續(xù)簽必須在日歷上標(biāo)記。我給自己定的規(guī)矩是證書到期前 30 天開始處理留出兩周緩沖給可能出現(xiàn)的審批、采購、格式轉(zhuǎn)換問題。輪轉(zhuǎn)的時(shí)候不是簡單換個(gè)文件就完事。要做的事包括確認(rèn)新證書的域名列表和舊的一致別漏了 SAN 里的子域確認(rèn)私鑰和證書配對(duì)更新后重啟或重載服務(wù)清理舊文件但保留一份最近過期的做對(duì)照記錄新證書的到期時(shí)間。如果是多臺(tái)機(jī)器共用一張證書那每一臺(tái)都要更新漏一臺(tái)就是隱患。我見過最典型的事故是多機(jī)部署運(yùn)維只更新了主節(jié)點(diǎn)備用節(jié)點(diǎn)上的證書過期切換流量時(shí)用戶全部報(bào)錯(cuò)。5.3 加一道外部監(jiān)控別只信任面板面板顯示正常不代表外部訪問正常。最穩(wěn)妥的是加一個(gè)外部可用性監(jiān)控從公網(wǎng)定時(shí)探測(cè)你的域名同時(shí)檢查證書剩余有效期。很多免費(fèi)監(jiān)控服務(wù)都支持證書到期提醒。如果不想依賴外部服務(wù)寫個(gè)簡單的腳本跑定時(shí)任務(wù)也夠用#!/bin/bash # 檢查證書剩余天數(shù)低于 21 天報(bào)警 DOMAINexample.com END_DATE$(echo | openssl s_client -servername $DOMAIN \ -connect $DOMAIN:443 2/dev/null \ | openssl x509 -noout -enddate | cut -d -f2) END_TS$(date -d $END_DATE %s) NOW_TS$(date %s) DAYS$(( (END_TS - NOW_TS) / 86400 )) echo 剩余 $DAYS 天 [ $DAYS -lt 21 ] echo 證書即將過期請(qǐng)?zhí)幚磉@個(gè)腳本的關(guān)鍵是從外部探測(cè)而不是讀本地文件——它能同時(shí)發(fā)現(xiàn)證書沒續(xù)上和服務(wù)根本沒起來兩類問題。6. 報(bào)錯(cuò)實(shí)錄從現(xiàn)象倒推原因6.1 瀏覽器報(bào)錯(cuò)對(duì)照表把常見報(bào)錯(cuò)和對(duì)因整理成表遇到問題先查表定位方向再去翻具體配置。瀏覽器提示可能原因優(yōu)先排查證書已過期續(xù)簽失敗或未更新查看證書有效期證書名稱不匹配訪問的域名不在證書 SAN 里核對(duì)證書覆蓋域名證書鏈不完整缺中間證書拼接 fullchain無法提供安全連接協(xié)議/套件不兼容檢查 TLS 版本設(shè)置混合內(nèi)容被攔截頁面里有 HTTP 資源查看控制臺(tái)具體資源連接被重置端口未放行或被攔截檢查防火墻和安全組表格之外補(bǔ)一句先用無痕窗口測(cè)。瀏覽器會(huì)緩存 HSTS 狀態(tài)和證書信息普通窗口里改了配置可能看不到變化白白浪費(fèi)排查時(shí)間。6.2 三條命令定位大半問題命令行比瀏覽器更能說明問題。第一條看握手和證書鏈openssl s_client -connect example.com:443 -servername example.com /dev/null輸出里注意Verify return code0 表示鏈完整非 0 大多是缺中間證書。第二條看證書詳情echo | openssl s_client -connect example.com:443 -servername example.com 2/dev/null \ | openssl x509 -noout -subject -issuer -dates -ext subjectAltName重點(diǎn)看 SAN 里到底列了哪些域名很多名稱不匹配就是這里少了一條。第三條確認(rèn)跳轉(zhuǎn)和響應(yīng)頭curl -I http://example.com curl -I https://example.com第一條應(yīng)該返回 301 且 Location 指向 https第二條返回 200。如果第二條返回 502問題在反代后端跟證書無關(guān)方向要立刻切換。6.3 幾個(gè)排查時(shí)容易走錯(cuò)的方向誤把 502 當(dāng)證書問題。證書出問題瀏覽器是拒絕建立連接你根本收不到 HTTP 響應(yīng)。能收到 502、504 這類狀態(tài)碼說明 TLS 握手已經(jīng)成功問題在后端。這個(gè)判斷非常重要能省掉大量無用功。忘了 CDN 這一層。站點(diǎn)掛 CDN 后用戶訪問的是 CDN 節(jié)點(diǎn)節(jié)點(diǎn)回源到你的服務(wù)器。這時(shí)候你本地證書配得再好用戶看到的還是 CDN 上的證書。要么在 CDN 側(cè)上傳證書要么把 CDN 的回源協(xié)議改成 HTTPS 并信任源站證書。如果 CDN 的回源走 HTTP 文件驗(yàn)證被攔就得改用 DNS 驗(yàn)證簽發(fā)。內(nèi)網(wǎng)訪問被證書攔住。用192.168.x.x訪問配了域名證書的站點(diǎn)必然報(bào)名稱不匹配。規(guī)范做法是內(nèi)網(wǎng)也走域名解析或者接受這個(gè)警告僅在內(nèi)部使用。反向代理導(dǎo)致的重定向循環(huán)。開了強(qiáng)制 HTTPS后端又自己判斷協(xié)議做跳轉(zhuǎn)兩邊互相踢皮球?yàn)g覽器報(bào)重定向次數(shù)過多。解決辦法是讓代理層傳遞正確的協(xié)議頭或者只在一處做跳轉(zhuǎn)。7. 我在實(shí)際部署里攢下的幾條經(jīng)驗(yàn)配置 HTTPS 這件事技術(shù)門檻其實(shí)不高難的是把邊界情況想全。我總結(jié)幾條自己反復(fù)驗(yàn)證過的心得。第一先把 HTTP 跑通再上證書。這個(gè)順序看著笨但能把域名、端口、站點(diǎn)綁定和證書配置兩類問題徹底分開。反過來做一旦不通你面對(duì)的是三重變量的組合排查時(shí)間會(huì)翻好幾倍。第二每次變更只動(dòng)一個(gè)變量。改證書、改跳轉(zhuǎn)、改 TLS 版本、改反代一次只做一件做完立刻驗(yàn)證。我見過有人一次性全部改完出問題后完全不知道是哪一步引起的最后只能整體回滾重來。第三證書文件統(tǒng)一放一個(gè)固定目錄并做好命名。1Panel 上傳證書后會(huì)自己管理路徑但如果你手工維護(hù)文件建議用域名-到期年月-fullchain.pem這種命名一眼能看出新舊和有效期。輪轉(zhuǎn)時(shí)最怕拿錯(cuò)文件這種低級(jí)錯(cuò)誤造成的線上故障并不少見。第四把到期前 30 天當(dāng)成硬性檢查點(diǎn)。不管是自動(dòng)簽發(fā)還是手動(dòng)證書都去檢查一次。自動(dòng)續(xù)簽失敗往往是靜默的而 30 天足夠你從容處理等到剩三天才發(fā)現(xiàn)就只能在深夜救火了。第五測(cè)試要用外部視角。本機(jī)curl localhost通不代表公網(wǎng)通本地瀏覽器正常不代表別人的瀏覽器正常。手機(jī)切到移動(dòng)網(wǎng)絡(luò)、用無痕窗口、換一個(gè) DNS 解析器這幾個(gè)動(dòng)作花不了兩分鐘卻能提前發(fā)現(xiàn)大部分問題。我現(xiàn)在每次改完 443都會(huì)用手機(jī)流量訪問一遍主域和一個(gè)子域這已經(jīng)成了肌肉記憶。