HTTPS 配置審計

貼上站點的響應頭——如果有的話,再加上它的證書、一段頁面原始碼和主機名——本頁報告 HTTPS 一側的配置:HSTS 是否設定及有效期、內容安全策略是否升級不安全請求、Cookie 是否標記了 Secure 和 SameSite、伺服器橫幅是否洩露版本,以及代理頭顯示應用實際看到的請求。證書在同一報告中審計,明文 http:// 子資源從頁面原始碼中統計,能看見握手的命令也為你列出供自行執行。一切都在瀏覽器中執行,本頁自己不發任何請求。
1. 響應頭
完整的響應頭塊,包括狀態行。最方便的來源:終端裡 curl -sI https://example.com/,或瀏覽器開發者工具 Network 標籤的 Headers 面板,從檔案頂部開始複製。多餘的響應頭會被讀取並忽略;只報告與 HTTPS 相關的部分。
2. 證書或證書鏈(可選)
填入後同一報告還會包含完整的證書審計,配置和證書一起讀取。PEM、裸 base64 或十六進位制正文以及 PKCS#7 .p7b 都可以;證書檢查器單獨對證書做更深入的分析。
3. 頁面原始碼片段(可選)
貼上頁面原始碼(或只貼上含 URL 的標籤),每個明文 http:// 地址都會被列出,因為通過 HTTP 載入的子資源會悄悄破壞掛鎖,即使頁面本身是 HTTPS 到達的,也可能在傳輸途中被改寫。指向站點自身主機的地址會被單獨指出,因為那些用相對 URL 就能修復。
4. 主機名(可選)
填寫主機名後,審計會按瀏覽器的方式檢查主體備用名稱(含萬用字元規則),並把明文 http:// 地址與它對照。
尚未審計
示例是刻意不完美的,讓報告的每一部分都有內容:一段帶 HSTS 和內容安全策略的響應頭(但沒有 preload,且有一個 Cookie 缺 SameSite)、兩張證書的鏈,以及一段通過明文 http:// 載入指令碼、又以同樣方式把圖片指向站點自身主機的頁面片段。示例會得 F,請閱讀下面的發現看每一條的含義。
檢查什麼。從響應頭塊:HSTS 及其 max-age、includeSubDomains 和 preload;升級不安全請求的內容安全策略;每條 Set-Cookie 上的 Secure、HttpOnly 和 SameSite 標誌;寫明產品和版本的伺服器橫幅;以及告訴你應用是否把請求視為 HTTPS 的轉發頭。從證書塊:完整的證書審計,直到鏈上每一環是否真的簽署了下一環。從頁面原始碼:明文 http:// 子資源。三者分開報告再合併總結,因為壞掉的掛鎖通常是三者之一而非另外兩個。要檢視 OWASP 完整的安全響應頭清單——X-Content-Type-Options、框架保護、Referrer-Policy、Permissions-Policy、COOP、COEP、CORP 及分級評分——請把同一段響應頭貼上到 安全響應頭檢查 頁;兩頁按 TLS 層和響應頭層分工。

它看不到什麼。本頁從不開啟 TLS 連線。瀏覽器不向頁面暴露握手,所以協議版本、加密套件、金鑰交換組、OCSP 裝訂、會話恢復、0-RTT、執行中的伺服器實際傳送的證書鏈,以及 HTTP 到 HTTPS 的重定向發生在源站還是代理,都在任何網頁能報告的範圍之外。它也無法訪問第三方站點替你收集響應頭,也無法告訴你證書是否受信任,因為那取決於頁面讀不到的根儲存。本頁下方的命令能看到這些,它們是留給你在自己的機器上執行的。

從哪裡獲取響應頭塊。終端裡 curl -sI https://example.com/ 列印的正是本頁要的內容。瀏覽器裡開啟開發者工具,到 Network 標籤,重新整理頁面,選中文件請求並複製整個 Response Headers 區域,或用 複製 → 複製響應頭。重定向檢查請同時執行 curl -sI http://example.com/ 並把兩段都貼上進來,頁面會先後報告。
尚未審計。在上方貼上響應頭塊並按審計此配置檢視完整報告;證書、頁面原始碼片段和主機名都是可選的,每項都會增加自己的區塊。
可達性探測 — 本頁唯一使用網路的部分
頁面無法開啟 TLS 連線,但可以嘗試一次普通請求。如果站點允許跨源讀取,響應最終到達的 URL 能顯示 http:// 是否被重定向到 https://,這也就是它能證明的全部。如果請求失敗,本頁無法告訴你主機宕機了、你自己的連線斷了,還是站點只是不允許跨源讀取——最後一種最常見,因為多數站點不傳送 Access-Control-Allow-Origin。http:// URL 在任何重定向之前就被應答,所以這是這裡唯一會讓瀏覽器在明文連線上嘗試的事。在你按下按鈕之前什麼也不會離開瀏覽器。
能看見握手的命令
curl -sI https://example.com/ # the header block this page reads curl -sI http://example.com/ # is plain HTTP answered, or redirected? curl -s -o /dev/null -w '%{http_code} %{redirect_url}\n' http://example.com/ openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null openssl s_client -connect example.com:443 -servername example.com -tls1_3 </dev/null 2>/dev/null \ | openssl x509 -noout -subject -issuer -dates -ext subjectAltName nmap --script ssl-enum-ciphers -p 443 example.com testssl.sh example.com # or: docker run --rm -ti drwetter/testssl.sh example.com
這些命令是留給你在受你控制的機器上、對你有權測試的主機執行的。-showcerts 的輸出可以直接貼上進證書檢查器,響應頭輸出則可以粘回本頁。
證書是公開檔案。每張公共受信任的證書都會發布到證書透明度日誌,所以證書內的任何主機名——包括被公共證書頒發機構簽署的內部名稱或打錯的名稱——都可以通過搜尋這些日誌找到。證書還攜帶其頒發者選擇的吊銷地址,而這些地址偶爾會寫內部主機名。這就是 CDN 服務的證書說明不了源伺服器的原因:其中的名稱屬於 CDN。如果審計翻出了你沒預料到的主機名,把它當作公開的,並更換它保護的東西。

隱私:響應頭塊、證書和頁面原始碼都在本地讀取、從不上傳,除非你按下可達性探測裡的按鈕,否則不會發出任何請求。要建立自己的證書請用自簽名證書生成器;要檢查私鑰是否屬於某張證書請用證書與金鑰匹配器。