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。如果审计翻出了你没预料到的主机名,把它当作公开的,并更换它保护的东西。

隐私:响应头块、证书和页面源码都在本地读取、从不上传,除非你按下可达性探测里的按钮,否则不会发出任何请求。要创建自己的证书请用自签名证书生成器;要检查私钥是否属于某张证书请用证书与密钥匹配器。