目录

mod_ssl

优质
小牛编辑
134浏览
2023-12-01
说明使用安全套接字层(SSL)和传输层安全(TLS)协议实现高强度加密传输
状态扩展(E)
模块名ssl_module
源文件mod_ssl.c

概述

这个模块提供了使用安全套接字层(SSL v2/v3)和传输层安全(TLS v1)协议实现高强度加密传输的功能。它由mod_ssl项目的作者Ralf S. Engeschall贡献,而mod_ssl最早是基于Ben Laurie的工作开发的。

这个模块依赖于OpenSSL提供的加密引擎和SSL引擎。

更多的细节、讨论、实例,请查看SSL文档

环境变量

这个模块通过环境变量提供了许多额外的SSL信息到SSI和CGI的名字空间(以供脚本使用)。下表列出了所有这些变量。出于兼容性考虑,许多变量都有别名,具体可以参考兼容性一文。

变量名数据类型描述
HTTPSflag是否正在使用HTTPS协议
SSL_PROTOCOLstringSSL协议的版本(SSLv2, SSLv3, TLSv1)
SSL_SESSION_IDstring十六进制表示的SSL会话ID
SSL_CIPHERstring加密算法的名称
SSL_CIPHER_EXPORTstring如果此算法是一个出口算法(export cipher)那么其值为true
SSL_CIPHER_USEKEYSIZEnumber加密算法的位数(实际使用的)
SSL_CIPHER_ALGKEYSIZEnumber加密算法的位数(可能的)
SSL_COMPRESS_METHODstring经过协商后实际使用的SSL压缩方法
SSL_VERSION_INTERFACEstringmod_ssl的版本
SSL_VERSION_LIBRARYstringOpenSSL的版本
SSL_CLIENT_M_VERSIONstring客户端证书的版本
SSL_CLIENT_M_SERIALstring客户端证书的序列号
SSL_CLIENT_S_DNstring客户端证书中特征名称(DN)域的值
SSL_CLIENT_S_DN_x509stringComponent of client's Subject DN
SSL_CLIENT_I_DNstring客户端证书发行者的特征名称(DN)域的值
SSL_CLIENT_I_DN_x509stringComponent of client's Issuer DN
SSL_CLIENT_V_STARTstring客户端证书有效期的开始时间
SSL_CLIENT_V_ENDstring客户端证书有效期的结束时间
SSL_CLIENT_V_REMAINstring客户端证书还有多少天就将过期
SSL_CLIENT_A_SIGstring客户端证书的签名算法
SSL_CLIENT_A_KEYstring客户端证书的公钥算法
SSL_CLIENT_CERTstringPEM编码的客户端证书
SSL_CLIENT_CERT_CHAIN_nstring在客户端证书链中PEM编码的证书
SSL_CLIENT_VERIFYstring客户端认证的结果:NONE, SUCCESS, GENEROUS, FAILED:reason
SSL_SERVER_M_VERSIONstring服务器证书的版本
SSL_SERVER_M_SERIALstring服务器证书的序列号
SSL_SERVER_S_DNstring服务器证书中特征名称(DN)域的值
SSL_SERVER_S_DN_x509stringComponent of server's Subject DN
SSL_SERVER_I_DNstring服务器证书发行者的特征名称(DN)域的值
SSL_SERVER_I_DN_x509stringComponent of server's Issuer DN
SSL_SERVER_V_STARTstring服务器证书有效期的开始时间
SSL_SERVER_V_ENDstring服务器证书有效期的结束时间
SSL_SERVER_A_SIGstring服务器证书的签名算法
SSL_SERVER_A_KEYstring服务器证书的公钥算法
SSL_SERVER_CERTstringPEM编码的服务器证书

x509要求X.509证书的特征名称(DN)域至少需要包含下列字段之一:C,ST,L,O,OU,CN,T,I,G,S,D,UID,Email。Apache2.1以后的版本x509还可以包含一个"_n"的数字后缀。如果被查询的DN具有多个同名属性,那么这个数字后缀就可以用来选择究竟是哪个属性。例如,服务器证书的DN域含有两个同名的"OU"字段,那么就可以用SSL_SERVER_S_DN_OU_0SSL_SERVER_S_DN_OU_1来区分它们。

SSL_CLIENT_V_REMAIN仅在2.1和更高版本中可见。

自定义日志格式

mod_ssl被静态编译进Apache或被作为DSO动态加载后,mod_log_config就可以使用一些额外的自定义日志格式功能了。首先,有一个额外的"%{varname}x"日志格式,其中的"varname"可以是任意模块提供的任意变量名称。特别地,上表中列出了mod_ssl提供的变量。

出于兼容性考虑,还可以使用"%{name}c"语法,更多信息可以查看兼容性一文。

示例

CustomLog logs/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

SSLCACertificateFile 指令

说明用于客户端认证的多合一CA证书(PEM格式)
语法SSLCACertificateFile file-path
作用域server config, virtual host
状态扩展(E)
模块mod_ssl

该指令用于客户端认证。这个指令指定了一个多合一的CA证书,只有持有这些CA所签发证书的客户端才允许访问。这个所谓"多合一"证书文件其实就是将多个PEM格式的证书按照优先级顺序放置在同一个文件中而已。这个指令也可以由SSLCACertificatePath指令代替,或者两个一起使用。

示例

SSLCACertificateFile /usr/local/apache2/conf/ssl.crt/ca-bundle-client.crt

SSLCACertificatePath 指令

说明用于客户端认证的CA证书(PEM格式)目录
语法SSLCACertificatePath directory-path
作用域server config, virtual host
状态扩展(E)
模块mod_ssl

该指令用于客户端认证。这个指令指定了一个包含CA证书的目录,只有持有这些CA所签发证书的客户端才允许访问。

该目录中的证书必须是PEM格式,并且它们都通过散列后的文件名访问。所以你不能只是把证书放到这个目录中就完事了:你还需要创建一个名为hash-value.N的符号连接,并保证这个目录下的所有符号链接都准确无误。请使用mod_ssl附带的Makefile完成这项工作。

示例

SSLCACertificatePath /usr/local/apache2/conf/ssl.crt/

SSLCADNRequestFile 指令

说明用于定义"可接受的CA名称"列表的多合一CA证书(PEM格式)
语法SSLCADNRequestFile file-path
作用域server config, virtual host
状态扩展(E)
模块mod_ssl

在SSL握手阶段,当mod_ssl向客户端索取证书时,它会向客户端发送一个可接受的CA名称列表。客户端可以根据这些CA名称从它所持有的所有证书中选择一个最恰当的证书。

如果SSLCADNRequestPathSSLCADNRequestFile都没有给出,那么向客户端发送的所有"可接受的CA名称"就由SSLCACertificateFileSSLCACertificatePath决定,也就是所有可接受的CA名称正好就是所有用于客户端认证的CA证书中包含的名称。

在某些场合下,确实需要让"可接受的CA名称"与用于客户端认证的CA证书不一致。比如,客户端证书可能是由中间CA(非顶级CA)所签发。此时,就可以使用SSLCADNRequestPath和/或SSLCADNRequestFile指令来指定"可接受的CA名称"究竟是哪些。

SSLCADNRequestFile必须指定一个多合一的CA证书,也就是将多个PEM格式的证书放置在同一个文件中。

示例

SSLCADNRequestFile /usr/local/apache2/conf/ca-names.crt

SSLCADNRequestPath 指令

说明用于定义"可接受的CA名称"列表的CA证书(PEM格式)目录
语法SSLCADNRequestPath directory-path
作用域server config, virtual host
状态扩展(E)
模块mod_ssl

这个指令用于定义包含"可接受的CA名称"列表的CA证书(PEM格式)目录。更多细节请查看SSLCADNRequestFile指令。

该目录中的证书必须是PEM格式,并且它们都通过散列后的文件名访问。所以你不能只是把证书放到这个目录中就完事了:你还需要创建一个名为hash-value.N的符号连接,并保证这个目录下的所有符号链接都准确无误。请使用mod_ssl附带的Makefile完成这项工作。

示例

SSLCADNRequestPath /usr/local/apache2/conf/ca-names.crt/

SSLCARevocationFile 指令

说明用于客户端认证的多合一CA证书撤销列表(PEM格式)
语法SSLCARevocationFile file-path
作用域server config, virtual host
状态扩展(E)
模块mod_ssl

该指令用于客户端认证。这个指令指定了一个多合一的CA证书撤销列表(CRL,Certificate Revocation Lists),CRL中的证书都被视为无效证书。这个所谓"多合一"的CRL文件其实就是将多个PEM格式的CRL按照优先级顺序放置在同一个文件中而已。这个指令也可以由SSLCARevocationPath指令代替,或者两个一起使用。

示例

SSLCARevocationFile /usr/local/apache2/conf/ssl.crl/ca-bundle-client.crl

SSLCARevocationPath 指令

说明用于客户端认证的CA证书撤销列表(PEM格式)目录
语法SSLCARevocationPath directory-path
作用域server config, virtual host
状态扩展(E)
模块mod_ssl

该指令用于客户端认证。这个指令指定了一个包含多个CA证书撤销列表(CRL)的目录,CRL中的证书都被视为无效证书。

该目录中的CRL必须是PEM格式,并且它们都通过散列后的文件名访问。所以你不能只是把CRL文件放到这个目录中就完事了:你还需要创建一个名为hash-value.rN的符号连接,并保证这个目录下的所有符号链接都准确无误。请使用mod_ssl附带的Makefile完成这项工作。

示例

SSLCARevocationPath /usr/local/apache2/conf/ssl.crl/

SSLCertificateChainFile 指令

说明服务器的CA证书链(PEM格式)
语法SSLCertificateChainFile file-path
作用域server config, virtual host
状态扩展(E)
模块mod_ssl

这个指令指定了一个多合一的CA证书:由直接签发服务器证书的CA证书开始,按证书链顺序回溯,一直到根CA的证书结束,这一系列的CA证书(PEM格式)就构成了服务器的证书链。

这个指令也可以由SSLCACertificatePath指令代替,或者两个一起使用,用于明确的创建服务器的证书链。这个证书链将被与服务器证书一起发送给客户端。这有利于避免在执行客户端认证时多个CA证书之间出现混淆或冲突。因为虽然将服务器证书链上的某个CA证书放到SSLCACertificatePath目录中对于证书链结构没什么影响,但是由这个CA签发的客户端证书也会在执行客户端认证的时候同时被认可,这通常不是你期望的结果。

小心:仅在服务器证书使用单一算法(RSADSA)的情况下,提供证书链才可行。如果你使用了RSA+DSA证书,那么仅在两个证书实际使用了同一个证书链的情况下才可行,否则客户端浏览器将被搞晕。

示例

SSLCertificateChainFile /usr/local/apache2/conf/ssl.crt/ca.crt

SSLCertificateFile 指令

说明服务器证书文件(PEM编码的X.509证书)
语法SSLCertificateFile file-path
作用域server config, virtual host
状态扩展(E)
模块mod_ssl

该指令用于指定服务器持有的X.509证书(PEM编码),其中还可以包含对应的RSA或DSA私钥。如果其中包含的私钥已经使用密语加密,那么在Apache启动的时候将会提示输入密语。如果服务器同时使用了RSA和DSA两种证书,那么该指令可以使用两次来分别指定两种证书的位置。

示例

SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt

SSLCertificateKeyFile 指令

说明服务器私钥文件(PEM编码)
语法SSLCertificateKeyFile file-path
作用域server config, virtual host
状态扩展(E)
模块mod_ssl

该指令指定了服务器私钥文件(PEM编码)的位置。如果SSLCertificateFile指定的服务器证书文件中不包含相应的私钥,那么就必须使用该指令,否则就不需要使用。我们反对在服务器证书中包含私钥,正确的做法应该是将证书和私钥分开在不同的文件中。如果私钥文件已经使用密语加密,那么在Apache启动的时候将会提示输入密语。如果服务器同时使用了RSA和DSA两种证书,那么该指令可以使用两次来分别指定两种私钥的位置。

示例

SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key

SSLCipherSuite 指令

说明允许客户端使用哪些加密算法套件
语法SSLCipherSuite cipher-spec
默认值SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
作用域server config, virtual host, directory, .htaccess
覆盖项AuthConfig
状态扩展(E)
模块mod_ssl

这个指令的值是一个冒号分隔的OpenSSL加密算法套件字符串,用于在SSL握手过程中进行加密算法协商时告诉客户端允许使用哪些加密算法。该指令既可以用于主机级别的配置(在SSL握手阶段就按照允许算法进行协商),也可以用于目录级别的配置(在收到HTTP请求后、发送HTTP应答前,强制使用新的允许算法进行SSL重协商)。

OpenSSL"加密算法套件"实际上是由4个属性组成:

  • 密钥交换算法
    RSA或Diffie-Hellman算法的各种变种
  • 认证算法
    RSA, Diffie-Hellman, DSS 或 none
  • 加密算法
    AES, DES, Triple-DES, RC4, RC2, IDEA 或 none
  • 摘要算法
    MD5, SHA 或 SHA1

可以指定加密算法套件中每个属性的算法,也可以使用别名指定一组特定的算法套件(表-1)。

标记描述
密钥交换算法
kRSA纯RSA密钥交换
kDHr使用RSA密钥的Diffie-Hellman密钥交换
kDHd使用DSA密钥的Diffie-Hellman密钥交换
kEDHEphemeral (temp.key) Diffie-Hellman key exchange (no cert)
认证算法
aNULL不进行认证
aRSARSA认证
aDSSDSS认证
aDHDiffie-Hellman认证
加密算法
eNULL不加密
AESAES加密
DESDES加密
3DESTriple-DES加密
RC4RC4加密
RC2RC2加密
IDEAIDEA加密
摘要算法
MD5MD5摘要
SHA1SHA1摘要
SHASHA摘要
别名
SSLv2所有SSLv2算法
SSLv3所有SSLv3算法
TLSv1所有TLSv1算法
EXP所有出口算法
EXPORT40所有40-bit出口算法
EXPORT56所有56-bit出口算法
LOW所有低强度算法(非出口算法,DES)
MEDIUM所有128-bit加密算法
HIGH所有使用Triple-DES或更高强度的算法
RSA所有使用RSA密钥交换的算法
DH所有使用Diffie-Hellman密钥交换的算法
EDH所有使用临时Diffie-Hellman密钥交换的算法
ADH所有使用匿名Diffie-Hellman密钥交换的算法
DSS所有使用DSS认证的算法
NULL所有不加密的算法

可以使用下面的语法增删算法以及确定在握手阶段协商的"算法套件"优先级顺序:

  • [没有标记]: 向列表中增加一个算法套件
  • +: 在列表中的相应的位置增加一个算法套件
  • -: 从列表中临时删除相应的算法套件(之后还可以被再次添加)
  • !: 从列表中永久删除相应的算法套件(之后不可以被再次添加)

该指令默认值"ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP"的含义是:首先永久删除所有使用匿名Diffie-Hellman密钥交换的算法,然后添加使用RC4和RSA的算法,再然后顺序添加高中低强度的算法,最后再追加所有的SSLv2算法和出口算法(export ciphers)到列表结尾。

可以使用"openssl ciphers -v"命令查看所有可用的"加密算法套件"。

示例

SSLCipherSuite RSA:!EXP:!NULL:+HIGH:+MEDIUM:-LOW

SSLCryptoDevice 指令

说明指定硬件加密加速设备
语法SSLCryptoDevice engine
默认值SSLCryptoDevice builtin
作用域server config
状态扩展(E)
模块mod_ssl
兼容性仅在使用"-DSSL_ENGINE_EXPERIMENTAL"编译mod_ssl的情况下才有效

这个指令用于启用硬件加密加速设备,这种板载硬件设备可以加速SSL协议的处理速度,降低CPU负载。该指令仅在OpenSSL启用了"engine"支持的时候有效。OpenSSL 0.9.7以及以后的版本默认就已经启用了"engine"支持,而对于0.9.6版本则需要使用带有"-engine"后缀的版本才行。

请使用"openssl engine"命令检查可以使用哪些引擎名称。

示例

# 这是一个Broadcom加速器:
SSLCryptoDevice ubsec

SSLEngine 指令

说明SSL引擎开关
语法SSLEngine on|off|optional
默认值SSLEngine off
作用域server config, virtual host
状态扩展(E)
模块mod_ssl

这个指令用于开启或关闭SSL/TLS协议引擎。一般用于<VirtualHost>段中针对特定的虚拟主机开启SSL/TLS引擎。无论对于主服务器还是虚拟主机,SSL/TLS协议引擎都是默认关闭的。

示例

<VirtualHost _default_:443>
SSLEngine on
...
</VirtualHost>

对于Apache 2.1和更高版本,SSLEngine可以被设为optional以支持RFC 2817规范(在HTTP/1.1中升级到TLS)。目前尚无浏览器支持这个规范。[译者注]rfc2817描述如何使用HTTP/1.1的升级机制在一个现存的TCP连接上发起安全传输层(TLS),这样就允许安全的和不安全的HTTP通信共享同一个"知名端口"。这种做法也支持“虚拟主机”,因此一个HTTP+TLS服务器能区分发往在同一个IP地址上的几个主机的消息。

SSLHonorCipherOrder 指令

说明是否强制使用服务器端的加密算法套件优先级顺序
语法SSLHonorCiperOrder on|off
默认值SSLHonorCiperOrder off
作用域server config, virtual host
状态扩展(E)
模块mod_ssl
兼容性仅在Apache 2.1及更高版本中有效,并且要求使用OpenSSL 0.9.7或更高版本

在SSLv3/TLSv1握手阶段,服务器通常优先尊重客户端给出的加密算法套件优先级顺序。但是,如果将此指令设为"on",那么将优先使用服务器端的优先级顺序。

示例

SSLHonorCipherOrder on

SSLMutex 指令

说明SSL引擎实现内部互斥操作的信号量(semaphore)
语法SSLMutex type
默认值SSLMutex none
作用域server config
状态扩展(E)
模块mod_ssl

这个指令指定了SSL引擎使用什么样的信号量(互斥锁)来在多个Apache服务器进程之间实现串行化互斥操作。这个指令只能用于服务器全局配置,并且设计成和AcceptMutex指令很接近。

目前可以使用下面这几种互斥类型

  • none | no

    这是默认值,也就是根本不使用任何互斥机制。如果使用这个设置的话,那么后果自负。因为目前互斥机制主要用于SSL会话缓存写入同步,所以没有互斥机制将会导致SSL会话缓存错误。所以我们反对使用默认值,而是推荐你明确指定一个互斥方法。

  • posixsem

    使用POSIX信号量,这是最优雅的互斥机制。如果底层平台和APR都支持,那么这是首选方法。

  • sysvsem

    使用SystemV IPC信号量,这是次优雅的互斥机制。如果在移除信号量之前进程崩溃,那么将会导致SysV信号量被"泄漏"。仅在底层平台和APR都支持的情况下才可以使用。

  • sem

    自动在posixsemsysvsem之间选择一个"最佳"的方式:优先选择前者,仅在前者不可用时才选择后者。仅在底层平台和APR至少支持其中一种的情况下才可以使用。

  • pthread

    使用Posix线程互斥。仅在底层平台和APR都支持的情况下才可以使用。

  • fcntl:/path/to/mutex

    配合fcntl()函数使用一个物理的锁文件实现互斥。这是一个可移植的互斥机制(Win32平台除外)。请务必为/path/to/mutex使用一个本地文件,而不要使用一个位于NFS或AFS上的文件。仅在底层平台和APR都支持的情况下才可以使用。因为Apache父进程的PID将会被自动添加到/path/to/mutex中以确保唯一性,所以你不必担心会发生冲突。

  • flock:/path/to/mutex

    这个机制与fcntl:/path/to/mutex类似,只是使用了flock()函数。仅在底层平台和APR都支持的情况下才可以使用。

  • file:/path/to/mutex

    自动在fcntlflock之间选择一个"最佳"的方式:优先选择前者,仅在前者不可用时才选择后者。仅在底层平台和APR至少支持其中一种的情况下才可以使用。

  • default | yes

    完全由底层平台和APR自主选择一个缺省的互斥机制。

示例

SSLMutex file:/usr/local/apache/logs/ssl_mutex

SSLOptions 指令

说明配置SSL引擎的运行时选项
语法SSLOptions [+|-]option ...
作用域server config, virtual host, directory, .htaccess
覆盖项Options
状态扩展(E)
模块mod_ssl

这个指令用于配置SSL引擎的运行时选项。如果有多个SSLOptions可以作用于某个目录,那么将完全使用最特殊的那一个,而不存在继承或合并的问题。但是如果SSLOptions中的所有选项前都有"+"或"-"标记,那么这个指令将会被合并:以"+"开头的选项将会被添加到当前选项中,以"-"开头的选项将会被从当前选项中移除。

所有可用选项如下:

  • StdEnvVars

    如果开启此选项,那么与SSL相关的CGI/SSI标准环境变量将会被创建。出于性能考虑,这个选项默认关闭,因为提取这些变量值的过程是非常消耗资源的。一般仅为CGI/SSI脚本开启。

  • CompatEnvVars

    如果开启此选项,那么为了兼容其他SSL解决方案而添加的额外CGI/SSI环境变量将会被创建。请参考兼容性一节获取究竟将创建哪些变量的细节。

  • ExportCertData

    如果开启此选项,额外的CGI/SSI环境变量:SSL_SERVER_CERT, SSL_CLIENT_CERT, SSL_CLIENT_CERT_CHAIN_n(n=0,1,2,..)将被创建。这些变量包含了作用于当前HTTPS连接的PEM编码的服务器/客户端X.509证书的相关信息,以及客户端证书链中所有证书的相关信息,它们可以被CGI脚本用来进行更深层次的证书检查。

  • FakeBasicAuth

    如果开启此选项,那么客户端X509证书中的特征名称(DN)字段的"Subject"值(可以使用"openssl x509 -noout -subject -in certificate.crt"命令查看)将被转化为HTTP基本认证的用户名。这就意味着可以将标准Apache认证方法用于访问控制,同时需要主意的是因为并没有从用户获取密码,所以每个用户名对应的密码都是"xxj31ZMTZzkVA",也即是"password"经过3DES加密后的结果。对于那些基于MD5加密的系统(BSD系统),则需要使用"$1$OXLyS...$Owx8s2/m9/gfkcRVXzgoE/"作为密码。

  • StrictRequire

    如果开启此选项,那么当SSLRequireSSLSSLRequire要求禁止访问时,将强制禁止访问。默认情况下,当设置了"Satisfy any"时,如果通过了SSLRequireSSLSSLRequire之外的其他访问控制检查,那么访问将被允许,这符合Satisfy指令的原意。但是在"SSLOptions +StrictRequire"的情况下,你可以使用SSLRequireSSL和/或SSLRequire在SSL连接上强制达到"Satisfy All"的效果。

  • OptRenegotiate

    默认情况下,当某个特定目录的SSL配置发生变化时,将会执行一个完整的SSL重新握手和协商过程。如果开启此选项,那么将允许优化SSL连接的重新协商操作,也就是省略不必要的握手过程,而只是进行细粒度的参数检查(仍然是安全的)。不过,在某些时候,只进行参数检查往往不是用户期望的结果,所以如果你想启用这个选项,请只对某些特定的目录启用。

示例

SSLOptions +FakeBasicAuth -StrictRequire
<Files ~ "\.(cgi|shtml)$">
SSLOptions +StdEnvVars +CompatEnvVars -ExportCertData
<Files>

SSLPassPhraseDialog 指令

说明Apache在启动时获取用于解密私钥文件密语的方式
语法SSLPassPhraseDialog type
默认值SSLPassPhraseDialog builtin
作用域server config
状态扩展(E)
模块mod_ssl

Apache启动时必须读取私钥,而出于安全考虑私钥通常使用密语进行加密,Apache必须知道密语才能成功读取私钥。获取密语的方式有以下几种:

  • builtin

    这是默认值。当Apache启动时在脱离终端前提示输入密语,管理员必须手动输入。因为可能存在多个不同的私钥(为每个不同的SSL虚拟主机分别配置了不同的私钥),所以为了减少管理员的输入,Apache会在解密下一个私钥前尝试前面已经输入过的所有密语,如果能够成功解密,那么将不再提示输入。

    这个策略既允许最大的适应性(为每个私钥使用不同的密语)也允许最小化谜语输入次数(可以为所有私钥都是用相同的密语)。

  • |/path/to/program [args...]

    这个方式使用一个外部程序作为通向特定输入设备的管道,Apache将会向这个程序的stdin发送builtin方式时显示的提示信息并期望这个程序向stdout输出所需要的密语。如果需要输入多个密语(或者输入了一个错误的密语),将会再次发送额外的提示信息。

  • exec:/path/to/program

    这种方式将在Apache启动时为每个密语未知的私钥调用一次外部程序,每次调用使用两个参数:①"servername:portnumber"、②"RSA"或"DSA"。这个程序应该将相应的密语输出到stdout。这样设计的意图是希望这个程序首先对系统进行检查,确认系统没有遭到入侵后才输出密语。

    至于检查过程如何设计、密语如何生成,完全是你的自由,但是输出到stdout的内容却只能正好是密语的内容,一个字不能多也一个字不能少!

    同样,前面的密语复用策略在这里也同样生效。也就是说,仅在尝试了先前输入的所有密语都失败后才会调用此程序。

示例

SSLPassPhraseDialog exec:/usr/local/apache/sbin/pp-filter

SSLProtocol 指令

说明指定允许使用哪些版本的SSL协议
语法SSLProtocol [+|-]protocol ...
默认值SSLProtocol all
作用域server config, virtual host
覆盖项Options
状态扩展(E)
模块mod_ssl

这个指令用于控制mod_ssl允许使用哪些版本的SSL协议,这样客户端就只能使用被允许的协议。

可用的协议版本如下:

  • SSLv2
  • SSLv3
  • TLSv1
  • All(等价于"+SSLv2 +SSLv3 +TLSv1")

示例

#允许使用SSLv3和TLSv1但不允许使用SSLv2
SSLProtocol all -SSLv2

SSLProxyCACertificateFile 指令

说明用于远端服务器认证的多合一CA证书(PEM格式)
语法SSLProxyCACertificateFile file-path
作用域server config, virtual host
状态扩展(E)
模块mod_ssl

该指令用于远端服务器认证。这个指令指定了一个多合一的CA证书,只有持有这些CA所签发证书的远端服务器才允许代理。这个所谓"多合一"证书文件其实就是将多个PEM格式的证书按照优先级顺序放置在同一个文件中而已。这个指令也可以由SSLProxyCACertificatePath指令代替,或者两个一起使用。

示例

SSLProxyCACertificateFile /usr/local/apache2/conf/ssl.crt/ca-bundle-remote-server.crt

SSLProxyCACertificatePath 指令

说明用于远端服务器认证的CA证书(PEM格式)目录
语法SSLProxyCACertificatePath directory-path
作用域server config, virtual host
状态扩展(E)
模块mod_ssl

该指令用于远端服务器认证。这个指令指定了一个包含CA证书的目录,只有持有这些CA所签发证书的远端服务器才允许代理。

该目录中的证书必须是PEM格式,并且它们都通过散列后的文件名访问。所以你不能只是把证书放到这个目录中就完事了:你还需要创建一个名为hash-value.N的符号连接,并保证这个目录下的所有符号链接都准确无误。请使用mod_ssl附带的Makefile完成这项工作。

示例

SSLProxyCACertificatePath /usr/local/apache2/conf/ssl.crt/

SSLProxyCARevocationFile 指令

说明用于远端服务器认证的多合一CA证书撤销列表(PEM格式)
语法SSLProxyCARevocationFile file-path
作用域server config, virtual host
状态扩展(E)
模块mod_ssl

该指令用于远端服务器认证。这个指令指定了一个多合一的CA证书撤销列表(CRL,Certificate Revocation Lists),CRL中的证书都被视为无效证书。这个所谓"多合一"的CRL文件其实就是将多个PEM格式的CRL按照优先级顺序放置在同一个文件中而已。这个指令也可以由SSLProxyCARevocationPath指令代替,或者两个一起使用。

示例

SSLProxyCARevocationFile /usr/local/apache2/conf/ssl.crl/ca-bundle-remote-server.crl

SSLProxyCARevocationPath 指令

说明用于远端服务器认证的CA证书撤销列表(PEM格式)目录
语法SSLProxyCARevocationPath directory-path
作用域server config, virtual host
状态扩展(E)
模块mod_ssl

该指令用于远端服务器认证。这个指令指定了一个包含多个CA证书撤销列表(CRL)的目录,CRL中的证书都被视为无效证书。

该目录中的CRL必须是PEM格式,并且它们都通过散列后的文件名访问。所以你不能只是把CRL文件放到这个目录中就完事了:你还需要创建一个名为hash-value.rN的符号连接,并保证这个目录下的所有符号链接都准确无误。请使用mod_ssl附带的Makefile完成这项工作。

示例

SSLProxyCARevocationPath /usr/local/apache2/conf/ssl.crl/

SSLProxyCipherSuite 指令

说明允许远端服务器使用哪些加密算法套件
语法SSLProxyCipherSuite cipher-spec
默认值SSLProxyCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
作用域server config, virtual host, directory, .htaccess
覆盖项AuthConfig
状态扩展(E)
模块mod_ssl

该指令和SSLCipherSuite一样,唯一的不同之处就是它作用于到远端服务器的SSL连接。请参考SSLCipherSuite指令以获取更多细节。

SSLProxyEngine 指令

说明SSL代理引擎开关
语法SSLProxyEngine on|off
默认值SSLProxyEngine off
作用域server config, virtual host
状态扩展(E)
模块mod_ssl

这个指令用于开启或关闭SSL/TLS协议代理引擎。一般用于<VirtualHost>段中针对特定的虚拟主机开启SSL/TLS协议代理引擎。无论对于主服务器还是虚拟主机,SSL/TLS协议代理引擎都是默认关闭的。

示例

<VirtualHost _default_:443>
SSLProxyEngine on
...
</VirtualHost>

SSLProxyMachineCertificateFile 指令

说明SSL代理客户端证书及私钥(PEM格式)
语法SSLProxyMachineCertificateFile filename
作用域server config
覆盖项Not applicable
状态扩展(E)
模块mod_ssl

该指令指定了一个同时包含证书及相应私钥的多合一文件,用于向远端服务器标识自己的SSL代理身份。

这个所谓"多合一"文件其实就是将多个PEM格式的证书及相应私钥按照优先级顺序放置在同一个文件中而已。这个指令也可以由SSLProxyMachineCertificatePath指令代替,或者两个一起使用。

目前尚不支持经过密语加密的私钥。

示例

SSLProxyMachineCertificateFile /usr/local/apache2/conf/ssl.crt/proxy.pem

SSLProxyMachineCertificatePath 指令

说明SSL代理客户端证书及私钥(PEM格式)目录
语法SSLProxyMachineCertificatePath directory
作用域server config
覆盖项Not applicable
状态扩展(E)
模块mod_ssl

这个指令指定了一个目录,存放同时包含证书及相应私钥的文件,用于向远端服务器标识自己的SSL代理身份。

该目录中的文件必须是PEM格式,并且它们都通过散列后的文件名访问。所以你不能只是把文件放到这个目录中就完事了:你还需要创建一个名为hash-value.N的符号连接,并保证这个目录下的所有符号链接都准确无误。请使用mod_ssl附带的Makefile完成这项工作。

目前尚不支持经过密语加密的私钥。

示例

SSLProxyMachineCertificatePath /usr/local/apache2/conf/proxy.crt/

SSLProxyProtocol 指令

说明允许代理哪些版本的SSL协议
语法SSLProxyProtocol [+|-]protocol ...
默认值SSLProxyProtocol all
作用域server config, virtual host
覆盖项Options
状态扩展(E)
模块mod_ssl

这个指令指定了允许代理哪些版本的SSL协议。

请参考SSLProtocol指令以获得更多详情。

SSLProxyVerify 指令

说明对远端服务器证书的验证级别
语法SSLProxyVerify level
默认值SSLProxyVerify none
作用域server config, virtual host, directory, .htaccess
覆盖项AuthConfig
状态扩展(E)
模块mod_ssl

这个指令指定了充当SSL代理的Apache如何对被代理的远端服务器证书进行验证。该指令既可以用于主机级别的配置(在SSL握手阶段就按照指定的级别进行证书验证),也可以用于目录级别的配置(在收到HTTP请求后、发送HTTP应答前,强制使用新的验证级别进行SSL重协商)。

主意:即使启用了证书验证,mod_ssl不会检查远端服务器证书的commonName(hostname)属性值是否确实与其主机名相同。换句话说,SSL代理并不保证到后端服务器的SSL连接是"安全"的,即使其证书是由SSLProxyCACertificatePath和/或SSLProxyCACertificateFile中指定的一个CA签发的。

可用的level如下:

  • none: 根本不要求远端服务器持有证书
  • optional: 远端服务器可以持有一个有效的证书
  • require: 远端服务器必须持有一个有效的证书
  • optional_no_ca: 远端服务器可以持有一个有效的证书,但是并不需要成功的通过验证。

在实践中,只有nonerequire有实际意义,因为optional并不能和所有远端服务器正常工作,而optional_no_ca实际上依赖于身份认证的思想(但是可以用于SSL测试页面等)。

示例

SSLProxyVerify require

SSLProxyVerifyDepth 指令

说明验证远端服务器证书有效性时允许的最大证书链深度
语法SSLProxyVerifyDepth number
默认值SSLProxyVerifyDepth 1
作用域server config, virtual host, directory, .htaccess
覆盖项AuthConfig
状态扩展(E)
模块mod_ssl

这个指令设置了在判定远端服务器证书无效前,允许验证的最大证书链深度。这个指令既可以用于主机级别的配置(在SSL握手阶段就按照指定的深度进行验证),也可以用于目录级别的配置(在收到HTTP请求后、发送HTTP应答前,强制使用新的验证深度进行SSL重协商)。

这里所谓的"最大深度"其实是指证书链上中间CA的最大个数。"0"表示仅接受自签名证书。默认值"1"表示只接受自签名证书和已知CA直接签名的证书。这里所谓的"已知CA"是指该CA的证书位于SSLProxyCACertificatePath目录中。

示例

SSLProxyVerifyDepth 10

SSLRandomSeed 指令

说明指定伪随机数生成器(PRNG)的随机数种子源
语法SSLRandomSeed context source [bytes]
作用域server config
状态扩展(E)
模块mod_ssl

指定在OpenSSL启动时(context=startup)和/或在建立新SSL连接时(context=connect)供伪随机数生成器(PRNG)使用的随机数种子源(一个或多个)。因为PRNG是一个全局设施,所以该指令只能用于服务器全局配置。

可用的source类型如下:

  • builtin

    这是永远可用的内置源。它在运行时只使用很少的CPU资源,因此是非常优秀的源。它的随机性来自于当前时间、当前进程的PID、从Apache的inter-process scoreboard structure中随机提取的1KB数据(如果可用的话)。其缺点是随机性不够强,并且在启动时(此时scoreboard尚不可用)所能得到的随机位较少。所以你应该总是(至少对于startup)使用外部随机数源。

  • file:/path/to/source

    使用外部文件/path/to/source作为随机数种子源。如果指定了bytes,那么仅读取该文件开头的bytes字节作为随机位,否则将读取该文件的全部内容。推荐将其用于startup的情况,比如/dev/random和/或/dev/urandom设备,他们在现代类Unix系统(Linux,BSD)上都是可用的。

    但是请注意/dev/random设备仅提供其实际拥有的随机位。比如你需要512位随机数,但该设备目前实际只有100位随机位,那么根据不同的操作系统,将只可能有两种结果:①只提供100位;②读取操作将会被一直阻塞到能够提供512位为止(可能会花上很长一段时间)。因此,更明智的选择是使用/dev/urandom设备,因为它从不阻塞,并且总是能够返回足够多的随机位。其唯一的缺点就是随机位的质量没有/dev/random高。

    在某些平台上(比如FreeBSD),你甚至可以控制随机位通过哪个系统中断生成,更多信息请查看相应平台上的rndcontrol(8)程序。作为替代方案,如果你的系统上没有随机设备,你可以使用类似EGD这样的工具,并使用exec:/path/to/program/的方式运行其客户端,或者使用egd:/path/to/egd-socket,具体参见下文。

  • exec:/path/to/program

    使用外部可执行程序/path/to/program作为随机数种子源(比如下面示例中的truerand工具)。如果指定了bytes,那么仅读取输出到stdout上的前bytes字节作为随机位,否则将读取全部内容。建议仅将其用于startup需要强随机数的情况;如果用于connect的话,会大大拖慢服务器速度,请勿使用。

  • egd:/path/to/egd-socket(Unix only)

    使用EGD的外部Unix domain socket作为作为随机数种子源。仅在你的操作系统没有随机设备支持的情况下使用。

示例

SSLRandomSeed startup builtin
SSLRandomSeed startup file:/dev/random
SSLRandomSeed startup file:/dev/urandom 1024
SSLRandomSeed startup exec:/usr/local/bin/truerand 16
SSLRandomSeed connect builtin
SSLRandomSeed connect file:/dev/random
SSLRandomSeed connect file:/dev/urandom 1024

SSLRequire 指令

说明仅在逻辑表达式expression的值为true的时候才允许SSL访问
语法SSLRequire expression
作用域directory, .htaccess
覆盖项AuthConfig
状态扩展(E)
模块mod_ssl

这个指令指定了一个访问控制条件,仅在条件满足的时候才允许SSL访问。这是一个非常强大的指令,因为其后所跟的表达式可以非常复杂。

SSLRequire的实现并不是线程安全的,所以当使用线程型的MPM的时候,如果在.htaccess中使用SSLRequire指令可能会导致随机性的进程崩溃。

expression必须使用下面的巴科斯范式语法([译者注]几乎每种编程语言书籍都使用巴科斯范式来定义编程语言的语法规则,如果你看不懂,可以STFW"巴科斯范式"):

expr     ::= "true" | "false"
           | "!" expr
           | expr "&&" expr
           | expr "||" expr
           | "(" expr ")"
           | comp
comp     ::= word "==" word | word "eq" word
           | word "!=" word | word "ne" word
           | word "<"  word | word "lt" word
           | word "<=" word | word "le" word
           | word ">"  word | word "gt" word
           | word ">=" word | word "ge" word
           | word "in" "{" wordlist "}"
           | word "in" "OID(" word ")"
           | word "=~" regex
           | word "!~" regex
wordlist ::= word
           | wordlist ", " word
word     ::= digit
           | cstring
           | variable
           | function
digit    ::= [0-9]+
cstring  ::= "..."
variable ::= "%{" varname "}"
function ::= funcname "(" funcargs ")"

varname是表3中的任意一个变量。funcname可以使用下列函数:

  • file(filename)

    这个函数接受一个文件名作为参数并将其展开为文件的内容。比如可以用于需要使用一个正则表达式对文件内容进行匹配的场合。

主意:expression首先被解析成一种内部表示法,然后再进行评估。事实上,对于全局性的设置和虚拟主机级别的设置,expression将在服务器启动的时候被解析成内部表示法,然后在运行时进行实时评估。而目录级的配置则不同:expression必须对每个请求进行实时解析和评估。

示例

SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)-/ \
and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \
and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \
and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \
or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/

OID()函数会企图找到零个或更多客户端证书OID的实例,并用左侧的字符串和匹配的OID属性值进行比较。每一个匹配的OID都会被检查,只到找到一个匹配。

标准CGI/1.0和Apache变量:

HTTP_USER_AGENT        PATH_INFO             AUTH_TYPE
HTTP_REFERER           QUERY_STRING          SERVER_SOFTWARE
HTTP_COOKIE            REMOTE_HOST           API_VERSION
HTTP_FORWARDED         REMOTE_IDENT          TIME_YEAR
HTTP_HOST              IS_SUBREQ             TIME_MON
HTTP_PROXY_CONNECTION  DOCUMENT_ROOT         TIME_DAY
HTTP_ACCEPT            SERVER_ADMIN          TIME_HOUR
HTTP:headername        SERVER_NAME           TIME_MIN
THE_REQUEST            SERVER_PORT           TIME_SEC
REQUEST_METHOD         SERVER_PROTOCOL       TIME_WDAY
REQUEST_SCHEME         REMOTE_ADDR           TIME
REQUEST_URI            REMOTE_USER           ENV:variablename
REQUEST_FILENAME

SSL相关的变量:

HTTPS                  SSL_CLIENT_M_VERSION   SSL_SERVER_M_VERSION
                       SSL_CLIENT_M_SERIAL    SSL_SERVER_M_SERIAL
SSL_PROTOCOL           SSL_CLIENT_V_START     SSL_SERVER_V_START
SSL_SESSION_ID         SSL_CLIENT_V_END       SSL_SERVER_V_END
SSL_CIPHER             SSL_CLIENT_S_DN        SSL_SERVER_S_DN
SSL_CIPHER_EXPORT      SSL_CLIENT_S_DN_C      SSL_SERVER_S_DN_C
SSL_CIPHER_ALGKEYSIZE  SSL_CLIENT_S_DN_ST     SSL_SERVER_S_DN_ST
SSL_CIPHER_USEKEYSIZE  SSL_CLIENT_S_DN_L      SSL_SERVER_S_DN_L
SSL_VERSION_LIBRARY    SSL_CLIENT_S_DN_O      SSL_SERVER_S_DN_O
SSL_VERSION_INTERFACE  SSL_CLIENT_S_DN_OU     SSL_SERVER_S_DN_OU
                       SSL_CLIENT_S_DN_CN     SSL_SERVER_S_DN_CN
                       SSL_CLIENT_S_DN_T      SSL_SERVER_S_DN_T
                       SSL_CLIENT_S_DN_I      SSL_SERVER_S_DN_I
                       SSL_CLIENT_S_DN_G      SSL_SERVER_S_DN_G
                       SSL_CLIENT_S_DN_S      SSL_SERVER_S_DN_S
                       SSL_CLIENT_S_DN_D      SSL_SERVER_S_DN_D
                       SSL_CLIENT_S_DN_UID    SSL_SERVER_S_DN_UID
                       SSL_CLIENT_S_DN_Email  SSL_SERVER_S_DN_Email
                       SSL_CLIENT_I_DN        SSL_SERVER_I_DN
                       SSL_CLIENT_I_DN_C      SSL_SERVER_I_DN_C
                       SSL_CLIENT_I_DN_ST     SSL_SERVER_I_DN_ST
                       SSL_CLIENT_I_DN_L      SSL_SERVER_I_DN_L
                       SSL_CLIENT_I_DN_O      SSL_SERVER_I_DN_O
                       SSL_CLIENT_I_DN_OU     SSL_SERVER_I_DN_OU
                       SSL_CLIENT_I_DN_CN     SSL_SERVER_I_DN_CN
                       SSL_CLIENT_I_DN_T      SSL_SERVER_I_DN_T
                       SSL_CLIENT_I_DN_I      SSL_SERVER_I_DN_I
                       SSL_CLIENT_I_DN_G      SSL_SERVER_I_DN_G
                       SSL_CLIENT_I_DN_S      SSL_SERVER_I_DN_S
                       SSL_CLIENT_I_DN_D      SSL_SERVER_I_DN_D
                       SSL_CLIENT_I_DN_UID    SSL_SERVER_I_DN_UID
                       SSL_CLIENT_I_DN_Email  SSL_SERVER_I_DN_Email
                       SSL_CLIENT_A_SIG       SSL_SERVER_A_SIG
                       SSL_CLIENT_A_KEY       SSL_SERVER_A_KEY
                       SSL_CLIENT_CERT        SSL_SERVER_CERT
                       SSL_CLIENT_CERT_CHAIN_n
                       SSL_CLIENT_VERIFY

SSLRequireSSL 指令

说明禁止未使用SSL的HTTP请求
语法SSLRequireSSL
作用域directory, .htaccess
覆盖项AuthConfig
状态扩展(E)
模块mod_ssl

这个指令用于禁止未使用SSL的HTTP请求,也就是必须使用HTTPS进行访问。它可以方便的用于避免被SSL保护的虚拟主机或目录由于配置错误而允许通过未加密的HTTP进行访问。只要这个指令存在,任何不使用SSL加密的连接都将被拒绝。

示例

SSLRequireSSL

SSLSessionCache 指令

说明指定SSL会话缓存的类型
语法SSLSessionCache type
默认值SSLSessionCache none
作用域server config
状态扩展(E)
模块mod_ssl

这个指令指定了全局/进程间SSL会话缓存的类型。SSL会话缓存机制(可选的)可以加速对并发HTTPS请求的处理速度。对于同一个服务器进程处理的HTTP keep-alive连接,OpenSSL自身已经在本地缓存了SSL会话信息。但是由于现代浏览器会使用多个并发连接请求页面内的图片等其他资源,服务器就不得不使用不同的进程来处理这些连接,因此能够在不同进程之间缓存SSL会话信息就有助于避免不必要的握手过程。

目前可用的缓存type如下:

  • none

    彻底禁止使用会话缓存。这将会导致服务器处理速度明显降低,并且在某些浏览器上会出现故障(特别是启用了客户端认证的时候)。因此,我们反对关闭缓存。

  • nonenotnull

    彻底禁止使用会话缓存,但是它强迫OpenSSL向客户端发送一个非空的会话ID,这样就可以和有bug的浏览器一起工作了。

  • dbm:/path/to/datafile

    使用一个本地磁盘上的DBM哈希文件缓存SSL会话信息。这种方式在高负载的情况下可能会遭遇可靠性问题。

  • shm:/path/to/datafile[(size)]

    使用高性能的共享内存文件(size字节大小的/path/to/datafile文件)作为循环缓冲区缓存SSL会话信息。这是推荐的方式。

  • dc:UNIX:/path/to/socket

    利用分布式的distcache会话缓存库缓存SSL会话信息。应该在参数中使用distcache地址语法规范来指定服务器或代理的位置。例如,使用"UNIX:/path/to/socket"指定一个UNIX domain socket(一般是一个本地dc_client代理),使用"IP:server.example.com:9001"指定一个IP地址。

例子

SSLSessionCache dbm:/usr/local/apache/logs/ssl_gcache_data
SSLSessionCache shm:/usr/local/apache/logs/ssl_gcache_data(512000)

SSLSessionCacheTimeout 指令

说明指定SSL会话缓存的有效期
语法SSLSessionCacheTimeout seconds
默认值SSLSessionCacheTimeout 300
作用域server config, virtual host
状态扩展(E)
模块mod_ssl

这个指令用于设置SSL会话缓存的有效期(秒)。在测试的时候可以设置一个较小的值(比如15),但是建议在生产环境中设置成一个较大的值(比如300)。

示例

SSLSessionCacheTimeout 600

SSLUserName 指令

说明用于确定用户名的SSL变量名
语法SSLUserName varname
作用域server config, directory, .htaccess
覆盖项AuthConfig
状态扩展(E)
模块mod_ssl
兼容性仅在 Apache 2.0.51 及以后的版本中可用

这个指令用于设置Apache请求对象的"user"字段的值。这个值被下层模块用来标识用户。特别地,这将导致环境变量REMOTE_USER被设置。varname可以是任意一个SSL环境变量。

需要注意的是,当使用了FakeBasic选项的时候(参见SSLOptions),这个指令没有任何效果。

示例

SSLUserName SSL_CLIENT_S_DN_CN

SSLVerifyClient 指令

说明客户端证书的验证级别
语法SSLVerifyClient level
默认值SSLVerifyClient none
作用域server config, virtual host, directory, .htaccess
覆盖项AuthConfig
状态扩展(E)
模块mod_ssl

这个指令设置了对客户端证书的验证级别。该指令既可以用于主机级别的配置(在SSL握手阶段就按照指定的级别进行证书验证),也可以用于目录级别的配置(在收到HTTP请求后、发送HTTP应答前,强制使用新的验证级别进行SSL重协商)。

可用的level如下:

  • none: 根本不要求客户端持有证书
  • optional: 客户端可以持有一个有效的证书
  • require: 客户端必须持有一个有效的证书
  • optional_no_ca: 客户端可以持有一个有效的证书,但是并不需要成功的通过验证。

在实践中,只有nonerequire有实际意义,因为optional并不能和所有浏览器协同工作,而optional_no_ca实际上依赖于身份认证的思想(但是可以用于SSL测试页面等)。

示例

SSLVerifyClient require

SSLVerifyDepth 指令

说明验证客户端证书有效性时允许的最大证书链深度
语法SSLVerifyDepth number
默认值SSLVerifyDepth 1
作用域server config, virtual host, directory, .htaccess
覆盖项AuthConfig
状态扩展(E)
模块mod_ssl

这个指令设置了在判定客户端证书无效前,允许验证的最大证书链深度。这个指令既可以用于主机级别的配置(在SSL握手阶段就按照指定的深度进行验证),也可以用于目录级别的配置(在收到HTTP请求后、发送HTTP应答前,强制使用新的验证深度进行SSL重协商)。

这里所谓的"最大深度"其实是指证书链上中间CA的最大个数。"0"表示仅接受自签名证书。默认值"1"表示只接受自签名证书和已知CA直接签名的证书。这里所谓的"已知CA"是指该CA的证书位于SSLCACertificatePath目录中。

示例

SSLVerifyDepth 10