<-
Apache > HTTP Server > 文档 > 版本2.2 > 模块

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文档

top

环境变量

这个模块通过环境变量提供了许多额外的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和更高版本中可见。

top

自定义日志格式

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"

top

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

top

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/

top

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

top

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/

top

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

top

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/

top

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

top

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

top

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

top

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个属性组成:

可以指定加密算法套件中每个属性的算法,也可以使用别名指定一组特定的算法套件(表-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

top

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

top

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地址上的几个主机的消息。

top

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

top

SSLMutex 指令

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

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

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

示例

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

top

SSLOptions 指令

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

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

所有可用选项如下:

示例

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

top

SSLPassPhraseDialog 指令

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

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

示例

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

top

SSLProtocol 指令

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

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

可用的协议版本如下:

示例

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

top

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

top

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/

top

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

top

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/

top

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指令以获取更多细节。

top

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>

top

SSLProxyMachineCertificateFile 指令

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

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

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

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

示例

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

top

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/

top

SSLProxyProtocol 指令

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

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

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

top

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如下:

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

示例

SSLProxyVerify require

top

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

top

SSLRandomSeed 指令

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

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

可用的source类型如下:

示例

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

top

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可以使用下列函数:

主意: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
top

SSLRequireSSL 指令

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

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

示例

SSLRequireSSL

top

SSLSessionCache 指令

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

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

目前可用的缓存type如下:

例子

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

top

SSLSessionCacheTimeout 指令

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

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

示例

SSLSessionCacheTimeout 600

top

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

top

SSLVerifyClient 指令

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

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

可用的level如下:

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

示例

SSLVerifyClient require

top

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