Apache模块mod_ssl
描述: | 使用安全套接字层(SSL)和传输层安全性(TLS)协议的强大加密技术 |
---|---|
状态: | 延期 |
模块标识符: | ssl_module |
源文件: | mod_ssl.c |
概要
此模块为Apache HTTP Server提供SSL v2 / v3和TLS v1支持。它是由Ralf S. Engeschall根据他的mod_ssl项目贡献的,最初来自Ben Laurie的工作。
这个模块依靠OpenSSL 来提供密码引擎。
SSL文档中提供了更多细节,讨论和示例 。
主题
- 环境变量
- 自定义日志格式
指令
- SSLCACertificateFile
- SSLCACertificatePath
- SSLCADNRequestFile
- SSLCADNRequestPath
- SSLCARevocationFile
- SSLCARevocationPath
- SSLCertificateChainFile
- 了SSLCertificateFile
- 了SSLCertificateKeyFile
- 的SSLCipherSuite
- SSLCompression
- SSLCryptoDevice
- 的SSLEngine
- SSLFIPS
- SSLHonorCipherOrder
- SSLInsecureRenegotiation
- SSLMutex
- SSLOptions
- SSLPassPhraseDialog
- SSLProtocol
- SSLProxyCACertificateFile
- SSLProxyCACertificatePath
- SSLProxyCARevocationFile
- SSLProxyCARevocationPath
- SSLProxyCheckPeerCN
- SSLProxyCheckPeerExpire
- SSLProxyCipherSuite
- SSLProxyEngine
- SSLProxyMachineCertificateChainFile
- SSLProxyMachineCertificateFile
- SSLProxyMachineCertificatePath
- SSLProxyProtocol
- SSLProxyVerify
- SSLProxyVerifyDepth
- SSLRandomSeed
- SSLRenegBufferSize
- SSLRequire
- SSLRequireSSL
- SSLSessionCache
- SSLSessionCacheTimeout
- SSLSessionTicketKeyFile
- SSLSessionTickets
- SSLStrictSNIVHostCheck
- SSLUserName
- SSLVerifyClient
- SSLVerifyDepth
- 注释
环境变量
可以将此模块配置为向SSI和CGI命名空间提供多项SSL信息作为附加环境变量。由于性能原因,此信息不是默认提供的。(请参阅 SSLOptions
下面的StdEnvVars。)生成的变量在下表中列出。为了向后兼容,信息也可以以不同的名字提供。有关兼容性变量的详细信息,请参阅兼容性一章。
变量名: | 值类型: | 描述: |
---|---|---|
HTTPS |
旗 | 正在使用HTTPS。 |
SSL_PROTOCOL |
串 | SSL协议版本(SSLv2,SSLv3,TLSv1,TLSv1.1,TLSv1.2) |
SSL_SESSION_ID |
串 | 十六进制编码的SSL会话ID |
SSL_CIPHER |
串 | 密码规范名称 |
SSL_CIPHER_EXPORT |
串 | true 如果密码是出口密码 |
SSL_CIPHER_USEKEYSIZE |
数 | 密码位数(实际使用) |
SSL_CIPHER_ALGKEYSIZE |
数 | 密码位数(可能) |
SSL_COMPRESS_METHOD |
串 | SSL压缩方法协商 |
SSL_VERSION_INTERFACE |
串 | mod_ssl程序版本 |
SSL_VERSION_LIBRARY |
串 | OpenSSL程序版本 |
SSL_CLIENT_M_VERSION |
串 | 客户端证书的版本 |
SSL_CLIENT_M_SERIAL |
串 | 客户端证书的序列 |
SSL_CLIENT_S_DN |
串 | 在客户的证书中的主题DN |
SSL_CLIENT_S_DN_ X509 |
串 | 客户主题DN的组件 |
SSL_CLIENT_I_DN |
串 | 客户证书的颁发者DN |
SSL_CLIENT_I_DN_ X509 |
串 | 客户发行人DN的组件 |
SSL_CLIENT_V_START |
串 | 客户证书的有效期(开始时间) |
SSL_CLIENT_V_END |
串 | 客户证书的有效期(结束时间) |
SSL_CLIENT_V_REMAIN |
串 | 客户证书到期的天数 |
SSL_CLIENT_A_SIG |
串 | 用于签名客户证书的算法 |
SSL_CLIENT_A_KEY |
串 | 用于客户端证书的公钥的算法 |
SSL_CLIENT_CERT |
串 | PEM编码的客户端证书 |
SSL_CLIENT_CERT_CHAIN_ ñ |
串 | 客户端证书链中的PEM编码的证书 |
SSL_CLIENT_VERIFY |
串 | NONE ,SUCCESS ,GENEROUS 或FAILED: 原因 |
SSL_SERVER_M_VERSION |
串 | 服务器证书的版本 |
SSL_SERVER_M_SERIAL |
串 | 服务器证书的序列号 |
SSL_SERVER_S_DN |
串 | 服务器证书中的主题DN |
SSL_SERVER_S_DN_ X509 |
串 | 服务器主题DN的组件 |
SSL_SERVER_I_DN |
串 | 服务器证书的颁发者DN |
SSL_SERVER_I_DN_ X509 |
串 | 服务器发行者DN的组件 |
SSL_SERVER_V_START |
串 | 服务器证书的有效期(开始时间) |
SSL_SERVER_V_END |
串 | 服务器证书的有效期(结束时间) |
SSL_SERVER_A_SIG |
串 | 用于签名服务器证书的算法 |
SSL_SERVER_A_KEY |
串 | 用于服务器证书的公钥的算法 |
SSL_SERVER_CERT |
串 | PEM编码的服务器证书 |
SSL_TLS_SNI |
串 | SNI TLS扩展的内容(如果随ClientHello提供) |
x509指定X.509 DN的组件; 其中之一 C,ST,L,O,OU,CN,T,I,G,S,D,UID,Email
。在Apache 2.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
'扩展格式的功能,它可以用来扩展任何模块,特别是那些由可你在上表中找到了mod_ssl提供所提供的任何变量。
为了向后兼容,还提供了特殊的“ %{
名称}c
”加密格式功能。有关此功能的信息在“ 兼容性”一章中提供。
例
CustomLog logs/ssl_request_log \ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
这些格式甚至可以在不设置 指令StdEnvVars
选项的情况下工作SSLOptions
。
SSLCACertificateFile 指令
描述: | 用于客户端身份验证的级联PEM编码CA证书文件 |
---|---|
句法: | SSLCACertificateFile file-path |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
该指令设置了一体式文件,您可以在其中组装与您处理的客户的证书颁发机构(CA)证书。这些用于客户端身份验证。这样的文件就是各种PEM编码证书文件的串联,按照优先顺序。这可以替代地和/或另外地使用 SSLCACertificatePath
。
例
SSLCACertificateFile /usr/local/apache2/conf/ssl.crt/ca-bundle-client.crt
SSLCACertificatePath 指令
描述: | 用于客户端身份验证的PEM编码的CA证书目录 |
---|---|
句法: | SSLCACertificatePath directory-path |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
该指令设置您保存与您处理的客户的证书颁发机构(CA)证书的目录。这些用于验证客户端身份验证上的客户端证书。
这个目录中的文件必须是PEM编码的,并通过哈希文件名来访问。所以通常你不能把证书文件放在那里:你还必须创建名为散列值的符号链接 .N
。你应该确保这个目录包含适当的符号链接。
例
SSLCACertificatePath /usr/local/apache2/conf/ssl.crt/
SSLCADNRequestFile 指令
描述: | 连接的PEM编码CA证书的文件,用于定义可接受的CA名称 |
---|---|
句法: | SSLCADNRequestFile file-path |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
当mod_ssl请求客户端证书时,在SSL握手中将可接受的证书授权者名称列表 发送到客户端。客户端可以使用这些CA名称从可用的客户端证书中选择适当的客户端证书。
若既没有指令SSLCADNRequestPath
或SSLCADNRequestFile
给出,那么该组发送到客户端上可接受的CA的名称是由给定的所有的CA证书的名称SSLCACertificateFile
和SSLCACertificatePath
指示; 换句话说,实际上将用于验证客户端证书的CA的名称。
在某些情况下,能够发送一组可接受的CA名称是有用的,这些名称与用于验证客户端证书的实际CA不同,例如,客户端证书是否由中间CA签名。在这种情况下,SSLCADNRequestPath
和/或SSLCADNRequestFile
可以使用; 那么可接受的CA名称将从这对指令所指定的目录和/或文件中的全套证书中取得。
SSLCADNRequestFile
必须指定一个包含PEM编码CA证书串联的一体化文件。
例
SSLCADNRequestFile /usr/local/apache2/conf/ca-names.crt
SSLCADNRequestPath 指令
描述: | 用于定义可接受的CA名称的PEM编码的CA证书目录 |
---|---|
句法: | SSLCADNRequestPath directory-path |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
此可选指令可用于指定在请求客户端证书时将发送给客户端的可接受的CA名称集合 。请参阅SSLCADNRequestFile
指令了解更多详情。
这个目录中的文件必须是PEM编码的,并通过哈希文件名来访问。所以通常你不能把证书文件放在那里:你还必须创建名为散列值的符号链接 .N
。你应该确保这个目录包含适当的符号链接。
例
SSLCADNRequestPath /usr/local/apache2/conf/ca-names.crt/
SSLCARevocationFile 指令
描述: | 客户端身份验证的级联PEM编码的CA CRL的文件 |
---|---|
句法: | SSLCARevocationFile file-path |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
该指令设置一体式文件,您可以在其中组装证书吊销列表(CRL)的证书颁发机构(CA),您的客户与您打交道。这些用于客户端身份验证。这样的文件就是各种PEM编码的CRL文件的串联,按照优先顺序。这可以替代地和/或另外地使用SSLCARevocationPath
。
例
SSLCARevocationFile /usr/local/apache2/conf/ssl.crl/ca-bundle-client.crl
SSLCARevocationPath 指令
描述: | 用于客户端身份验证的PEM编码CA CRL目录 |
---|---|
句法: | SSLCARevocationPath directory-path |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
此指令设置您保存其所处理客户的证书颁发机构(CA)的证书吊销列表(CRL)的目录。这些用于在客户端身份验证上撤销客户端证书。
这个目录中的文件必须是PEM编码的,并通过哈希文件名来访问。所以通常你不仅要把CRL文件放在那里。另外,您必须创建名为哈希值的符号链接 .rN
。你应该确保这个目录包含适当的符号链接。
例
SSLCARevocationPath /usr/local/apache2/conf/ssl.crl/
SSLCertificateChainFile 指令
描述: | PEM编码的服务器CA证书文件 |
---|---|
句法: | SSLCertificateChainFile file-path |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
该指令设置可选的一体化文件,您可以在其中组装证书作为服务器证书的证书链的证书颁发机构(CA)的证书。这从服务器证书颁发的CA证书开始,可以扩展到根CA证书。这样的文件就是各种PEM编码的CA证书文件的串联,通常以证书链顺序。
除了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 |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
兼容性: | ECC支持在Apache 2.2.26及更高版本中可用 |
该指令指向一个带有PEM格式证书数据的文件。文件至少必须包含一个最终实体(叶)证书。当并行使用RSA,DSA和基于ECC的服务器证书时,指令最多可以使用三次(引用不同的文件名)。
可以将自定义DH参数和临时密钥的EC曲线名称添加到使用的第一个文件的末尾 SSLCertificateFile
。这在版本2.2.30或更高版本中受支持。这样的参数可以使用命令来生成 openssl dhparam
和openssl ecparam
。参数可以按原样添加到第一个证书文件的末尾。只有第一个文件可以用于自定义参数,因为它们与认证算法类型无关地被应用。
最后,最终实体证书的私钥也可以添加到证书文件中,而不是使用单独的 SSLCertificateKeyFile
指令。这种做法是非常沮丧的。如果私钥已加密,则在启动时会强制执行密码对话框。
DH参数与质数> 1024位的互操作性
从版本2.2.30开始,mod_ssl使用主要长度为2048,3072,4096,6144和8192位(来自RFC 3526)的标准化DH参数,并根据证书RSA / DSA的长度将其发送给客户端键。特别是基于Java的客户端(Java 7或更早版本),这可能会导致握手失败 - 请参阅此常见问题解答以解决此类问题。
例
SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt
SSLCertificateKeyFile 指令
描述: | 服务器PEM编码的私钥文件 |
---|---|
句法: | SSLCertificateKeyFile file-path |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
兼容性: | ECC支持在Apache 2.2.26及更高版本中可用 |
该指令指向服务器的PEM编码私钥文件。如果包含的私钥被加密,则在启动时强制密码对话框被强制。
当并行使用RSA,DSA和基于ECC的私钥时,指令最多可以使用三次(引用不同的文件名)。对于每个 SSLCertificateKeyFile
指令,必须有一个匹配的SSLCertificateFile
指令。
私钥也可以与文件中给出的证书结合使用 SSLCertificateFile
,但是这种做法是非常沮丧的。
例
SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key
SSLCipherSuite 指令
描述: | 密码套件可用于SSL握手协商 |
---|---|
句法: | SSLCipherSuite cipher-spec |
默认: | SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP |
语境: | 服务器配置,虚拟主机,目录,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | 了mod_ssl |
此复杂指令使用由OpenSSL密码规范组成的以冒号分隔的密码规范字符串来配置允许客户端在SSL握手阶段进行协商的密码套件。注意这个指令可以用在每个服务器和每个目录的上下文中。在每服务器上下文中,当连接建立时,它适用于标准的SSL握手。在每个目录上下文中,在读取HTTP请求之后但在发送HTTP响应之前,它强制与重新配置的密码套件进行SSL重新协商。
密码规范中的一个SSL密码规范由4个主要属性加上一些额外的次要属性组成:
- 密钥交换算法:
RSA或Diffie-Hellman变体。 - 认证算法:
RSA,Diffie-Hellman,DSS或无。 - 密码/加密算法:
DES,Triple-DES,RC4,RC2,IDEA或无。 - MAC摘要算法:
MD5,SHA或SHA1。
SSL密码也可以是导出密码,可以是SSLv2或SSLv3 / TLSv1密码(这里的TLSv1相当于SSLv3)。要指定要使用的密码,可以指定所有密码,一次一个,或使用别名来指定密码的首选项和顺序(请参阅表1)。
标签 | 描述 |
---|---|
密钥交换算法: | |
kRSA |
RSA密钥交换 |
kDHr |
与RSA密钥的Diffie-Hellman密钥交换 |
kDHd |
与DSA密钥的Diffie-Hellman密钥交换 |
kEDH |
临时(temp.key)Diffie-Hellman密钥交换(无证书) |
认证算法: | |
aNULL |
没有认证 |
aRSA |
RSA认证 |
aDSS |
DSS认证 |
aDH |
Diffie-Hellman认证 |
密码编码算法: | |
eNULL |
没有编码 |
DES |
DES编码 |
3DES |
三重DES编码 |
RC4 |
RC4编码 |
RC2 |
RC2编码 |
IDEA |
IDEA编码 |
MAC摘要算法: | |
MD5 |
MD5哈希函数 |
SHA1 |
SHA1哈希函数 |
SHA |
SHA哈希函数 |
别名: | |
SSLv2 |
所有SSL版本2.0密码 |
SSLv3 |
所有SSL版本3.0密码 |
TLSv1 |
所有TLS版本1.0密码 |
EXP |
所有的出口密码 |
EXPORT40 |
所有的40位出口密码只 |
EXPORT56 |
所有56位导出密码只 |
LOW |
所有低强度密码(不输出,单个DES) |
MEDIUM |
所有128位加密的密码 |
HIGH |
所有使用Triple-DES的密码 |
RSA |
所有使用RSA密钥交换的密码 |
DH |
所有使用Diffie-Hellman密钥交换的密码 |
EDH |
所有使用Ephemeral Diffie-Hellman密钥交换的密码 |
ADH |
所有使用匿名Diffie-Hellman密钥交换的密码 |
DSS |
所有使用DSS认证的密码 |
NULL |
所有使用不加密的密码 |
现在,变得有趣的是,这些可以放在一起,以指定您希望使用的顺序和密码。为了加快速度,还有一些别名(SSLv2, SSLv3, TLSv1, EXP, LOW, MEDIUM, HIGH
)用于某些密码组。这些标签可以用前缀连接在一起形成密码规范。可用的前缀是:
- none:将密码添加到列表中
+
:将匹配的密码移动到列表中的当前位置-
:从列表中删除密码(可以再次添加)!
:完全从列表中删除密码(以后不能再添加)
aNULL
,eNULL
以及EXP
密码总是禁用
从版本2.2.30开始,null和export-grade密码总是被禁用,因为mod_ssl无条件地!aNULL:!eNULL:!EXP:
在初始化时预先提供任何提供的密码套件字符串。
更简单的方法是使用```` openssl ciphers -v
命令提供一个很好的方法来连续创建正确的密码规范字符串。默认的cipher-spec字符串是“` ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
”,表示如下:首先,不考虑任何不认证的密码,即仅用于匿名Diffie-Hellman密码的SSL。接下来,使用RC4和RSA使用密码。其次包括高,中,低安全性密码。最后拉取所有SSLv2并将密码导出到列表的末尾。
$ openssl ciphers -v'ALL:!ADH:RC4 + RSA:+ HIGH:+ MEDIUM:+ LOW:+ SSLv2:+ EXP' NULL-SHA SSLv3 Kx = RSA Au = RSA Enc = None Mac = SHA1 NULL-MD5 SSLv3 Kx = RSA Au = RSA Enc = None Mac = MD5 EDH-RSA-DES-CBC3-SHA SSLv3 Kx = DH Au = RSA Enc = 3DES(168)Mac = SHA1 ... ... ... ... EXP-RC4-MD5 SSLv3 Kx = RSA(512)Au = RSA Enc = RC4(40)Mac = MD5出口 EXP-RC2-CBC-MD5 SSLv2 Kx = RSA(512)Au = RSA Enc = RC2(40)Mac = MD5出口 EXP-RC4-MD5 SSLv2 Kx = RSA(512)Au = RSA Enc = RC4(40)Mac = MD5出口
表2给出了用于SSL的特定RSA&DH密码的完整列表。
例
SSLCipherSuite RSA:!EXP:!NULL:+HIGH:+MEDIUM:-LOW
密码的标签 | 协议 | Key Ex。 | 验证。 | ENC。 | 苹果电脑 | 类型 |
---|---|---|---|---|---|---|
RSA密码: | ||||||
DES-CBC3-SHA |
在SSLv3 | RSA | RSA | 3DES(168) | SHA1 | |
DES-CBC3-MD5 |
的SSLv2 | RSA | RSA | 3DES(168) | MD5 | |
IDEA-CBC-SHA |
在SSLv3 | RSA | RSA | IDEA(128) | SHA1 | |
RC4-SHA |
在SSLv3 | RSA | RSA | RC4(128) | SHA1 | |
RC4-MD5 |
在SSLv3 | RSA | RSA | RC4(128) | MD5 | |
IDEA-CBC-MD5 |
的SSLv2 | RSA | RSA | IDEA(128) | MD5 | |
RC2-CBC-MD5 |
的SSLv2 | RSA | RSA | RC2(128) | MD5 | |
RC4-MD5 |
的SSLv2 | RSA | RSA | RC4(128) | MD5 | |
DES-CBC-SHA |
在SSLv3 | RSA | RSA | DES(56) | SHA1 | |
RC4-64-MD5 |
的SSLv2 | RSA | RSA | RC4(64) | MD5 | |
DES-CBC-MD5 |
的SSLv2 | RSA | RSA | DES(56) | MD5 | |
EXP-DES-CBC-SHA |
在SSLv3 | RSA(512) | RSA | DES(40) | SHA1 | 出口 |
EXP-RC2-CBC-MD5 |
在SSLv3 | RSA(512) | RSA | RC2(40) | MD5 | 出口 |
EXP-RC4-MD5 |
在SSLv3 | RSA(512) | RSA | RC4(40) | MD5 | 出口 |
EXP-RC2-CBC-MD5 |
的SSLv2 | RSA(512) | RSA | RC2(40) | MD5 | 出口 |
EXP-RC4-MD5 |
的SSLv2 | RSA(512) | RSA | RC4(40) | MD5 | 出口 |
NULL-SHA |
在SSLv3 | RSA | RSA | 没有 | SHA1 | |
NULL-MD5 |
在SSLv3 | RSA | RSA | 没有 | MD5 | |
Diffie-Hellman密码: | ||||||
ADH-DES-CBC3-SHA |
在SSLv3 | DH | 没有 | 3DES(168) | SHA1 | |
ADH-DES-CBC-SHA |
在SSLv3 | DH | 没有 | DES(56) | SHA1 | |
ADH-RC4-MD5 |
在SSLv3 | DH | 没有 | RC4(128) | MD5 | |
EDH-RSA-DES-CBC3-SHA |
在SSLv3 | DH | RSA | 3DES(168) | SHA1 | |
EDH-DSS-DES-CBC3-SHA |
在SSLv3 | DH | DSS | 3DES(168) | SHA1 | |
EDH-RSA-DES-CBC-SHA |
在SSLv3 | DH | RSA | DES(56) | SHA1 | |
EDH-DSS-DES-CBC-SHA |
在SSLv3 | DH | DSS | DES(56) | SHA1 | |
EXP-EDH-RSA-DES-CBC-SHA |
在SSLv3 | DH(512) | RSA | DES(40) | SHA1 | 出口 |
EXP-EDH-DSS-DES-CBC-SHA |
在SSLv3 | DH(512) | DSS | DES(40) | SHA1 | 出口 |
EXP-ADH-DES-CBC-SHA |
在SSLv3 | DH(512) | 没有 | DES(40) | SHA1 | 出口 |
EXP-ADH-RC4-MD5 |
在SSLv3 | DH(512) | 没有 | RC4(40) | MD5 | 出口 |
SSLCompression 指令
描述: | 在SSL级别启用压缩 |
---|---|
句法: | SSLCompression on|off |
默认: | SSLCompression off |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
兼容性: | 在httpd 2.2.24及更高版本中可用,如果使用OpenSSL 0.9.8或更高版本; 如果使用OpenSSL 1.0.0或更高版本,则可以使用虚拟主机作用域。默认情况下是on 2.2.24到2.2.25版本。 |
该指令允许在SSL级别启用压缩。
启用压缩会导致大多数安装问题(所谓的CRIME攻击)。
SSLCryptoDevice 指令
描述: | 启用加密硬件加速器 |
---|---|
句法: | SSLCryptoDevice engine |
默认: | SSLCryptoDevice builtin |
语境: | 服务器配置 |
状态: | 延期 |
模块: | 了mod_ssl |
兼容性: | 如果使用OpenSSL 0.9.6或OpenSSL 0.9.7或更高版本的引擎,则可用于Apache 2.1及更高版本 |
该指令允许使用加密硬件加速器板来卸载一些SSL处理开销。这个指令只有在SSL工具箱是用“引擎”支持构建时才能使用; OpenSSL 0.9.7和更高版本默认具有“引擎”支持,必须使用OpenSSL 0.9.6的单独版本“-engine”。
要发现支持哪些引擎名称,请运行命令“ openssl engine
”。
例
# For a Broadcom accelerator:
SSLCryptoDevice ubsec
SSLEngine 指令
描述: | SSL引擎操作开关 |
---|---|
句法: | SSLEngine on|off|optional |
默认: | SSLEngine off |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了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。目前没有网页浏览器支持RFC 2817。
SSLFIPS 指令
描述: | SSL FIPS模式切换 |
---|---|
句法: | SSLFIPS on|off |
默认: | SSLFIPS off |
语境: | 服务器配置 |
状态: | 延期 |
模块: | 了mod_ssl |
该指令切换SSL库FIPS_mode标志的使用。它必须在全局服务器上下文中进行设置,并且不能使用冲突设置进行配置(SSLFIPS开启,然后关闭SSLFIPS或类似)。该模式适用于所有SSL库操作。
如果httpd是针对不支持FIPS_mode标志的SSL库编译的,SSLFIPS on
将会失败。有关在FIPS 140-2批准的操作模式中使用mod_ssl的特定要求,请参阅SSL提供程序库的FIPS 140-2安全策略文档; 请注意,当所有组件按照适用的安全策略规定的指导方针进行组装和操作时,mod_ssl本身未经过验证,但可以描述为使用FIPS 140-2验证的加密模块。
SSLHonorCipherOrder 指令
描述: | 选择优先服务器的密码首选项顺序 |
---|---|
句法: | SSLHonorCipherOrder flag |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
兼容性: | 如果使用OpenSSL 0.9.7或更高版本,可用于Apache 2.1及更高版本 |
在SSLv3或TLSv1握手期间选择密码时,通常使用客户端的首选项。如果启用此指令,则将使用服务器的首选项。
例
SSLHonorCipherOrder on
SSLInsecureRenegotiation 指令
描述: | 选择启用对不安全重新协商的支持 |
---|---|
句法: | SSLInsecureRenegotiation flag |
默认: | SSLInsecureRenegotiation off |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
兼容性: | 在httpd 2.2.15及更高版本中可用,如果使用OpenSSL 0.9.8m或更高版本 |
正如最初指定的那样,在重新协商期间,所有版本的SSL和TLS协议(直到并包括TLS / 1.2)都容易受到中间人攻击(CVE-2009-3555)的攻击。这个漏洞使得攻击者可以将选定的明文“加”前缀到Web服务器所看到的HTTP请求中。开发了一个协议扩展,如果客户端和服务器均支持该扩展,则会修复此漏洞。
如果mod_ssl
与OpenSSL 0.9.8m或更高版本链接,默认情况下,只有支持新协议扩展的客户端才能支持重新协商。如果启用此指令,则旧(未打补丁)客户端将允许重新协商,尽管不安全。
安全警告
如果启用此指令,则SSL连接将容易受到CVE-2009-3555中所述的中间人攻击。
例
SSLInsecureRenegotiation on
SSL_SECURE_RENEG
可以使用SSI或CGI脚本中的环境变量来确定给定SSL连接是否支持安全重新协商。
SSLMutex 指令
描述: | 信号量用于内部相互排斥的操作 |
---|---|
句法: | SSLMutex type |
默认: | SSLMutex none |
语境: | 服务器配置 |
状态: | 延期 |
模块: | 了mod_ssl |
这配置了SSL引擎的信号量(也就是锁),它用于互斥操作,这些操作必须以预分流的Apache服务器进程之间的同步方式完成。该指令只能在全局服务器上下文中使用,因为它只有一个全局互斥量。该指令的设计与AcceptMutex
指令非常匹配 。
以下互斥体类型可用:
none | no
这是根本不使用Mutex的默认设置。需要您自担风险使用它。但是由于目前Mutex主要用于同步对SSL会话缓存的写访问,所以只要您接受有时会出现乱码的会话缓存,您就可以没有它。所以不建议保留这个默认值。而是配置一个真正的互斥。
posixsem
这是一个优雅的Mutex变种,尽可能使用Posix Semaphore。它只有在底层平台和APR支持时才可用。
sysvsem
这是一个有点优雅的Mutex变种,尽可能使用SystemV IPC Semaphore。如果进程在信号量被移除之前崩溃,则可能“泄漏”SysV信号量。它只有在底层平台和APR支持时才可用。
sem
该指令通知SSL模块选择可用的“最佳”信号量实现,在Posix和SystemV IPC之间进行选择。它只有在底层平台和APR支持至少其中一个时才可用。
pthread
这个指令告诉SSL模块使用Posix线程互斥体。它只有在底层平台和APR支持时才可用。
fcntl:/path/to/mutex
这是一个便携式Mutex变体,其中物理(锁定)文件和
fcntl()
函数被用作互斥体。始终使用本地磁盘文件系统/path/to/mutex
,永远不要使用驻留在NFS或AFS文件系统上的文件。它只有在底层平台和APR支持时才可用。注意:在内部,Apache父进程的进程ID(PID)被自动附加到/path/to/mutex
以使其唯一,所以您不必担心自己的冲突。请注意,这种类型的互斥体在Win32环境下不可用。在那里你必须使用信号量互斥。flock:/path/to/mutex
这与使用函数来提供文件锁定的
fcntl:/path/to/mutex
方法类似flock()
。它只有在底层平台和APR支持时才可用。file:/path/to/mutex
该指令告诉SSL模块选择可用的“最佳”文件锁定实现,
fcntl
并flock
按照顺序选择。它只有在底层平台和APR支持至少其中一个时才可用。default | yes
该指令通知SSL模块选择由平台和APR确定的默认锁定实现。
例
SSLMutex file:/usr/local/apache/logs/ssl_mutex
SSLOptions 指令
描述: | 配置各种SSL引擎运行时选项 |
---|---|
句法: | SSLOptions [+|-]option ... |
语境: | 服务器配置,虚拟主机,目录,.htaccess |
覆盖: | 选项 |
状态: | 延期 |
模块: | 了mod_ssl |
该指令可用于控制每个目录的各种运行时选项。通常情况下,如果多个SSLOptions
可以应用到一个目录,那么最具体的是完全采取; 选项不合并。但是,如果指令上的所有选项SSLOptions
都以加号(+
)或减号(-
)符号开头,则合并选项。任何以a开头+
的选项都将添加到当前生效的选项中,并且前面的任何选项 -
都将从当前生效的选项中删除。
可用的选项是:
StdEnvVars
启用此选项时,会创建标准的SSL相关CGI / SSI环境变量集。由于性能方面的原因,每个默认值都被禁用,因为信息提取步骤是一个相当昂贵的操作。所以通常只对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)将被转换为HTTP基本授权用户名。这意味着标准的Apache认证方法可以用于访问控制。用户名只是客户X509证书的主题(可以通过运行OpenSSL的
openssl x509
命令:openssl x509 -noout -subject -in
证书来确定.crt
)。请注意,用户没有获得密码。用户文件中的每个条目都需要这个密码:“`xxj31ZMTZzkVA
”,这是“` ”的DES加密版本password
。那些生活在基于MD5的加密(例如在FreeBSD或BSD / OS下)的人应该使用以下同一个单词的MD5散列:``$1$OXLyS...$Owx8s2/m9/gfkcRVXzgoE/
'。StrictRequire
这强制禁止访问时,
SSLRequireSSL
或SSLRequire
成功决定访问应被禁止。通常情况下,缺省情况下,在使用````Satisfy any
指令的情况下,传递其他访问限制时,拒绝访问由于SSLRequireSSL
或被SSLRequire
覆盖(因为这是ApacheSatisfy
机制应该如何 工作)。但是对于严格的访问限制可以使用SSLRequireSSL
和/或SSLRequire
与“`SSLOptions +StrictRequire
” 结合使用。那么Satisfy Any
一旦mod_ssl决定拒绝访问,额外的``` 是没有机会的。OptRenegotiate
这可以在每个目录上下文中使用SSL指令时启用优化的SSL连接重新协商处理。默认情况下启用了严格的方案,其中每一个的SSL参数每个目录的重新配置导致完全 SSL握手重新协商。当使用这个选项时,mod_ssl通过进行更细粒度(但仍然安全)的参数检查尝试避免不必要的握手。尽管如此,这些粒度检查有时可能不是用户期望的,所以请仅在每个目录的基础上启用此功能。
例
SSLOptions +FakeBasicAuth -StrictRequire
<Files ~ "\.(cgi|shtml)$">
SSLOptions +StdEnvVars -ExportCertData
<Files>
SSLPassPhraseDialog 指令
描述: | 加密私钥的密码对话框的类型 |
---|---|
句法: | SSLPassPhraseDialog type |
默认: | SSLPassPhraseDialog builtin |
语境: | 服务器配置 |
状态: | 延期 |
模块: | 了mod_ssl |
当Apache启动时,必须读取启用SSL的虚拟服务器的各种证书(请参阅 SSLCertificateFile
)和私钥(请参阅SSLCertificateKeyFile
)文件。由于安全原因,私钥文件通常是加密的,mod_ssl需要向管理员查询密码短语才能解密这些文件。这个查询可以通过两种方式完成,可以通过键入来配置 :
builtin
这是在Apache离开终端之前,在启动时发生交互式终端对话的默认设置。在这里,管理员必须为每个加密的私钥文件手动输入密码短语。因为可以配置很多启用SSL的虚拟主机,所以使用以下重用方案来最小化对话:当私钥文件被加密时,尝试所有已知的密码短语(当然在开始时没有) 。如果其中一个已知密码短语成功,则不会弹出此特定密钥文件的对话框。如果没有成功,则在终端上查询另一个密码短语,并记住下一轮(也许可以重新使用)。
这个方案允许mod_ssl具有最大的灵活性(因为对于N个加密的私钥文件,你可以使用N个不同的密码短语 - 当然你必须输入所有的密码短语),同时最小化终端对话框(例如,当你使用单一的通行证所有N个私人密钥文件的短语,这个密码短语只查询一次)。
|/path/to/program [args...]
这种模式允许使用一个外部程序作为一个管道到一个特定的输入设备; 程序将发送用于该
builtin
模式 的标准提示文本stdin
,并且预计将写入密码字符串stdout
。如果需要输入多个密码(或者输入了不正确的密码),则在第一个密码被返回之后将会写入额外的提示文本,然后必须写回更多的密码。exec:/path/to/program
这里配置一个外部程序,在启动时调用每个加密的私钥文件。它被称为两个参数(第一个是“`
servername:portnumber
”,第二个是“`RSA
”,``DSA
“或”`ECC
“),它们表示要打印哪个服务器和算法相应的密码短语stdout
。目的是这个外部程序首先运行安全检查,以确保系统不受攻击者的威胁,并且只有当这些检查通过成功,它才提供密码短语。这些安全检查和密码短语的确定方式都可以像你喜欢的那样复杂。Mod_ssl只是定义了接口:一个提供Pass Phrase的可执行程序
stdout
。没有更多或更少!所以,如果你对安全性非常偏执,这是你的界面。还有其他任何事情都必须作为练习留给管理员,因为当地的安全要求是如此不同。上面的重用算法也在这里使用。换句话说:每个唯一的密码短语仅调用一次外部程序。
例
SSLPassPhraseDialog exec:/usr/local/apache/sbin/pp-filter
SSLProtocol 指令
描述: | 配置可用的SSL协议风格 |
---|---|
句法: | SSLProtocol [+|-]protocol ... |
默认: | SSLProtocol all |
语境: | 服务器配置,虚拟主机 |
覆盖: | 选项 |
状态: | 延期 |
模块: | 了mod_ssl |
该指令可用于控制mod_ssl在建立服务器环境时应使用的SSL协议风格。客户端只能连接一个提供的协议。
可用的(不区分大小写的)协议是:
SSLv2
这是安全套接字层(SSL)协议,版本2.0。它是由Netscape Corporation设计的原始SSL协议。虽然它的使用已被废弃,因为该协议的安全性的弱点。
SSLv3
这是来自Netscape Corporation的安全套接字层(SSL)协议3.0版。它是SSLv2的继任者,也是TLSv1的前身。几乎所有流行的浏览器都支持它。
TLSv1
这是传输层安全(TLS)协议,版本1.0。它是SSLv3的继承者,在RFC 2246中进行了定义 。
TLSv1.1
(使用OpenSSL 1.0.1及更高版本时)RFC 4346中 定义的TLS 1.0协议的修订版本 。
TLSv1.2
(使用OpenSSL 1.0.1及更高版本时)RFC 5246中 定义的TLS 1.1协议的修订 。
All
这是```
+SSLv2 +SSLv3 +TLSv1
'或者 - 当使用OpenSSL 1.0.1及更高版本时的快捷方式- “`+SSLv2 +SSLv3 +TLSv1 +TLSv1.1 +TLSv1.2
”。
例
# enable SSLv3 and all available TLSv1 flavors, but not SSLv2
SSLProtocol All -SSLv2
SSLProxyCACertificateFile 指令
描述: | 用于远程服务器验证的连接的PEM编码的CA证书的文件 |
---|---|
句法: | SSLProxyCACertificateFile file-path |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
该指令设置了一体式文件,您可以在该文件中组装已处理远程服务器的证书颁发机构证书(CA)。这些用于远程服务器身份验证。这样的文件就是各种PEM编码证书文件的串联,按照优先顺序。这可以替代地和/或另外地使用 SSLProxyCACertificatePath
。
例
SSLProxyCACertificateFile /usr/local/apache2/conf/ssl.crt/ca-bundle-remote-server.crt
SSLProxyCACertificatePath 指令
描述: | 远程服务器认证的PEM编码的CA证书目录 |
---|---|
句法: | SSLProxyCACertificatePath directory-path |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
该指令设置您保存其所处理的远程服务器的证书颁发机构证书(CA)的目录。这些用于验证远程服务器身份验证上的远程服务器证书。
这个目录中的文件必须是PEM编码的,并通过哈希文件名来访问。所以通常你不能把证书文件放在那里:你还必须创建名为散列值的符号链接 .N
。你应该确保这个目录包含适当的符号链接。
例
SSLProxyCACertificatePath /usr/local/apache2/conf/ssl.crt/
SSLProxyCARevocationFile 指令
描述: | 用于远程服务器身份验证的级联PEM编码的CA CRL文件 |
---|---|
句法: | SSLProxyCARevocationFile file-path |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
该指令设置了一体式文件,您可以在其中组装证书吊销列表(CRL)的证书颁发机构(CA)的远程服务器处理。这些用于远程服务器身份验证。这样的文件就是各种PEM编码的CRL文件的串联,按照优先顺序。这可以替代地和/或另外地使用SSLProxyCARevocationPath
。
例
SSLProxyCARevocationFile /usr/local/apache2/conf/ssl.crl/ca-bundle-remote-server.crl
SSLProxyCARevocationPath 指令
描述: | 远程服务器身份验证的PEM编码的CA CRL目录 |
---|---|
句法: | SSLProxyCARevocationPath directory-path |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
此指令设置保存您所处理的远程服务器的证书颁发机构(CA)的证书吊销列表(CRL)的目录。这些用于撤消远程服务器身份验证上的远程服务器证书。
这个目录中的文件必须是PEM编码的,并通过哈希文件名来访问。所以通常你不仅要把CRL文件放在那里。另外,您必须创建名为哈希值的符号链接 .rN
。你应该确保这个目录包含适当的符号链接。
例
SSLProxyCARevocationPath /usr/local/apache2/conf/ssl.crl/
SSLProxyCheckPeerCN 指令
描述: | 是否检查远程服务器证书CN字段 |
---|---|
句法: | SSLProxyCheckPeerCN on|off |
默认: | SSLProxyCheckPeerCN off |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
该指令设置是否将远程服务器证书CN字段与请求URL的主机名进行比较。如果两者不相等,则发送502状态码(错误网关)。
例
SSLProxyCheckPeerCN on
SSLProxyCheckPeerExpire 指令
描述: | 是否检查远程服务器证书是否过期 |
---|---|
句法: | SSLProxyCheckPeerExpire on|off |
默认: | SSLProxyCheckPeerExpire off |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
该指令设置是否检查远程服务器证书是否过期。如果检查失败,则发送502状态码(错误网关)。
例
SSLProxyCheckPeerExpire on
SSLProxyCipherSuite 指令
描述: | 密码套件可用于SSL代理握手协商 |
---|---|
句法: | SSLProxyCipherSuite cipher-spec |
默认: | SSLProxyCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP |
语境: | 服务器配置,虚拟主机,目录,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | 了mod_ssl |
相当于SSLCipherSuite
,但代理连接。请参阅SSLCipherSuite
附加信息。
SSLProxyEngine 指令
描述: | SSL代理引擎操作开关 |
---|---|
句法: | SSLProxyEngine on|off |
默认: | SSLProxyEngine off |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
该指令切换代理的SSL / TLS协议引擎的使用。这通常在一<VirtualHost>
节中使用,以便在特定的虚拟主机中启用代理使用的SSL / TLS。默认情况下,对于主服务器和所有配置的虚拟主机,SSL / TLS协议引擎都被禁用。
请注意,SSLProxyEngine指令通常不应包含在将用作转发代理的虚拟主机中(使用<Proxy>或<ProxyRequest>指令。SSLProxyEngine不需要启用转发代理服务器来代理SSL / TLS请求。
例
<VirtualHost _default_:443>
SSLProxyEngine on
...
</VirtualHost>
SSLProxyMachineCertificateChainFile 指令
描述: | 连接的PEM编码CA证书的文件,供代理用于选择证书 |
---|---|
句法: | SSLProxyMachineCertificateChainFile filename |
语境: | 服务器配置 |
覆盖: | 不适用 |
状态: | 延期 |
模块: | 了mod_ssl |
兼容性: | 在Apache 2.2.23及更高版本中可用 |
该指令设置所有在一起的文件,在那里为所有使用的客户机证书保留证书链。如果远程服务器提供的CA证书列表不是所配置的客户端证书之一的直接签名者,则需要此指令。
这个引用的文件就是各种PEM编码证书文件的串联。启动后,将检查每个配置的客户端证书,并建立一个信任链。
安全警告
如果启用此指令,文件中的所有证书都将被信任,就好像它们也在 SSLProxyCACertificateFile
。
例
SSLProxyMachineCertificateChainFile /usr/local/apache2/conf/ssl.crt/proxyCA.pem
SSLProxyMachineCertificateFile 指令
描述: | 连接的PEM编码的客户端证书文件和代理使用的密钥 |
---|---|
句法: | SSLProxyMachineCertificateFile filename |
语境: | 服务器配置 |
覆盖: | 不适用 |
状态: | 延期 |
模块: | 了mod_ssl |
该指令设置了将所有用于代理服务器验证的证书和密钥保存到远程服务器的一体化文件。
这个引用的文件就是各种PEM编码证书文件的串联,按照优先顺序排列。或者或另外使用这个指令SSLProxyMachineCertificatePath
。
目前不支持加密的私钥
例
SSLProxyMachineCertificateFile /usr/local/apache2/conf/ssl.crt/proxy.pem
SSLProxyMachineCertificatePath 指令
描述: | PEM编码的客户端证书和代理使用的密钥的目录 |
---|---|
句法: | SSLProxyMachineCertificatePath directory |
语境: | 服务器配置 |
覆盖: | 不适用 |
状态: | 延期 |
模块: | 了mod_ssl |
该指令设置您将用于对代理服务器进行身份验证的证书和密钥保存到远程服务器的目录。
这个目录中的文件必须是PEM编码的,并通过哈希文件名来访问。另外,您必须创建名为的符号链接 hash-value.N
。你应该确保这个目录包含适当的符号链接。
目前不支持加密的私钥
例
SSLProxyMachineCertificatePath /usr/local/apache2/conf/proxy.crt/
SSLProxyProtocol 指令
描述: | 为代理使用配置可用的SSL协议风格 |
---|---|
句法: | SSLProxyProtocol [+|-]protocol ... |
默认: | SSLProxyProtocol all |
语境: | 服务器配置,虚拟主机 |
覆盖: | 选项 |
状态: | 延期 |
模块: | 了mod_ssl |
此指令可用于控制mod_ssl在建立其代理服务器环境时应使用的SSL协议风格。它只会使用提供的协议之一连接到服务器。
请参阅SSLProtocol
附加信息。
SSLProxyVerify 指令
描述: | 远程服务器的类型证书验证 |
---|---|
句法: | SSLProxyVerify level |
默认: | SSLProxyVerify none |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
将代理配置为将请求转发到远程SSL服务器时,可以使用此指令来配置远程服务器的证书验证。
请注意,即使启用了证书验证, mod_ssl
也不会检查commonName
服务器证书的(主机名)属性是否 与用于连接到服务器的主机名相匹配。换句话说,代理不能保证到后端服务器的SSL连接是“安全的”,而不是证书由使用SSLProxyCACertificatePath
和/或 SSLProxyCACertificateFile
指令配置的CA之一签署的事实 。为了完成这个检查,请查看 SSLProxyCheckPeerCN
和 SSLProxyCheckPeerExpire
默认关闭的指令。
以下级别可用于级别:
- none:不需要远程服务器证书是必需的
- 可选:远程服务器可以提供有效的证书
- 要求:远程服务器必须提供有效的证书
- optional_no_ca:远程服务器可以提供有效的证书,
但不需要(成功)验证。
在实践中,只有级别none和 require是非常有趣的,因为level optional不适用于所有服务器和级别 optional_no_ca实际上违背了认证的思想(但可以用来建立SSL测试页面等)
例
SSLProxyVerify require
SSLProxyVerifyDepth 指令
描述: | 远程服务器证书验证中CA证书的最大深度 |
---|---|
句法: | SSLProxyVerifyDepth number |
默认: | SSLProxyVerifyDepth 1 |
语境: | 服务器配置,虚拟主机 |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | 了mod_ssl |
该指令设置了mod_ssl在确定远程服务器没有有效证书之前应该验证的深度。
深度实际上是中间证书颁发者的最大数量,即验证远程服务器证书时最大允许遵循的CA证书的数量。深度为0表示仅接受自签名的远程服务器证书,默认深度为1意味着远程服务器证书可以是自签名的,或者必须由服务器直接知晓的CA签名(即CA的证书在SSLProxyCACertificatePath
)等等
例
SSLProxyVerifyDepth 10
SSLRandomSeed 指令
描述: | 伪随机数发生器(PRNG)播种源 |
---|---|
句法: | SSLRandomSeed context source [bytes] |
语境: | 服务器配置 |
状态: | 延期 |
模块: | 了mod_ssl |
这在启动时(上下文是 startup
)和/或就在建立新的SSL连接(上下文是connect
)之前配置一个或多个在OpenSSL中为伪随机数生成器(PRNG)播种的源。该指令只能在全局服务器上下文中使用,因为PRNG是全局工具。
以下源代码版本可用:
builtin
这是始终可用的内置播种源。它的使用在运行时消耗最少的CPU周期,因此可以始终使用,没有缺点。用于播种PRNG的源包含当前时间,当前进程ID和(当适用时)Apache的进程间记分板结构的随机选择的1KB摘录。缺点是,这不是一个强大的来源,并在启动时(记分牌仍然不可用),这个来源只产生几个字节的熵。所以你应该至少在启动时使用额外的播种源。
file:/path/to/source
该变体使用外部文件
/path/to/source
作为种子PRNG的源。当字节被指定时,只有第一个字节的文件的字节数形成熵(和 字节被提供给/path/to/source
作为第一个参数)。当字节未被指定时,整个文件形成熵(并且0
被赋予/path/to/source
作为第一个参数)。尤其是在启动时使用它,例如使用可用/dev/random
和/或/dev/urandom
设备(通常存在于FreeBSD和Linux等现代Unix衍生产品中)。但要小心:通常
/dev/random
只提供与实际相同的熵数据,即当您请求512字节的熵时,但设备当前只有100个字节可用,则可能发生两件事:在某些平台上,只有100个字节处于打开状态其他平台的读取块直到有足够的字节可用(可能需要很长时间)。这里使用现有/dev/urandom
的更好,因为它永远不会阻塞,并且实际上提供了所需的数据量。缺点是收到的数据质量可能不是最好的。在一些像FreeBSD这样的平台上,甚至可以控制熵是如何产生的,即由哪个系统中断。在这些平台上,可以在rndcontrol(8)下找到更多细节。或者,当你的系统缺少这样一个随机设备时,你可以使用像EGD (Entropy Gathering Daemon)这样的工具,并运行它的客户端程序
exec:/path/to/program/
(参见下文)或使用egd:/path/to/egd-socket
(见下文)。exec:/path/to/program
该变体使用外部可执行文件
/path/to/program
作为种子PRNG的源。当指定字节时,只有其内容字节的第一个 字节数stdout
形成熵。当没有指定字节时,整个数据就stdout
形成了熵。只有在启动的时候才需要使用它,当你需要一个非常强大的种子在外部程序的帮助下(例如在上面的例子中,truerand
你可以在mod_ssl发行版本中找到该实用程序,该发行版基于AT&T的 truerand图书馆)。当然,在连接上下文中使用这个过于缓慢,服务器速度太快了。所以通常你应该避免在这种情况下使用外部程序。egd:/path/to/egd-socket
(仅适用于Unix)该变体使用外部熵收集守护程序(EGD)的Unix域套接字(请参见http://www.lothar.com/tech/crypto/)来种子PRNG。如果您的平台上没有随机设备,请使用此选项。
例
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
SSLRenegBufferSize 指令
描述: | 设置SSL重新协商缓冲区的大小 |
---|---|
句法: | SSLRenegBufferSize bytes |
默认: | SSLRenegBufferSize 131072 |
语境: | 目录,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | 了mod_ssl |
如果在每个位置上下文中需要SSL重新协商,例如,SSLVerifyClient
在目录或位置块中的任何使用,则mod_ssl
必须将任何HTTP请求主体缓冲到内存中,直到可以执行新的SSL握手为止。该指令可用于设置将用于此缓冲区的内存量。
请注意,在许多配置中,发送请求主体的客户端将不可信,因此在更改此配置设置时,必须考虑由消耗内存导致的拒绝服务攻击。
例
SSLRenegBufferSize 262144
SSLRequire 指令
描述: | 仅当任意复杂的布尔表达式为真时才允许访问 |
---|---|
句法: | SSLRequire expression |
语境: | 目录,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | 了mod_ssl |
该指令规定了一个通用访问要求,为了允许访问,必须满足这个要求。这是一个非常强大的指令,因为需求规格是一个任意复杂的布尔表达式,包含任意数量的访问检查。
执行SSLRequire
不是线程安全的。在线程MPM中使用SSLRequire
内部.htaccess
文件可能会导致随机崩溃。
的表达式必须以下语法(给出作为BNF语法表示法)匹配:
expr :: =“ true ”| “ 假 ” | “ ! ”表达式 | expr“ && ”expr | expr“ || ”expr | “ ( ”expr“ ) ” | 补偿 comp :: = word“ == ”word | 单词“ eq ”一词 | 单词“ != ”单词| 单词“ ne ”一词 | 字“ < ”字| 字“ lt ”字 | 单词“ <= ”单词| 词“ 乐 ”字 | 单词“ > ”单词| 词“ gt ”字 | 单词“ > = ”单词| 字“ ge ”字 | 单词“ in ”“ { ”wordlist“ } ” | 单词“ in ”“ OID( ”单词“ ) ” | 字“ =〜 ”正则表达式 | 字“ !〜 ”正则表达式 wordlist :: =单词 | 单词表“ , ”单词 字:: =数字 | CString的 | 变量 | 功能 digit :: = [0-9] + cstring :: =“...” variable :: =“ %{ ”varname“ } ” function :: = funcname“ ( ”funcargs“ ) ”
而varname
来自表3的任何变量都可以使用。最后提供 funcname
以下功能:
file(
文件名)
这个函数接受一个字符串参数并扩展到文件的内容。这对匹配正则表达式等内容特别有用。
请注意,表达式首先被解析为内部机器表示,然后在第二步中进行评估。实际上,在Global和Per-Server Class中,上下文表达式在启动时被解析,而在运行时只有机器表示被执行。对于Per-Directory上下文,特别是在.htaccess上下文中,这是不同的:这里 表达式必须被解析并且对每个请求立即执行。
例
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:标题名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:变量名称 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 SSL_TLS_SNI
SSLRequireSSL 指令
描述: | SSL未用于HTTP请求时拒绝访问 |
---|---|
句法: | SSLRequireSSL |
语境: | 目录,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | 了mod_ssl |
该指令禁止访问,除非为当前连接启用了HTTP over SSL(即HTTPS)。这在启用了SSL的虚拟主机或目录内非常方便,可以防范出现应该受保护的配置错误。当这个指令出现时,所有拒绝使用SSL的请求都被拒绝。
例
SSLRequireSSL
SSLSessionCache 指令
描述: | 全局/进程间SSL会话缓存的类型 |
---|---|
句法: | SSLSessionCache type |
默认: | SSLSessionCache none |
语境: | 服务器配置 |
状态: | 延期 |
模块: | 了mod_ssl |
这将配置全局/进程间SSL会话缓存的存储类型。这个缓存是一个可选的工具,可以加速并行请求处理。对于对同一服务器进程的请求(通过HTTP保持活动),OpenSSL已经在本地缓存了SSL会话信息。但是,由于现代客户通过并行请求(通常最多4个并行请求是常见的)请求内联图像和其他数据,这些请求由 不同的预分叉服务器进程提供服务。这里进程间缓存有助于避免不必要的会话握手。
目前支持 以下四种存储类型:
none
这会禁用全局/进程间会话缓存。这将导致明显的速度损失,并且如果使用某些浏览器,可能会导致问题,特别是如果启用了客户端证书。不建议使用此设置。
nonenotnull
这会禁用任何全局/进程间会话缓存。然而,它强制OpenSSL发送一个非空的会话ID,以适应需要的客户端。
dbm:/path/to/datafile
这使用本地磁盘上的DBM散列文件来同步服务器进程的本地OpenSSL内存缓存。这个会话缓存在高负载下可能会遇到可靠性问题。
shm:/path/to/datafile
[(
size)
]这使得RAM(通过建立)中的共享内存段内的高性能循环缓冲区(大小约为字节大小
/path/to/datafile
)来同步服务器进程的本地OpenSSL内存缓存。这是推荐的会话缓存。dc:UNIX:/path/to/socket
这使用distcache分布式会话缓存库。参数应使用distcache地址语法指定要使用的服务器或代理的位置; 例如,
UNIX:/path/to/socket
指定一个UNIX域套接字(通常是本地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 |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
兼容性: | 也适用于Apache 2.2.28及更高版本中的RFC 5077 TLS会话恢复 |
该指令为存储在全局/进程间SSL会话缓存,OpenSSL内部缓存以及TLS会话恢复(RFC 5077)恢复的会话中的信息设置超时时间(以秒为单位)。对于测试,它可以设置为15,但在实际生活中应该设置为更高的值,例如300。
例
SSLSessionCacheTimeout 600
SSLSessionTicketKeyFile 指令
描述: | TLS会话票据的持久加密/解密密钥 |
---|---|
句法: | SSLSessionTicketKeyFile file-path |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
兼容性: | 在httpd 2.2.30及更高版本中可用,如果使用OpenSSL 0.9.8h或更高版本 |
根据RFC 5077的定义,可选择配置一个密钥来加密和解密TLS会话票据 。主要适用于TLS会话信息应该在多个节点之间共享的群集环境。对于单实例httpd设置,建议不要配置票证密钥文件,而是在启动时依赖由mod_ssl生成的(随机)密钥。
票证密钥文件必须包含48个字节的随机数据,最好由高熵源创建。在基于Unix的系统上,可以如下创建票据密钥文件:
dd if=/dev/random of=/path/to/file.tkey bs=1 count=48
票据密钥应该经常旋转(替换),因为这是使现有会话票证失效的唯一方法 - OpenSSL当前不允许指定票据生存期的限制。重新启动Web服务器后,只能使用新票证密钥。所有现有的会话票证在重新启动后都会失效。
票证密钥文件包含敏感的密钥材料,应使用类似于所使用的文件许可权来保护 SSLCertificateKeyFile
。
SSLSessionTickets 指令
描述: | 启用或禁用TLS会话票证的使用 |
---|---|
句法: | SSLSessionTickets on|off |
默认: | SSLSessionTickets on |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
兼容性: | 在httpd 2.2.30及更高版本中可用,如果使用OpenSSL 0.9.8f或更高版本。 |
该指令允许启用或禁用TLS会话票证(RFC 5077)的使用。
TLS会话票据默认启用。使用它们而不必以适当的频率(例如每天)重新启动web服务器就可以实现完美的前向保密。
SSLStrictSNIVHostCheck 指令
描述: | 是否允许非SNI客户端访问基于名称的虚拟主机。 |
---|---|
句法: | SSLStrictSNIVHostCheck on|off |
默认: | SSLStrictSNIVHostCheck off |
语境: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | 了mod_ssl |
兼容性: | 在Apache 2.2.12和更高版本中可用 |
该指令设置是否允许非SNI客户端访问基于名称的虚拟主机。如果设置为on
基于非默认名称的虚拟主机,则不允许非SNI客户端访问此特定的虚拟主机。如果设置为on
基于默认名称的虚拟主机,则不允许非SNI客户端访问属于此IP /端口组合的任何基于名称的虚拟主机。
这个选项只有在httpd是针对支持SNI的版本的OpenSSL进行编译时才可用。
例
SSLStrictSNIVHostCheck on
SSLUserName 指令
描述: | 变量名确定用户名 |
---|---|
句法: | SSLUserName varname |
语境: | 服务器配置,目录,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | 了mod_ssl |
兼容性: | 在Apache 2.0.51和更高版本中可用 |
该指令在Apache请求对象中设置“user”字段。这由较低的模块用字符串标识用户。特别是,这可能会导致环境变量 REMOTE_USER
被设置。该VARNAME可以是任何的SSL环境变量。
请注意,如果使用该FakeBasicAuth
选项,则此伪指令不起作用 (请参阅SSLOptions)。
例
SSLUserName SSL_CLIENT_S_DN_CN
SSLVerifyClient 指令
描述: | 客户证书类型验证 |
---|---|
句法: | SSLVerifyClient level |
默认: | SSLVerifyClient none |
语境: | 服务器配置,虚拟主机,目录,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | 了mod_ssl |
此伪指令为客户端身份验证设置证书验证级别。注意这个指令可以用在每个服务器和每个目录的上下文中。在每服务器上下文中,它适用于在建立连接时在标准SSL握手中使用的客户端身份验证过程。在每个目录上下文中,在HTTP请求被读取之后但在发送HTTP响应之前,它强制使用重新配置的客户端验证级别的SSL重新协商。
以下级别可用于级别:
- none:没有客户证书是必需的
- 可选:客户可以出示有效的证书
- 要求:客户必须出示有效的证书
- optional_no_ca:客户可以提供有效的证书,
但不需要(成功)可验证。
在实践中,只有级别none和 require是非常有趣的,因为level 可选不适用于所有的浏览器和级别 optional_no_ca实际上违背了认证的思想(但可以用来建立SSL测试页面等)
例
SSLVerifyClient require
SSLVerifyDepth 指令
描述: | 客户端证书验证中CA证书的最大深度 |
---|---|
句法: | SSLVerifyDepth number |
默认: | SSLVerifyDepth 1 |
语境: | 服务器配置,虚拟主机,目录,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | 了mod_ssl |
这个指令设置mod_ssl在确定客户端没有有效的证书之前应该验证的深度。注意这个指令可以用在每个服务器和每个目录的上下文中。在每服务器上下文中,它适用于在建立连接时在标准SSL握手中使用的客户端身份验证过程。在每个目录上下文中,在HTTP请求被读取之后但在HTTP响应被发送之前,它强制使用重新配置的客户端验证深度的SSL重新协商。
深度实际上是中间证书颁发者的最大数量,即验证客户端证书时最大允许遵循的CA证书的数量。深度为0表示仅接受自签名客户端证书,默认深度为1意味着客户端证书可以是自签名的,或者必须由服务器直接知道的CA签名(即,CA的证书是下SSLCACertificatePath
)等
例
SSLVerifyDepth 10