Apache无ssl_reject_handshake指令,须用优先级最高的默认HTTPS VirtualHost(置于所有其他VirtualHost之前)配置SSLEngine、有效证书及Require all denied来拒绝未绑定域名访问。

Apache 没有 ssl_reject_handshake 这个指令,它不是 Apache mod_ssl 的合法配置项。这个名称容易让人联想到 Nginx 的 ssl_reject_handshake on(实际也不存在,Nginx 用 return 444 或 if ($host !~ ...) 实现类似效果),但在 Apache 中不存在等效的内置指令。
要实现「拒绝未绑定域名的 HTTPS 请求」——即当用户用 IP 或非法域名访问 443 端口时,不返回默认证书、不建立有效 TLS 连接,而是中断握手或返回错误——必须通过配置顺序 + 默认虚拟主机 + 强制拒绝行为来达成,核心逻辑是:让一个「兜底拒绝型 VirtualHost」最先匹配,并主动阻断响应。
✅ 正确做法:用优先级最高的默认 HTTPS VirtualHost 返回 403 或直接关闭连接
Apache 不支持在 TLS 握手阶段就拒绝(不像某些商业 WAF 或自研 OpenSSL 补丁),但可在 SSL 解密后、HTTP 路由前,用 <VirtualHost *:443> 块拦截并拒绝。
关键点:
- 该块必须*出现在所有其他 `<VirtualHost :443>` 块之前**
- 必须显式监听
*:443(或你的服务器 IP:443) - 必须包含有效的 SSL 配置(否则 Apache 启动失败)
- 使用
Require all denied或Redirect 403主动拒绝请求
示例配置(放在 /etc/httpd/conf.d/00-block-unbound.conf,确保文件名排序靠前)
<VirtualHost *:443>
ServerName 123.45.67.89 # 替换为你的公网IP,或留空但不推荐
# 必须提供可加载的证书,哪怕自签名
SSLEngine on
SSLCertificateFile /etc/ssl/certs/localhost.crt
SSLCertificateKeyFile /etc/ssl/private/localhost.key
# 拒绝所有访问
<Location />
Require all denied
</Location>
# 可选:记录日志便于排查
ErrorLog /var/log/httpd/block-unbound-error.log
CustomLog /var/log/httpd/block-unbound-access.log combined
</VirtualHost>⚠️ 注意:
- 这个块必须放在
httpd.conf或conf.d/下最先被加载的文件中(如命名00-block.conf);Apache 按文件名顺序读取,先匹配到就不再往后找。- 如果你用了
ServerAlias _或通配符域名(如*.example.com),需确保它们定义在此块之后,否则会被提前拦截。- 自签名证书路径需真实存在,权限设为
644(证书)和600(私钥),且 Apache 能读取。
? 补充:为什么不能只靠 ServerName 匹配?
Apache 的 SNI(Server Name Indication)机制允许客户端在 TLS 握手时声明目标域名,mod_ssl 会据此选择对应 <VirtualHost>。但如果:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 客户端不发 SNI(老旧客户端、扫描器、curl 不带
-H "Host:"), - 或 Host 头为空 / 不匹配任何
ServerName/ServerAlias,
Apache 就会 fallback 到*第一个定义的 `:443` VirtualHost**——这正是我们利用的机制。
所以「拒绝未绑定域名」的本质,不是拦截握手,而是确保非法请求落到一个明确拒绝的站点上,而非泄露默认证书或内容。
? 进阶:彻底切断连接(接近 return 444 效果)
Apache 原生不支持 444(Nginx 特有),但可通过以下方式逼近效果:
- 使用
mod_rewrite返回444?❌ 不行,Apache 最低支持400–599,444会被转成400。 - 使用
mod_security规则主动中断?✅ 可行,但需额外部署。 - 更实用的做法:配合防火墙或前端反代(如 Nginx 做 TLS 终结+444 拒绝),把 Apache 当纯 HTTP 后端。
对大多数场景,Require all denied 已足够——浏览器收到 403,爬虫/镜像站得不到 HTML 内容,也不会误用你的证书。
✅ 验证是否生效
- 重启 Apache:
sudo systemctl reload httpd - 测试非法域名访问:
curl -k https://your-server-ip/ # 应返回 403 curl -k -H "Host: fake.example.com" https://your-domain.com/ # 若该域名未配置,也应 403(取决于匹配顺序)
- 查看日志确认请求进入
block-unbound日志文件,而非其他站点日志。
不复杂但容易忽略

















