免费在线工具测一个站只要10秒,但50个站逐一手动测完天都黑了,换成脚本批量扫一遍连报告都自动生成好了
一个做站群的朋友上个月遇到件事:他手里30多个站,某天早上突然有客户反馈好几个域名浏览器都提示"不安全"。一查才发现,三个站点的免费SSL证书过期了,还有一个站的中间证书链断了。前前后后排查加修复折腾了大半天。他说了句挺有道理的话——单个站HTTPS出问题不可怕,可怕的是几十个站一起出问题你还不知道。
SSL Labs、myssl.com这些在线工具测一个站确实好用,证书详情、TLS版本、加密套件一目了然。但问题是:测完一个站你得手动输入下一个域名,测完10个站手指已经酸了,测完50个站——没人会这么干。HTTPS检测这件事,站点数量一上去,免费在线工具和批量脚本之间的效率差距不是差几倍,是差了一个维度。
HTTPS批量检测应该覆盖哪些维度
| 1 | 证书有效期:距离过期还剩多少天,这个最容易出问题 |
| 2 | 证书链完整性:根证书→中间证书→服务器证书,缺一环就报错 |
| 3 | TLS协议版本:是否还支持TLS 1.0/1.1(该关了),是否已支持TLS 1.3 |
| 4 | 域名匹配:证书上的域名和实际访问的域名是否一致 |
| 5 | 混合内容:HTTPS页面里是否还加载了HTTP资源(图片、CSS、JS) |
| 6 | HSTS/安全头:是否配置了HSTS、CSP等安全响应头 |
一、先看在线工具:单个站够用,批量就是灾难

市面上好用的在线HTTPS检测工具不少,功能也很全。SSL Labs(ssllabs.com)算是行业标准,输入一个域名,等两三分钟出完整报告:证书有效期、证书链路径、支持的TLS版本、加密套件强度、协议漏洞,还有A+到F的评级。myssl.com是国内用得最多的,界面更直观,检测速度也快一些。还有httpsok.cn、ssltool.cc这些,都做得不错。
但所有这些在线工具的共性问题是一样的:一次只能测一个站。你手里有20个站,就得手动输入20次域名,等20次检测结果,人工看20份报告,然后自己整理成表格。30个站以上,光是手动输入域名的过程就能把人搞崩溃。
| 工具 | 核心优势 | 单次耗时 | 50个站预估总耗时 | 能否批量 |
|---|---|---|---|---|
| SSL Labs | 最权威的TLS深度分析,A+评级体系 | 2-3分钟 | 约2.5小时 | 不支持 |
| myssl.com | 国内访问快,证书链检测直观 | 10-30秒 | 约15分钟 | 不支持 |
| httpsok.cn | TLS版本+加密套件+HSTS一体化报告 | 10-20秒 | 约12分钟 | 不支持 |
| ssltool.cc | 证书链可视化做得最好 | 15-30秒 | 约20分钟 | 不支持 |
纯手动测50个站,即使选最快的工具,光是操作等待的时间就要十几分钟,还没算上整理报告的功夫。而且人工逐条比对很容易漏——第37个站的证书链缺了中间证书,你眼睛一花就跳过去了。
二、OpenSSL命令行:单条命令精准定位,串起来就是批量脚本
如果你只需要快速看一个站的证书有效期,OpenSSL一行命令就解决了。不需要打开浏览器、不需要等页面加载:
# 查看证书有效期echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -dates# 输出示例:# notBefore=Jun 15 00:00:00 2026 GMT# notAfter=Sep 13 23:59:59 2026 GMT这条命令连到目标服务器的443端口,抓取证书,然后解析出生效日期和过期日期。一行命令,不到两秒出结果。想看证书链有没有断?加上-showcerts参数:
# 查看完整证书链echo | openssl s_client -servername example.com -connect example.com:443 -showcerts 2>/dev/null | grep -E "s:|i:|subject|issuer"OpenSSL命令行强在精准和快速,而且天生适合被脚本包裹。你把几十个域名放在一个txt文件里,写个shell循环,就能实现最基本的批量检测。但这个方案也有短板:不支持TLS版本检测、不支持混合内容扫描、不支持HSTS头检查。它只是一个证书信息的查看工具,不是完整的HTTPS安全审计工具。
OpenSSL的局限
它只能告诉你证书"有没有"和"什么时候到期",不能告诉你配置"好不好"。一个站可以证书有效、证书链完整,但同时支持TLS 1.0(有已知漏洞)且没配HSTS——OpenSSL不会告诉你这些。
三、Shell脚本批量方案:把OpenSSL包一层,10分钟写完跑一辈子
把OpenSSL命令包进shell循环,就是最实用的批量检测方案。思路很简单:准备一个域名列表文件(domains.txt),一行一个域名;写个脚本逐个连过去查证书过期时间;算出剩余天数;少于30天的标红警告。

#!/bin/bash# 批量检测SSL证书过期时间DOMAINS_FILE="domains.txt"WARN_DAYS=30while IFS= read -r domain; do[[ -z "$domain" || "$domain" == \#* ]] && continueend_date=$(echo | openssl s_client -servername "$domain" -connect "$domain:443" 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)if [[ -z "$end_date" ]]; thenecho "⚠️ $domain | 连接失败或无法获取证书"continuefiend_epoch=$(date -d "$end_date" +%s 2>/dev/null)now_epoch=$(date +%s)days_left=$(( (end_epoch - now_epoch) / 86400 ))if [[ $days_left -le $WARN_DAYS ]]; thenecho "🔴 $domain | 剩余 ${days_left} 天 | 过期: $end_date"elseecho "🟢 $domain | 剩余 ${days_left} 天 | 过期: $end_date"fidone < "$DOMAINS_FILE"这个脚本的优点是零依赖——只要服务器上有openssl和bash就能跑。配个crontab每天凌晨自动执行,结果发到企业微信或者钉钉群,从此再也不用担心证书过期忘续了。站群运维里最怕的就是"忘了续",自动化巡检是性价比最高的方案。
Shell脚本方案优点
零依赖、运行快、天生适合crontab定时、可以接钉钉/企业微信/邮件告警、改几行就能加新功能
Shell脚本方案短板
只能测证书有效期、测不了TLS版本和加密套件、测不了混合内容、跨平台兼容性差(date命令在macOS和Linux上不一样)
四、Python脚本方案:检测维度更全,输出报告更专业
如果你的需求不只是"证书有没有过期",还要知道每个站支持哪些TLS版本、用了什么加密套件、有没有配HSTS、有没有混合内容——那Shell脚本就力不从心了。Python生态里有现成的库可以搞定这些。
核心用两个库:ssl(Python内置,处理证书连接)和requests(发HTTP请求检查响应头和混合内容)。检测逻辑不复杂:先连443端口抓证书信息(有效期、颁发者、域名匹配),再发HTTPS请求检查HSTS头和安全头,最后扫页面源码里有没有http://的资源引用。
import sslimport socketimport requestsfrom datetime import datetimefrom urllib.parse import urlparseimport csvdef check_ssl_cert(domain, port=443):"""检测SSL证书信息"""ctx = ssl.create_default_context()try:with socket.create_connection((domain, port), timeout=5) as sock:with ctx.wrap_socket(sock, server_hostname=domain) as ssock:cert = ssock.getpeercert()# 过期时间not_after = datetime.strptime(cert['notAfter'], "%b %d %H:%M:%S %Y %Z")days_left = (not_after - datetime.now()).days# TLS版本tls_ver = ssock.version()# 颁发者issuer = dict(x[0] for x in cert['issuer'])return {'days_left': days_left,'tls_version': tls_ver,'issuer': issuer.get('organizationName', 'Unknown'),'not_after': not_after.strftime('%Y-%m-%d'),'subject': dict(x[0] for x in cert['subject'])}except Exception as e:return {'error': str(e)}def check_https_headers(domain):"""检测安全响应头"""try:r = requests.get(f"https://{domain}", timeout=10, allow_redirects=True)headers = r.headersreturn {'hsts': 'Strict-Transport-Security' in headers,'hsts_max_age': headers.get('Strict-Transport-Security', ''),'status_code': r.status_code,'redirect_http': r.history[0].status_code if r.history else None}except Exception as e:return {'error': str(e)}def check_mixed_content(domain):"""检测页面中是否有混合内容"""try:r = requests.get(f"https://{domain}", timeout=10)html = r.texthttp_refs = []# 检查img src中http://引用if 'src="http://' in html:http_refs.append('img')# 检查link href中http://引用if 'href="http://' in html:http_refs.append('link')# 检查script src中http://引用if "src='http://" in html:http_refs.append('script')return {'has_mixed': len(http_refs) > 0, 'types': http_refs}except:return {'error': '无法访问页面'}Python方案的优势在于检测维度完整。证书有效期、TLS版本、颁发者、HSTS头、混合内容——一次脚本跑完,输出一个CSV表格,所有站点的HTTPS健康状况一目了然。而且Python跨平台毫无压力,Windows、macOS、Linux都能跑。
Python vs Shell:选哪个?
如果只关心"证书什么时候过期",Shell脚本就够了,5分钟写完。如果需要完整的安全审计报告(TLS版本、加密套件、HSTS、混合内容、证书链),用Python。两个方案不是替代关系,是场景互补——Shell做日常巡检告警,Python做深度审计和出报告。
五、专业监控工具:不只是检测,是持续守护
脚本方案解决的是"批量检测"的问题,但如果你的站点数量到了50个以上、或者站点是面向客户的业务型站点(而不是纯SEO站群),那应该考虑上一套专业的SSL监控工具。区别在于:脚本是"定时跑一次",监控工具是"7×24小时持续盯着"。
| 工具 | 检测维度 | 批量能力 | 告警方式 | 适合场景 |
|---|---|---|---|---|
| UptimeRobot | 证书过期、SSL错误 | 50个站点 | 邮件、Slack、Webhook | 中小规模站群,快速上手 |
| Sematext Synthetics | 证书过期+链完整性+TLS版本 | 无上限 | 邮件、Slack、PagerDuty | 需要深度诊断的团队 |
| Dotcom-Monitor | 证书+网站+事务全维度 | 无上限,全球多节点 | 邮件、短信、电话 | 企业级,全球多地检测 |
| TrackSSL | 证书到期+变更提醒+CT日志 | 无上限 | 邮件、Slack | 专注证书层面的安全管理 |
| Oh Dear | 证书到期+变更前后对比 | 多站点 | 邮件、Slack | 开发者友好,证书变更感知强 |
这些工具的核心价值不在"能不能检测"——Shell脚本也能检测。它们的价值在于持续的、自动的、多维度的监控+告警。你的站点凌晨两点证书过期了,脚本要等到第二天早上crontab触发才知道;专业工具会在过期前30天、14天、7天、1天持续提醒你,过期那一刻立即推送告警。

六、站群场景下的HTTPS检测,有三个特殊问题
普通网站的HTTPS检测关注的是"这个站安不安全"。站群场景下,多了三个维度要考虑:
问题一:证书签发CA统一带来的关联风险
30个站全部用Let's Encrypt的免费证书,CA都是R3或E1,这在某些场景下可能成为站群关联信号。检测时不仅要看证书有没有效,还要看签发CA是否过于集中。
问题二:多服务器/多CDN下的证书不一致
同一个域名可能背后有多台服务器或CDN节点,不同节点返回的证书可能不一样(尤其是证书刚续签时)。批量检测时要注意从多地域节点验证。
问题三:免费证书90天周期的批量管理
Let's Encrypt证书90天过期。50个站的证书过期时间如果各不相同,管理复杂度直接爆炸。需要用acme.sh统一管理续签策略,让所有证书集中续签、统一过期时间。
针对问题三,acme.sh是目前最成熟的免费证书自动化方案。一条命令部署,自动续签,支持通配符证书和多域名证书。站群场景下,可以配置一个统一的续签脚本,把所有域名证书的过期时间对齐到同一天,然后crontab定时续签,配合前面的Shell批量检测脚本做双重保险。
用UC建站系统做多站矩阵的团队,独立部署模式下每个站点都有自己的独立IP和独立SSL证书配置,不会出现多站共用一张证书的情况。配合系统的统一监控看板,所有站点的证书状态、HTTPS配置、安全头检测结果在一个界面里就能看到,不用一个一个站去跑脚本——哪个站的证书快过期了、哪个站的TLS版本还停留在1.0、哪个站的HSTS没配,看板上一目了然。
七、怎么选:一张决策路径图
说了这么多工具和方案,最后给一个实用的选择逻辑。按你的站点数量和关注维度来匹配:
| 你的情况 | 推荐方案 | 上手成本 | 核心优势 |
|---|---|---|---|
| 5个站以内 | 在线工具(myssl.com / SSL Labs) | 零 | 打开网页就能用 |
| 5-20个站,只看证书有效期 | Shell脚本 + crontab + 企微告警 | 10分钟 | 零成本,配完不用管 |
| 20-50个站,需要完整安全审计 | Python脚本 + CSV报告输出 | 30分钟 | 检测维度最全,可定制 |
| 50个站以上,业务型站点 | 专业监控工具(UptimeRobot/Sematext) | 1小时配置 | 7×24持续监控+多渠道告警 |
| 100+站群,需要系统化管理 | UC建站统一监控看板 + 脚本双重保险 | 按需 | 证书+HTTPS+安全头全维度看板 |
很多站长的实际情况是:5个站的时候觉得没必要搞自动化,等到站点涨到20个了才发现手动管不过来了,然后又因为没时间一次性搞定所有配置,拖着拖着就有站点的证书过期了。建议从一开始就用最简单的Shell脚本把批量检测跑起来,哪怕你现在只有5个站——自动化这件事,越早做越省心。
HTTPS检测工具这件事,不需要过度选择。拿一张纸写下你的站点数量、你最关心的检测维度(证书过期?TLS版本?混合内容?),然后对着上面的决策表找对应方案。Shell脚本、Python脚本、专业监控工具——三个层级,按需选择,关键是别让"选工具"变成拖延的借口,先跑起来再说。
