SSLOptions指令必须置于启用SSL的、(在SSL虚拟主机内)或.htaccess(需AllowOverride SSL)中,用于控制HTTPS运行时行为如证书传递、环境变量注入等,不涉及TLS版本或密码套件配置。

SSLOptions 指令不能全局设置,必须放在启用 SSL 的上下文中才生效,核心作用是控制 HTTPS 请求运行时的 SSL 行为细节,比如是否传递证书内容、是否注入环境变量、是否允许重协商等。它不负责 TLS 版本或密码套件选择——那是 SSLProtocol 和 SSLCipherSuite 的任务。
必须写在正确的配置位置
该指令只在以下三类上下文中被识别和执行:
-
启用 SSL 的
块内 (最常用,例如) -
块中 (仅对匹配路径下的 HTTPS 请求生效,且要求该目录位于 SSL 虚拟主机内) - .htaccess 文件中(前提是主配置已开启 AllowOverride SSL,否则会被忽略)
常见错误是直接写在 httpd.conf 顶层或非 HTTPS 的
常用参数组合与实际用途
SSLOptions 接收空格分隔的标志位,支持 +/- 增量写法(如 SSLOptions +StdEnvVars -ExportCertData)。关键参数包括:
-
+StdEnvVars:向 CGI、PHP 等后端注入基础 SSL 环境变量(如
SSL_PROTOCOL、SSL_CIPHER),调试和日志分析必备 -
+ExportCertData:把客户端证书的完整 PEM 内容注入
SSL_CLIENT_CERT环境变量,仅在双向认证成功后生效(需配合SSLVerifyClient require和有效的SSLCACertificateFile) - +OptRenegotiate:允许连接中按需触发 TLS 重协商(如访问敏感路径前强制验客户端证书),但现代浏览器基本禁用,OpenSSL 1.1.1+ 默认不支持,生产环境慎用
-
+StrictRequire:仅与
SSLRequire配合使用才有意义,单独设置无效
为什么设置了却没效果?重点检查这几点
失效往往不是语法问题,而是依赖链断裂:
- 客户端根本没发证书,但你启用了
+ExportCertData:确认是否配置了SSLVerifyClient require,并用curl --cert client.crt --key client.key https://yoursite/实测 - 请求走的是 HTTP 而非 HTTPS:SSLOptions 对 HTTP 虚拟主机完全无效,Apache 不报错也不处理
- 用了 .htaccess 却没开
AllowOverride SSL:主配置中对应必须显式授权 - 启用了 HTTP/2:某些选项(如
+OptRenegotiate)与 h2 不兼容,可能导致连接降级或失败 - PHP 运行在 php-fpm 模式下:默认不透传
SSL_*环境变量,需在 php-fpm pool 配置中添加passenv = SSL_CLIENT_CERT SSL_PROTOCOL
推荐写法与验证方式
典型安全可用配置(放在
SSLVerifyClient require SSLCACertificateFile /path/to/ca.crt SSLOptions +StdEnvVars +ExportCertData
验证是否生效:
- 在 PHP 中打印
$_SERVER['SSL_PROTOCOL'],非空说明+StdEnvVars生效 - 检查
$_SERVER['SSL_CLIENT_CERT']是否包含完整 PEM(含-----BEGIN CERTIFICATE-----) - 查看 Apache error_log,搜索 “No client certificate presented” 或 “unable to get local issuer certificate” 等提示











