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