SSLOptions必须置于启用SSL的VirtualHost块内(如*:443),不可用于全局或HTTP虚拟主机;常用+StdEnvVars导出TLS变量、+ExportCertData传递客户端证书,但需配合SSLVerifyClient且仅对HTTPS请求生效。
要在虚拟主机中用 ssloptions 实现站点级 ssl 运行参数的精细控制,关键不是“加不加指令”,而是“加在哪、配什么、链路通不通”。它只在启用 ssl 的虚拟主机内部生效,不能写在全局配置里,也不能指望它自动影响 http 请求或未授权的目录。
必须放在启用 SSL 的 块内
SSLOptions 不是全局开关,Apache 会直接忽略出现在非 HTTPS 虚拟主机或主配置顶层的该指令。常见错误是把它丢进 httpd.conf 根层级,结果启动报错 SSLOptions not allowed here。
- 正确位置:仅限已加载
mod_ssl且明确启用了 SSL 的<virtualhost ...:443></virtualhost>块中(端口 443 或其他 SSL 监听端口) - 示例结构:
<VirtualHost *:443> ServerName example.com SSLEngine on SSLCertificateFile /path/to/cert.pem SSLCertificateKeyFile /path/to/key.pem SSLOptions +StdEnvVars +ExportCertData </VirtualHost> - 若需对子目录单独控制(如仅对
/admin启用客户端证书校验),可嵌套<directory></directory>并再次设置SSLOptions,但前提是该目录所在虚拟主机已启用 SSL
常用参数组合与实际用途对应
SSLOptions 接收标志位,支持 +/- 增量修改,不覆盖已有设置。重点不是堆砌所有选项,而是按需启用:
-
+StdEnvVars:向 PHP/CGI 等后端注入
SSL_PROTOCOL、SSL_CIPHER等变量,调试 TLS 协商状态或记录加密强度时必需 -
+ExportCertData:仅当配置了
SSLVerifyClient require|optional且客户端实际提交了有效证书时,才把 PEM 格式证书内容放入SSL_CLIENT_CERT环境变量,供后端做双向认证逻辑 -
+OptRenegotiate:允许连接建立后按需触发重协商(例如访问
/secure前要求补传客户端证书),但现代浏览器基本禁用该机制,OpenSSL 1.1.1+ 默认不响应,生产环境慎用 -
+StrictRequire:必须配合
SSLRequire指令使用,否则无效;用于强制执行复杂证书属性校验(如 CN 匹配特定正则)并返回 403
确保生效的三个验证环节
设了不等于起效。失效往往卡在前置条件没满足:
-
客户端是否真发了证书? 若启用了
+ExportCertData却收不到SSL_CLIENT_CERT,先确认是否设置了SSLVerifyClient require或optional,再检查浏览器是否配置并发送了受信任的客户端证书 -
.htaccess 是否被允许? 若想在目录下用 .htaccess 控制,主配置中对应
<directory></directory>必须包含AllowOverride SSL,否则指令被跳过,无报错也不生效 -
请求是否走 HTTPS? 在 PHP 中打印
$_SERVER['SSL_PROTOCOL'],为空说明请求根本不是 HTTPS,可能是重定向规则未生效、端口未监听或 DNS 解析异常
别混淆职责:SSLOptions 不管 TLS 版本和密码套件
有人误以为开启 +StdEnvVars 就能控制协议版本,其实完全无关。SSLOptions 只管运行时行为(如传不传变量、重不重协商),而协议与加密算法由另外两个指令决定:
-
SSLProtocol:明确指定允许的 TLS 版本(如
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1) -
SSLCipherSuite:定义服务端优先级排序的密码套件(如
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384)


















