Apache模块 mod_ssl
说明 | 使用安全套接字层(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的名字空间(以供脚本使用)。下表列出了所有这些变量。出于兼容性考虑,许多变量都有别名,具体可以参考兼容性一文。
变量名 | 数据类型 | 描述 |
---|---|---|
HTTPS |
flag | 是否正在使用HTTPS协议 |
SSL_PROTOCOL |
string | SSL协议的版本(SSLv2, SSLv3, TLSv1) |
SSL_SESSION_ID |
string | 十六进制表示的SSL会话ID |
SSL_CIPHER |
string | 加密算法的名称 |
SSL_CIPHER_EXPORT |
string | 如果此算法是一个出口算法(export cipher)那么其值为true
|
SSL_CIPHER_USEKEYSIZE |
number | 加密算法的位数(实际使用的) |
SSL_CIPHER_ALGKEYSIZE |
number | 加密算法的位数(可能的) |
SSL_COMPRESS_METHOD |
string | 经过协商后实际使用的SSL压缩方法 |
SSL_VERSION_INTERFACE |
string | mod_ssl的版本 |
SSL_VERSION_LIBRARY |
string | OpenSSL的版本 |
SSL_CLIENT_M_VERSION |
string | 客户端证书的版本 |
SSL_CLIENT_M_SERIAL |
string | 客户端证书的序列号 |
SSL_CLIENT_S_DN |
string | 客户端证书中特征名称(DN)域的值 |
SSL_CLIENT_S_DN_ x509
|
string | Component of client's Subject DN |
SSL_CLIENT_I_DN |
string | 客户端证书发行者的特征名称(DN)域的值 |
SSL_CLIENT_I_DN_ x509
|
string | Component of client's Issuer DN |
SSL_CLIENT_V_START |
string | 客户端证书有效期的开始时间 |
SSL_CLIENT_V_END |
string | 客户端证书有效期的结束时间 |
SSL_CLIENT_V_REMAIN |
string | 客户端证书还有多少天就将过期 |
SSL_CLIENT_A_SIG |
string | 客户端证书的签名算法 |
SSL_CLIENT_A_KEY |
string | 客户端证书的公钥算法 |
SSL_CLIENT_CERT |
string | PEM编码的客户端证书 |
SSL_CLIENT_CERT_CHAIN_ n
|
string | 在客户端证书链中PEM编码的证书 |
SSL_CLIENT_VERIFY |
string | 客户端认证的结果:NONE , SUCCESS , GENEROUS , FAILED: reason
|
SSL_SERVER_M_VERSION |
string | 服务器证书的版本 |
SSL_SERVER_M_SERIAL |
string | 服务器证书的序列号 |
SSL_SERVER_S_DN |
string | 服务器证书中特征名称(DN)域的值 |
SSL_SERVER_S_DN_ x509
|
string | Component of server's Subject DN |
SSL_SERVER_I_DN |
string | 服务器证书发行者的特征名称(DN)域的值 |
SSL_SERVER_I_DN_ x509
|
string | Component of server's Issuer DN |
SSL_SERVER_V_START |
string | 服务器证书有效期的开始时间 |
SSL_SERVER_V_END |
string | 服务器证书有效期的结束时间 |
SSL_SERVER_A_SIG |
string | 服务器证书的签名算法 |
SSL_SERVER_A_KEY |
string | 服务器证书的公钥算法 |
SSL_SERVER_CERT |
string | PEM编码的服务器证书 |
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_0
和SSL_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名称从它所持有的所有证书中选择一个最恰当的证书。
如果SSLCADNRequestPath
和SSLCADNRequestFile
都没有给出,那么向客户端发送的所有"可接受的CA名称"就由SSLCACertificateFile
和SSLCACertificatePath
决定,也就是所有可接受的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签发的客户端证书也会在执行客户端认证的时候同时被认可,这通常不是你期望的结果。
小心:仅在服务器证书使用单一算法(RSA或DSA)的情况下,提供证书链才可行。如果你使用了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密钥交换 |
kEDH |
Ephemeral (temp.key) Diffie-Hellman key exchange (no cert) |
认证算法 | |
aNULL |
不进行认证 |
aRSA |
RSA认证 |
aDSS |
DSS认证 |
aDH |
Diffie-Hellman认证 |
加密算法 | |
eNULL |
不加密 |
AES |
AES加密 |
DES |
DES加密 |
3DES |
Triple-DES加密 |
RC4 |
RC4加密 |
RC2 |
RC2加密 |
IDEA |
IDEA加密 |
摘要算法 | |
MD5 |
MD5摘要 |
SHA1 |
SHA1摘要 |
SHA |
SHA摘要 |
别名 | |
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
自动在
posixsem
与sysvsem
之间选择一个"最佳"的方式:优先选择前者,仅在前者不可用时才选择后者。仅在底层平台和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
自动在
fcntl
和flock
之间选择一个"最佳"的方式:优先选择前者,仅在前者不可用时才选择后者。仅在底层平台和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
如果开启此选项,那么当
SSLRequireSSL
或SSLRequire
要求禁止访问时,将强制禁止访问。默认情况下,当设置了"Satisfy any
"时,如果通过了SSLRequireSSL
或SSLRequire
之外的其他访问控制检查,那么访问将被允许,这符合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: 远端服务器可以持有一个有效的证书,但是并不需要成功的通过验证。
在实践中,只有none和require有实际意义,因为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: 客户端可以持有一个有效的证书,但是并不需要成功的通过验证。
在实践中,只有none和require有实际意义,因为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