mod_ssl
描述: | 使用安全套接字层(SSL)和传输层安全性(TLS)协议的强加密技术 |
状态: | 延期 |
模块标识符: | ssl_module |
源文件: | mod_ssl.c |
摘要
此模块为 Apache HTTP Server 提供 SSL v3 和 TLS v1.x 支持。不再支持 SSL v2。
该模块依赖于OpenSSL来提供加密引擎。
SSL 文档中提供了更多详细信息,讨论和示例。
环境变量
可以将此模块配置为向 SSI 和 CGI 命名空间提供若干 SSL 信息项作为附加环境变量。出于性能原因,默认情况下不提供此信息。(参见SSLOptions
StdEnvVars,below.)生成的变量列在下面的 table 中。为了向后兼容,可以使用不同的名称提供信息。请查看兼容性章节以获取有关兼容性变量的详细信息。
变量名: | 值类型: | 描述: |
HTTPS | 旗 | 正在使用 HTTPS。 |
SSL_PROTOCOL | string | SSL 协议 version(SSLv3,TLSv1,TLSv1.1,TLSv1.2) |
SSL_SESSION_ID | string | hex-encoded SSL session id |
SSL_SESSION_RESUMED | string | 初始或恢复 SSL Session。注意:如果正在使用 HTTP KeepAlive,则可以在相同(初始或已恢复)SSL session 上提供多个请求 |
SSL_SECURE_RENEG | string | true 如果支持安全重新协商,否则false |
SSL_CIPHER | string | 密码规范 name |
SSL_CIPHER_EXPORT | string | true 如果密码是 export 密码 |
SSL_CIPHER_USEKEYSIZE | 数 | 密码位数(实际使用) |
SSL_CIPHER_ALGKEYSIZE | 数 | 密码位数(可能) |
SSL_COMPRESS_METHOD | string | 协商的 SSL 压缩方法 |
SSL_VERSION_INTERFACE | string | mod_ssl 程序 version |
SSL_VERSION_LIBRARY | string | OpenSSL 程序 version |
SSL_CLIENT_M_VERSION | string | client 证书的 version |
SSL_CLIENT_M_SERIAL | string | client 证书的序列号 |
SSL_CLIENT_S_DN | string | client 证书中的主题 DN |
SSL_CLIENT_S_DN_ x509 | string | client 的主题 DN 的 Component |
SSL_CLIENT_SAN_Email_ n | string | Client 证书的 subjectAltName 类型为 rfc822Name 的扩展条目 |
SSL_CLIENT_SAN_DNS_ n | string | Client 证书的 subjectAltName 类型为 dNSName 的扩展条目 |
SSL_CLIENT_SAN_OTHER_msUPN_ n | string | Client 证书的 subjectAltName 类型为 otherName 的扩展条目,Microsoft User Principal Name 表单(OID 1.3.6.1.4.1.311.20.2.3) |
SSL_CLIENT_I_DN | string | 颁发者 client 证书的 DN |
SSL_CLIENT_I_DN_ x509 | string | client 的 Issuer DN 的 Component |
SSL_CLIENT_V_START | string | client 证书的有效期(start time) |
SSL_CLIENT_V_END | string | client 证书的有效期(结束 time) |
SSL_CLIENT_V_REMAIN | string | client 证书过期前的天数 |
SSL_CLIENT_A_SIG | string | 用于签署 client 证书的算法 |
SSL_CLIENT_A_KEY | string | 用于 client 证书的 public key 的算法 |
SSL_CLIENT_CERT | string | PEM-encoded client 证书 |
SSL_CLIENT_CERT_CHAIN_ n | string | client 证书链中的 PEM-encoded 证书 |
SSL_CLIENT_CERT_RFC4523_CEA | string | 证书的序列号和颁发者。格式与 RFC4523 中的 CertificateExactAssertion 格式相匹配 |
SSL_CLIENT_VERIFY | string | NONE ,SUCCESS ,GENEROUS 或FAILED: 原因 |
SSL_SERVER_M_VERSION | string | version 服务器证书 |
SSL_SERVER_M_SERIAL | string | 服务器证书的序列号 |
SSL_SERVER_S_DN | string | 服务器证书中的主题 DN |
SSL_SERVER_SAN_Email_ n | string | 服务器证书的 subjectAltName 扩展条目类型为 rfc822Name |
SSL_SERVER_SAN_DNS_ n | string | 服务器证书的 subjectAltName 类型为 dNSName 的扩展条目 |
SSL_SERVER_SAN_OTHER_dnsSRV_ n | string | 服务器证书的 subjectAltName 扩展条目类型为 otherName,SRVName 形式(OID 1.3.6.1.5.5.7.8.7,RFC 4985) |
SSL_SERVER_S_DN_ x509 | string | 服务器主题 DN 的组件 |
SSL_SERVER_I_DN | string | 服务器证书的颁发者 DN |
SSL_SERVER_I_DN_ x509 | string | 服务器的 Issuer DN 的组件 |
SSL_SERVER_V_START | string | 服务器证书的有效性(start time) |
SSL_SERVER_V_END | string | 服务器证书的有效期(结束 time) |
SSL_SERVER_A_SIG | string | 用于签名服务器证书的算法 |
SSL_SERVER_A_KEY | string | 用于服务器证书的 public key 的算法 |
SSL_SERVER_CERT | string | PEM-encoded 服务器证书 |
SSL_SRP_USER | string | SRP 用户名 |
SSL_SRP_USERINFO | string | SRP 用户信息 |
SSL_TLS_SNI | string | SNI TLS 扩展的内容(如果随 ClientHello 提供) |
x509 指定 X.509 DN 的 component;C,ST,L,O,OU,CN,T,I,G,S,D,UID,Email
之一。在 httpd 2.2.0 和更高版本中,x509 还可能包含数字_n
后缀。如果相关 DN 包含相同 name 的多个属性,则此后缀将用作 zero-based 索引以选择特定属性。对于 example,服务器证书主题 DN 包含两个 OU 属性,SSL_SERVER_S_DN_OU_0
和SSL_SERVER_S_DN_OU_1
可用于 reference 每个。没有_n
后缀的变量 name 等同于具有_0
后缀的 name;第一个(或唯一的)属性。当使用SSLOptions指令的StdEnvVars
选项填充环境 table 时,任何 DN 的第一个(或唯一)属性仅在 non-suffixed name 下添加; i.e。没有添加_0
后缀条目。
在 httpd 2.4.32 和更高版本中,可以在 DN component 中向 x509 添加可选的_RAW 后缀,以禁止将属性 value 转换为 UTF-8。必须将其放在索引后缀(如果有)之后。例如,可以使用SSL_SERVER_S_DN_OU_RAW
或SSL_SERVER_S_DN_OU_0_RAW
。
Apache HTTPD 2.3.11 中* _DN 变量的格式已更改。有关详细信息,请参阅SSLOptions选项以获取SSLOptions。
SSL_CLIENT_V_REMAIN
仅在 version 2.1 及更高版本中可用。
许多其他环境变量也可用于SSLRequire
表达式或自定义 log 格式:
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 THE_REQUEST SERVER_NAME TIME_MIN REQUEST_FILENAME SERVER_PORT TIME_SEC REQUEST_METHOD SERVER_PROTOCOL TIME_WDAY REQUEST_SCHEME REMOTE_ADDR TIME REQUEST_URI REMOTE_USER
在这些上下文中,还可以使用两种特殊格式:
ENV:variablename
这将扩展到标准环境变量 variablename。HTTP:headername
这将使用 name headername 扩展到请求标头的 value。
自定义 Log 格式
当mod_ssl内置到 Apache 或至少加载时(在 DSO 情况下),mod_log_config的自定义 Log 格式存在其他函数。首先还有一个额外的```+101+``+102+`''eXtension 格式 function,它可用于扩展任何模块提供的任何变量,尤其是 mod_ssl 提供的变量,你可以在上面的 table 中找到它们。
为了向后兼容,还提供了一个特殊的```+103+``+104+`''加密格式 function。有关此 function 的信息在兼容性章节中提供。
例
CustomLog "logs/ssl_request_log" "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x "%r" %b"
这些格式甚至可以在不设置SSLOptions指令的StdEnvVars
选项的情况下工作。
请求备注
mod_ssl sets“注释”可以在 log中使用%{name}n
格式 string 的 log中使用的请求。
支持的说明如下:
ssl-access-forbidden
如果由于 SSLRequire 或 SSLRequireSSL 指令而拒绝访问,则此注释将设置为 value 1。ssl-secure-reneg
如果 mod_ssl 是针对支持安全重新协商扩展的 OpenSSL 的 version 构建的,则如果 SSL 用于当前连接,则此注释将设置为 value 1,client 也支持安全重新协商扩展。如果 client 不支持安全重新协商扩展,则将注释设置为 value 0.如果 mod_ssl 不是针对支持安全重新协商的 OpenSSL 的 version 构建的,或者如果当前连接未使用 SSL,则说明为没有设置。
表达式解析器扩展
当mod_ssl内置到 Apache 或至少加载时(在 DSO 情况下)mod_ssl提供的任何变量都可以在ap_expr Expression Parser的表达式中使用。可以使用语法`%{` varname `}`''. Starting with version 2.4.18 one can also use the[mod_rewrite](mod-mod_rewrite.html)style syntax
%{SSL:
varname }
''或 function 样式语法+130+
+131+`'来引用变量。
Example(使用 modheaders)
Header set X-SSL-PROTOCOL "expr=%{SSL_PROTOCOL}" Header set X-SSL-CIPHER "expr=%{SSL:SSL_CIPHER}"
这个 feature 甚至可以在不设置SSLOptions指令的StdEnvVars
选项的情况下工作。
与 Require 一起使用的授权提供程序
mod_ssl提供了一些身份验证提供程序,用于mod_authz_core的要求指令。
需要 ssl
如果连接未使用 SSL 加密,ssl
提供程序将拒绝访问。这类似于SSLRequireSSL
指令。
Require ssl
要求 ssl-verify-client
如果用户使用有效的 client 证书进行身份验证,则ssl
提供程序允许访问。这仅在SSLVerifyClient optional
生效时才有用。
如果用户使用 client 证书或用户名和密码对用户进行身份验证,则以下 example 将授予访问权限。
Require ssl-verify-client Require valid-user
SSLCACertificateFile 指令
描述: | Client Auth 的串联 PEM-encoded CA 证书文件 |
句法: | SSLCACertificateFile file-path |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
该指令设置 all-in-one 文件,您可以在其中汇编您处理的客户端的证书证书 Authorities(CA)。这些用于 Client 身份验证。这样的文件只是各种 PEM-encoded Certificate files 的串联,按优先顺序排列。除了SSLCACertificatePath之外,这可以另外 and/or 使用。
例
SSLCACertificateFile "/usr/local/apache2/conf/ssl.crt/ca-bundle-client.crt"
SSLCACertificatePath 指令
描述: | Client Auth 的 PEM-encoded CA 证书目录 |
句法: | SSLCACertificatePath directory-path |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
此指令设置保存您所处理的客户端的认证证书 Authorities(CA)的目录。这些用于验证 Client 身份验证上的 client 证书。
此目录中的 files 必须为 PEM-encoded,并通过哈希文件名进行访问。所以通常你不能只将 Certificate files 放在那里:你还必须创建名为 hash-value .N
的符号链接。并且您应始终确保此目录包含相应的符号链接。
例
SSLCACertificatePath "/usr/local/apache2/conf/ssl.crt/"
SSLCADNRequestFile 指令
描述: | 用于定义可接受的 CA 名称的串联 PEM-encoded CA 证书的文件 |
句法: | SSLCADNRequestFile file-path |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
当 mod_ssl 请求 client 证书时,可以在 SSL 握手中向 client 发送可接受的 Certificate Authority 名称列表。 client 可以使用这些 CA 名称从适当的 client 证书中选择适当的 client 证书。
如果没有给出指令SSLCADNRequestPath或SSLCADNRequestFile,则发送给 client 的可接受 CA 名称集合是SSLCACertificateFile和SSLCACertificatePath指令给出的所有 CA 证书的名称;换句话说,实际用于验证 client 证书的 CA 的名称。
在某些情况下,能够发送一组可接受的 CA 名称与用于验证 client 证书的实际 CA 不同是很有用的-例如,如果 client 证书由中间 CA 签名。在这种情况下,可以使用SSLCADNRequestPath and/or SSLCADNRequestFile;然后从这对指令指定的目录 and/or 文件中的完整证书集中获取可接受的 CA 名称。
SSLCADNRequestFile必须指定包含 PEM-encoded CA 证书串联的 all-in-one 文件。
例
SSLCADNRequestFile "/usr/local/apache2/conf/ca-names.crt"
SSLCADNRequestPath 指令
描述: | 用于定义可接受的 CA 名称的 PEM-encoded CA 证书目录 |
句法: | SSLCADNRequestPath directory-path |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
此可选指令可用于指定在请求 client 证书时将发送到 client 的可接受 CA 名称集。有关更多详细信息,请参阅SSLCADNRequestFile指令。
此目录中的 files 必须为 PEM-encoded,并通过哈希文件名进行访问。所以通常你不能只将 Certificate files 放在那里:你还必须创建名为 hash-value .N
的符号链接。并且您应始终确保此目录包含相应的符号链接。
例
SSLCADNRequestPath "/usr/local/apache2/conf/ca-names.crt/"
SSLCARevocationCheck 指令
描述: | 启用 CRL-based 吊销检查 |
句法: | SSLCARevocationCheck chain\|leaf\|none[flags ...] |
默认: | SSLCARevocationCheck none |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | httpd 2.4.21 或更高版本中可用的可选标志 |
启用证书吊销列表(CRL)检查。必须至少配置SSLCARevocationFile或SSLCARevocationPath中的一个。设置为chain
(推荐设置)时,CRL 检查将应用于链中的所有证书,而将其设置为leaf
会将检查限制为 end-entity 证书。
可用的标志是:
no_crl_for_cert_ok
在 version 2.3.15 之前,当在SSLCARevocationFile或SSLCARevocationPath配置的任何位置中找不到已检查 certificate(s 的 CRL(s 时,mod_ssl 中的 CRL 检查也成功。
随着SSLCARevocationFile
的引入,行为已经改变:默认情况下使用chain
或leaf
,必须存在 CRL ****才能使验证成功-否则它将失败并出现"unable to get certificate CRL"
错误。
flag no_crl_for_cert_ok
允许恢复以前的行为。
例
SSLCARevocationCheck chain
兼容版本 2.2
SSLCARevocationCheck chain no_crl_for_cert_ok
SSLCARevocationFile 指令
描述: | Client Auth 的串联 PEM-encoded CA CRL 文件 |
句法: | SSLCARevocationFile file-path |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
此指令设置 all-in-one 文件,您可以在其中汇编认证 Authorities(CA)的证书撤销 Lists(CRL),其中您处理的是 clients。这些用于 Client 身份验证。这样的文件只是各种 PEM-encoded CRL files 的串联,按优先顺序排列。除了SSLCARevocationPath之外,这可以另外 and/or 使用。
例
SSLCARevocationFile "/usr/local/apache2/conf/ssl.crl/ca-bundle-client.crl"
SSLCARevocationPath 指令
描述: | Client Auth 的 PEM-encoded CA CRL 目录 |
句法: | SSLCARevocationPath directory-path |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
此指令设置保存证书撤销_Cists(CRL)的目录,该证书撤销 Lists(CRL)是您处理的客户端的证书 Authorities(CA)。这些用于撤消 Client 身份验证上的 client 证书。
此目录中的 files 必须为 PEM-encoded,并通过哈希文件名进行访问。所以通常你不仅要将 CRL files 放在那里。此外,您必须创建名为 hash-value .rN
的符号链接。并且您应始终确保此目录包含相应的符号链接。
例
SSLCARevocationPath "/usr/local/apache2/conf/ssl.crl/"
SSLCertificateChainFile 指令
描述: | PEM-encoded 服务器 CA 证书的文件 |
句法: | SSLCertificateChainFile file-path |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
SSLCertificateChainFile 已弃用
当了 SSLCertificateFile被扩展为从服务器证书文件加载中间 CA 证书时与 version 2.4.8 一起变得过时了。
此指令设置可选的 all-in-one 文件,您可以在其中汇编构成服务器证书的证书链的 Certification Authorities(CA)证书。这从颁发服务器证书的 CA 证书开始,可以达到根 CA 证书。这样的文件只是各种 PEM-encoded CA 证书文件的串联,通常在证书链 order 中。
除了服务器证书之外,还应该使用 and/or 或SSLCACertificatePath来显式构建除了服务器证书之外发送到浏览器的服务器证书链。使用 client 身份验证时,避免与 CA 证书冲突特别有用。因为虽然将服务器证书链的 CA 证书放入SSLCACertificatePath对证书链构造具有相同的效果,但它具有 side-effect,client 身份验证也接受由此相同 CA 证书颁发的 client 证书。
但要小心:只有在使用单个基于 RSA 或 DSA 的服务器证书时,才能提供证书链。如果您使用的是耦合 RSA DSA 证书对,则仅当两个证书实际使用相同的证书链时才会起作用。否则浏览器会在这种情况下混淆。
例
SSLCertificateChainFile "/usr/local/apache2/conf/ssl.crt/ca.crt"
SSLCertificateFile 指令
描述: | 服务器 PEM-encoded X.509 证书数据文件 |
句法: | SSLCertificateFile file-path |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
该指令指向具有 PEM 格式的证书数据的文件。该文件至少必须包含 end-entity(叶子)证书。该指令可以多次使用(引用不同的文件名)以支持多种服务器身份验证算法-通常是 RSA,DSA 和 ECC。支持的算法数量取决于用于 mod_ssl 的 OpenSSL version:使用 version 1.0.0 或更高版本,openssl list-public-key-algorithms
将输出支持的算法列表,另请参阅下面关于 1.0.2 之前的 OpenSSL 版本限制的说明以及解决这些问题的方法。
files 还可以包括从叶到根排序的中间 CA 证书。 version 2.4.8 及更高版本支持此功能,并废弃SSLCertificateChainFile。当 running 与 OpenSSL 1.0.2 或更高版本时,这允许在 per-certificate 基础上配置中间 CA 链。
自定义 DH 参数和临时密钥的 EC 曲线 name 也可以添加到使用了 SSLCertificateFile配置的第一个文件的末尾。 version 2.4.7 或更高版本支持此功能。可以使用命令openssl dhparam
和openssl ecparam
生成这些参数。可以将参数 as-is 添加到第一个证书文件的末尾。只有第一个文件可用于自定义参数,因为它们独立于身份验证算法类型应用。
最后,end-entity 证书的私有 key 也可以添加到证书文件中,而不是使用单独的了 SSLCertificateKeyFile指令。这种做法非常沮丧。如果使用它,则必须使用单独的 key 文件在证书之后配置使用此类嵌入 key 的证书 files。如果私有 key 被加密,则在启动 time 时强制使用密码对话框。
DH 参数互操作性与质数> 1024 位
从 version 2.4.7 开始,mod_ssl 使用标准化的 DH 参数,其主要长度为 2048,3072 和 4096 位,并且具有 6144 和 8192 位的额外素数长度,以 version 2.4.10(来自RFC 3526)开头,并根据它们将它们移交给 clients 证书长度为 RSA/DSA key。特别是使用 Java-based clients(Java 7 或更早版本),这可能会导致握手失败-请参阅此FAQ 答案以解决此类问题。
使用多个证书和 1.0.2 之前的 OpenSSL 版本时的默认 DH 参数
当使用多个证书来支持不同的身份验证算法(如 RSA,DSA,但主要是 ECC)和 1.0.2 之前的 OpenSSL 时,建议使用自定义 DH 参数(最好)将它们添加到第一个证书文件中(如上所述)或者对SSLCertificateFile
指令进行排序,以便在 ECC 之后放置 RSA/DSA 证书**。
这是因为旧版本的 OpenSSL 存在限制,它不允许 Apache HTTP Server 在握手 time 时确定当前选定的证书(当必须将 DH 参数发送给对等方时),而是始终提供最后配置的证书。因此,服务器可以基于错误证书的 key 的长度来选择默认 DH 参数(ECC 密钥远小于 RSA/DSA,并且它们的长度与选择 DH 素数无关)。
由于自定义 DH 参数始终优先于默认参数,因此可以通过创建和配置它们(如上所述)来避免此问题,从而使用 custom/suitable 长度。
例
SSLCertificateFile "/usr/local/apache2/conf/ssl.crt/server.crt"
SSLCertificateKeyFile 指令
描述: | 服务器 PEM-encoded private key 文件 |
句法: | SSLCertificateKeyFile file-path |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
该指令指向服务器的 PEM-encoded private key 文件。如果包含的私有 key 已加密,则在启动 time 时强制使用密码短语对话框。
该指令可以多次使用(引用不同的文件名)以支持多种算法进行服务器身份验证。对于每个了 SSLCertificateKeyFile指令,必须有匹配的SSLCertificateFile
指令。
私有 key 也可以与了 SSLCertificateFile给出的文件中的证书组合,但是这种做法非常不鼓励。如果使用它,则必须使用单独的 key 文件在证书之后配置使用此类嵌入 key 的证书 files。
例
SSLCertificateKeyFile "/usr/local/apache2/conf/ssl.key/server.key"
SSLCipherSuite 指令
描述: | 密码套件可用于 SSL 握手中的 negotiation |
句法: | SSLCipherSuite[protocol] cipher-spec |
默认: | SSLCipherSuite DEFAULT(depends on OpenSSL version) |
Context: | server config,virtual host,directory,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | mod_ssl |
此复杂指令使用由 OpenSSL 密码规范组成的 colon-separated cipher-spec string 来配置允许 client 在 SSL 握手阶段协商的密码套件。可选的协议说明符可以为特定的 SSL version 配置密码套件。可能的值包括所有 SSL 协议的“SSL”,包括 TLSv1.2.
请注意,此指令可以在 per-server 和 per-directory context 中使用。在 per-server context 中,它在建立连接时应用于标准 SSL 握手。在 per-directory context 中,它会在读取 HTTP 请求之后但在发送 HTTP 响应之前强制与重新配置的密码套件进行 SSL 重新协商。
如果 SSL library 支持 TLSv1.3(OpenSSL 1.1.1 和更高版本),则协议说明符“TLSv1.3”可用于配置该协议的密码套件。由于 TLSv1.3 不提供重新协商,因此不允许在目录 context 中为其指定密码。
有关 TLSv1.3 密码名称的列表,请参阅OpenSSL 文档。
cipher-spec 中的 SSL 密码规范由 4 个主要属性和一些额外的小属性组成:
- Key 交换算法:
RSA,Diffie-Hellman,Elliptic Curve Diffie-Hellman,Secure Remote Password - 验证算法:
RSA,Diffie-Hellman,DSS,ECDSA 或 none。 - Cipher/Encryption 算法:
AES,DES,Triple-DES,RC4,RC2,IDEA 等 - MAC 摘要算法:
MD5,SHA 或 SHA1,SHA256,SHA384。
SSL 密码也可以是 export 密码。不再支持 SSLv2 密码。要指定要使用的密码,可以指定所有密码,一个在 time,或使用别名指定密码的首选项和 order(请参阅表格 1)。实际可用的密码和别名取决于使用的 openssl version。较新的 openssl 版本可能包含其他密码。
标签 | 描述 |
Key 交换算法: | |
kRSA | RSA key 交换 |
kDHr | Diffie-Hellman key 与 RSA key 交换 |
kDHd | Diffie-Hellman key 与 DSA key 交换 |
kEDH | 短暂的(temp.key)Diffie-Hellman key 交换(无证书) |
kSRP | 安全的 Remote 密码(SRP)key 交换 |
验证算法: | |
aNULL | 没有身份验证 |
aRSA | RSA 身份验证 |
aDSS | DSS 身份验证 |
aDH | Diffie-Hellman 认证 |
密码编码算法: | |
eNULL | 没有加密 |
NULL | eNULL 的别名 |
AES | AES 加密 |
DES | DES 加密 |
3DES | Triple-DES 加密 |
RC4 | RC4 加密 |
RC2 | RC2 加密 |
IDEA | IDEA 加密 |
MAC 摘要算法: | |
MD5 | MD5 哈希功能 |
SHA1 | SHA1 哈希 function |
SHA | SHA1 的别名 |
SHA256 | SHA256 哈希功能 |
SHA384 | SHA384 哈希功能 |
别名: | |
SSLv3 | 所有 SSL version 3.0 密码 |
TLSv1 | 所有 TLS version 1.0 密码 |
EXP | 所有 export 密码 |
EXPORT40 | 只有 40-bit export 密码 |
EXPORT56 | 只有 56-bit export 密码 |
LOW | 所有低强度密码(无 export,单 DES) |
MEDIUM | 所有具有 128 位加密的密码 |
HIGH | 所有使用 Triple-DES 的密码 |
RSA | 所有使用 RSA key 交换的密码 |
DH | 所有密码都使用 Diffie-Hellman key 交换 |
EDH | 所有密码都使用 Ephemeral Diffie-Hellman key 交换 |
ECDH | 椭圆曲线 Diffie-Hellman key 交换 |
ADH | 所有密码都使用匿名 Diffie-Hellman key 交换 |
AECDH | 所有密码都使用 Anonymous Elliptic Curve Diffie-Hellman key exchange |
SRP | 所有密码都使用安全远程密码(SRP)key 交换 |
DSS | 所有使用 DSS 身份验证的密码 |
ECDSA | 所有使用 ECDSA 身份验证的密码 |
aNULL | 所有密码都不使用身份验证 |
现在,这变得有趣的是,这些可以放在一起,以指定您希望使用的 order 和密码。为了加快速度,某些密码组也有别名(SSLv3, TLSv1, EXP, LOW, MEDIUM, HIGH
)。这些标签可以与前缀连接在一起以形成 cipher-spec。可用的前缀是:
- none:将密码添加到列表中
+
:将匹配的密码移动到列表中的当前位置-
:从列表中删除密码(可以在以后添加)!
:完全从列表中删除密码(不能**以后再添加)
aNULL,eNULL 和 EXP 密码始终被禁用
从 version 2.4.7 开始,始终禁用 null 和 export-grade 密码,因为 mod_ssl 无条件地在初始化时将!aNULL:!eNULL:!EXP
添加到任何密码 string。
查看所有这些的更简单方法是使用`openssl ciphers -v`'' command which provides a nice way to successively create the correct cipher-spec string. The default cipher-spec string depends on the version of the OpenSSL libraries used. Let's suppose it is
RC4-SHA:AES128-SHA:HIGH:MEDIUM:!aNULL:!MD5
''表示以下内容:将RC4-SHA
和AES128-SHA
放在开头。我们这样做,因为这些密码在速度和安全性之间提供了良好的折衷。接下来,包括高中安全密码。最后,删除所有未经过身份验证的密码,i.e。对于 SSL,匿名 Diffie-Hellman 密码,以及使用MD5
作为哈希算法的所有密码,因为它已被证明是不够的。
$ openssl ciphers -v 'RC4-SHA:AES128-SHA:HIGH:MEDIUM:!aNULL:!MD5' RC4-SHA SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=SHA1 AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1 DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1 ... ... ... ... ... SEED-SHA SSLv3 Kx=RSA Au=RSA Enc=SEED(128) Mac=SHA1 PSK-RC4-SHA SSLv3 Kx=PSK Au=PSK Enc=RC4(128) Mac=SHA1 KRB5-RC4-SHA SSLv3 Kx=KRB5 Au=KRB5 Enc=RC4(128) Mac=SHA1
SSL 的特定 RSA 和 DH 密码的完整列表在表 2中给出。
例
SSLCipherSuite RSA:!EXP:!NULL:+HIGH:+MEDIUM:-LOW
Cipher-Tag | 协议 | Key Ex。 | 验证。 | ENC。 | 苹果电脑 | 类型 |
RSA 密码: | ||||||
DES-CBC3-SHA | 在 SSLv3 | RSA | RSA | 3DES(168) | SHA1 | |
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 | |
DES-CBC-SHA | 在 SSLv3 | RSA | RSA | DES(56) | SHA1 | |
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 | 出口 |
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 | 出口 |
SSLC 压缩指令
描述: | 在 SSL level 上启用压缩 |
句法: | SSLCompression on\|off |
默认: | SSLCompression off |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 0.9.8 或更高版本,则在 httpd 2.4.3 及更高版本中可用;如果使用 OpenSSL 1.0.0 或更高版本,则可以使用虚拟 host 作用域。在 version 2.4.3 中,默认值为on 。 |
该指令允许在 SSL level 上启用压缩。
启用压缩会导致大多数设置中出现安全问题(即所谓的 CRIME 攻击)。
SSLCryptoDevice 指令
描述: | 允许使用加密硬件加速器 |
句法: | SSLCryptoDevice engine |
默认: | SSLCryptoDevice builtin |
Context: | 服务器配置 |
状态: | 延期 |
模块: | mod_ssl |
该指令允许使用加密硬件加速器板来卸载一些 SSL 处理开销。只有在 SSL 工具包内置“引擎”支持的情况下,才能使用该指令; OpenSSL 0.9.7 及更高版本默认支持“引擎”,必须使用单独的“-engine”版 OpenSSL 0.9.6.
要发现支持哪些引擎名称,请运行命令“openssl engine
”。
例
# For a Broadcom accelerator: SSLCryptoDevice ubsec
SSLEngine 指令
描述: | SSL 引擎操作开关 |
句法: | SSLEngine on\|off\|optional |
默认: | SSLEngine off |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
该指令切换 SSL/TLS 协议引擎的用法。这应该在<VirtualHost>部分内使用,以便为该虚拟 host 启用 SSL/TLS。默认情况下,主服务器和所有已配置的虚拟主机都禁用 SSL/TLS 协议引擎。
例
<VirtualHost _default_:443> SSLEngine on #... </VirtualHost>
在 Apache 2.1 及更高版本中,SSLEngine
可以设置为optional
。这样可以支持RFC 2817,在 HTTP/1.1 内升级到 TLS。在此 time,没有 web 浏览器支持 RFC 2817。
SSLFIPS 指令
描述: | SSL FIPS 模式切换 |
句法: | SSLFIPS on\|off |
默认: | SSLFIPS off |
Context: | 服务器配置 |
状态: | 延期 |
模块: | mod_ssl |
该指令切换 SSL library FIPS_mode flag 的用法。它必须在 global 服务器 context 中设置,并且不能配置冲突的设置(SSLFIPS on 后跟 SSLFIPS off 或类似)。该模式适用于所有 SSL library 操作。
如果 httpd 是针对不支持 FIPS_mode flag 的 SSL library 编译的,则SSLFIPS on
将失败。有关在 FIPS 140-2 批准操作模式下使用 mod_ssl 的特定要求,请参阅 SSL 提供程序 library 的 FIPS 140-2 Security Policy 文档;请注意,mod_ssl 本身未经过验证,但可以使用 FIPS 140-2 验证的加密模块进行验证,当所有组件按照适用的 Security Policy 规定的指导进行组装和操作时。
SSLHonorCipherOrder 指令
描述: | 选择优先选择服务器的密码首选项 order |
句法: | SSLHonorCipherOrder on\|off |
默认: | SSLHonorCipherOrder off |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
在 SSLv3 或 TLSv1 握手期间选择密码时,通常会使用 client 的首选项。如果启用此指令,则将改为使用服务器的首选项。
例
SSLHonorCipherOrder on
SSLInsecureRenegotiation 指令
描述: | 选项以支持不安全的重新协商 |
句法: | SSLInsecureRenegotiation on\|off |
默认: | SSLInsecureRenegotiation off |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 0.9.8m 或更高版本,则在 httpd 2.2.15 及更高版本中可用 |
如最初指定的那样,所有版本的 SSL 和 TLS 协议(最多包括 TLS/1.2)在重新协商期间都容易受到 Man-in-the-Middle 攻击(CVE-2009-3555)的攻击。此漏洞允许攻击者将选定的明文“前缀”到 HTTP 请求,如 web 服务器所示。如果 client 和服务器都支持,则会开发一个协议扩展来修复此漏洞。
如果mod_ssl与 OpenSSL version 0.9.8m 或更高版本链接,则默认情况下,仅支持新协议扩展的 clients 支持重新协商。如果启用此指令,则旧的(未修补的)客户端将允许重新协商,尽管不安全。
安全警告
如果启用此指令,则 SSL 连接将容易受到CVE-2009-3555前缀攻击,如CVE-2009-3555中所述。
例
SSLInsecureRenegotiation on
可以从 SSI 或 CGI 脚本使用SSL_SECURE_RENEG
环境变量来确定给定 SSL 连接是否支持安全重新协商。
SSLOCSPDefaultResponder 指令
描述: | 设置 OCSP 验证的默认响应器 URI |
句法: | SSLOCSPDefaultResponder uri |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
此选项设置要使用的默认 OCSP 响应程序。如果未启用SSLOCSPOverrideResponder,则仅在未验证的证书中未指定响应者 URI 时才使用给定的 URI。
SSLOCSPEnable 指令
描述: | 启用 client 证书链的 OCSP 验证 |
句法: | SSLOCSPEnable on\|leaf\|off |
默认: | SSLOCSPEnable off |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 模式叶在 httpd 2.4.34 和更高版本中可用 |
此选项启用 client 证书链的 OCSP 验证。如果启用此选项,则在正常验证(包括 CRL 检查)发生后,将针对 OCSP 响应程序验证 client 证书链中的证书。在'leaf'模式下,只验证 client 证书本身。
使用的 OCSP 响应器要么从证书本身提取,要么由 configuration 派生;请参阅SSLOCSPDefaultResponder和SSLOCSPOverrideResponder指令。
例
SSLVerifyClient on SSLOCSPEnable on SSLOCSPDefaultResponder "http://responder.example.com:8888/responder" SSLOCSPOverrideResponder on
SSLOCSPNoverify 指令
描述: | 跳过 OCSP 响应者证书验证 |
句法: | SSLOCSPNoverify On/Off |
默认: | SSLOCSPNoverify Off |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 0.9.7 或更高版本,则在 httpd 2.4.26 及更高版本中可用 |
跳过 OCSP 响应器证书验证,在测试 OCSP 服务器时非常有用。
SSLOCSPOverrideResponder 指令
描述: | 强制使用默认响应器 URI 进行 OCSP 验证 |
句法: | SSLOCSPOverrideResponder on\|off |
默认: | SSLOCSPOverrideResponder off |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
此选项强制在 OCSP 证书验证期间使用配置的默认 OCSP 响应程序,无论证书是否经过验证引用 OCSP 响应程序。
SSLOCSPProxyURL 指令
描述: | 用于 OCSP 请求的代理 URL |
句法: | SSLOCSPProxyURL url |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 可在 httpd 2.4.19 及更高版本中使用 |
此选项允许设置应该用于 OCSP 响应程序的所有查询的 HTTP 代理的 URL。
SSLOCSPResponderCertificateFile 指令
描述: | 一组受信任的 PEM 编码的 OCSP 响应器证书 |
句法: | SSLOCSPResponderCertificateFile file |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 0.9.7 或更高版本,则在 httpd 2.4.26 及更高版本中可用 |
这提供了在 OCSP 响应器证书验证期间使用的可信 OCSP 响应器证书列表。提供的证书是隐式信任的,无需进一步验证。这通常用于 OCSP 响应器证书是自签名或从 OCSP 响应中省略的情况。
SSLOCSPResponderTimeout 指令
描述: | OCSP 查询超时 |
句法: | SSLOCSPResponderTimeout seconds |
默认: | SSLOCSPResponderTimeout 10 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
当SSLOCSPEnable打开时,此选项设置查询到 OCSP 响应程序的超时。
SSLOCSPResponseMaxAge 指令
描述: | OCSP 响应的最大允许年龄 |
句法: | SSLOCSPResponseMaxAge seconds |
默认: | SSLOCSPResponseMaxAge -1 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
此选项设置 OCSP 响应的最大允许年龄(“新鲜度”)。默认的 value(-1
)不会强制执行最大年龄,这意味着 OCSP 响应被视为 long,因为它们的nextUpdate
字段是将来的。
SSLOCSPResponseTimeSkew 指令
描述: | OCSP 响应验证的最大允许 time 偏差 |
句法: | SSLOCSPResponseTimeSkew seconds |
默认: | SSLOCSPResponseTimeSkew 300 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
此选项设置 OCSP 响应的最大允许 time 偏差(检查其thisUpdate
和nextUpdate
字段时)。
SSLOCSPUseRequestNonce 指令
描述: | 在 OCSP 查询中使用随机数 |
句法: | SSLOCSPUseRequestNonce on\|off |
默认: | SSLOCSPUseRequestNonce on |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 可在 httpd 2.4.10 及更高版本中使用 |
此选项确定对 OCSP 响应程序的查询是否应包含 nonce。默认情况下,始终使用查询现时并根据响应的一个进行检查。当响应者不使用随机数(e.g. Microsoft OCSP Responder)时,应该将此选项设置为off
。
SSLOpenSSLConfCmd 指令
描述: | 通过 SSL_CONF API 配置 OpenSSL 参数 |
句法: | SSLOpenSSLConfCmd command-name command-value |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 1.0.2 或更高版本,则在 httpd 2.4.8 及更高版本中可用 |
该指令将 OpenSSL 的 SSL_CONF API 暴露给 mod_ssl,允许灵活地配置 OpenSSL 参数,而无需在将新的 features 添加到 OpenSSL 时实现额外的mod_ssl指令。
可用的SSLOpenSSLConfCmd
命令集取决于用于mod_ssl的 OpenSSL version(至少需要 version 1.0.2)。有关支持的命令名称列表,请参阅 OpenSSL 的SSL_CONF_cmd(3)手册页中的“支持的 configuration 文件命令”一节。
一些SSLOpenSSLConfCmd
命令可以用作现有指令的替代(例如SSLCipherSuite或SSLProtocol),但应注意参数的语法/允许值有时可能不同。
例子
SSLOpenSSLConfCmd Options -SessionTicket,ServerPreference SSLOpenSSLConfCmd ECDHParameters brainpoolP256r1 SSLOpenSSLConfCmd ServerInfoFile "/usr/local/apache2/conf/server-info.pem" SSLOpenSSLConfCmd Protocol "-ALL, TLSv1.2" SSLOpenSSLConfCmd SignatureAlgorithms RSA+SHA384:ECDSA+SHA256
SSLOptions 指令
描述: | 配置各种 SSL 引擎 run-time 选项 |
句法: | SSLOptions[+\|-]option ... |
Context: | server config,virtual host,directory,.htaccess |
覆盖: | 选项 |
状态: | 延期 |
模块: | mod_ssl |
该指令可用于在 per-directory 基础上控制各种 run-time 选项。通常,如果多个SSLOptions
可以应用于目录,则完全采用最具体的一个;选项未合并。但是,如果SSLOptions
指令上的所有选项都以加号(+
)或减号(-
)开头,则合并选项。任何以+
开头的选项都会添加到当前有效的选项中,并且从当前有效的选项中删除任何前面带有-
的选项。
可用选项包括:
StdEnvVars
启用此选项后,将创建标准的 SSL 相关 CGI/SSI 环境变量集。由于 performance 原因,默认情况下禁用此默认值,因为信息提取 step 是一项相当昂贵的操作。因此,通常只为 CGI 和 SSI 请求启用此选项。ExportCertData
启用此选项后,将创建其他 CGI/SSI 环境变量:SSL_SERVER_CERT
,SSL_CLIENT_CERT
和SSL_CLIENT_CERT_CHAIN_
n(n = 0,1,2,..)。这些变量包含当前 HTTPS 连接的 PEM-encoded X.509 服务器证书和 client,可以使用通过 CGI 脚本进行更深入的证书检查。此外,还提供了 client 证书链的所有其他证书。这会使环境膨胀一点,这就是为什么你必须使用这个选项来按需启用它。FakeBasicAuth
启用此选项后,Client X509 证书的主题可分辨 Name(DN)将转换为 HTTP 基本授权用户名。这意味着标准 Apache 身份验证方法可用于访问控制。用户 name 只是 Client 的 X509 证书的主题(可以通过 running OpenSSL 的openssl x509
命令确定:openssl x509 -noout -subject -in
certificate.crt
)。请注意,没有从用户获得密码。用户文件中的每个条目都需要此密码:`xxj31ZMTZzkVA`'', which is the DES-encrypted version of the word ``password`''. Those who live under MD5-based encryption(for instance under FreeBSD or BSD/OS, etc.)should use the following MD5 hash of the same word:
$1$OXLyS...$Owx8s2/m9/gfkcRVXzgoE/
''。
请注意,mod_auth_basic中的AuthBasicFake指令可用作伪造基本身份验证的更通用机制,从而控制用户名和密码的结构。
StrictRequire
当SSLRequireSSL
或SSLRequire
成功决定禁止访问时,这会强制禁止访问。通常默认情况下是`Satisfy any`'' directive is used, and other access restrictions are passed, denial of access due to `SSLRequireSSL` or `SSLRequire` is overridden(because that's how the Apache `Satisfy` mechanism should work.)But for strict access restriction you can use `SSLRequireSSL` and/or `SSLRequire` in combination with an
SSLOptions +StrictRequire
''。一旦 mod_ssl 决定拒绝访问,那么额外的“Satisfy Any
”就没有机会了。OptRenegotiate
当在 per-directory context 中使用 SSL 指令时,这可以实现优化的 SSL 连接重新协商处理。默认情况下,启用严格 scheme,其中每次 per-directory 重新配置 SSL 参数都会导致完整的 SSL 重新协商握手。当使用此选项时,mod_ssl 尝试通过执行更细粒度(但仍然安全)的参数检查来避免不必要的握手。然而,这些细粒度检查有时可能不是用户期望的,所以请仅在 per-directory 基础上启用它。LegacyDNStringFormat
此选项会影响SSL_{CLIENT,SERVER}_{I,S}_DN
变量的值的格式。自 version 2.3.11 以来,Apache HTTPD 默认使用 RFC 2253 兼容格式。这使用逗号作为属性之间的分隔符,允许使用 non-ASCII 字符(转换为 UTF8),使用反斜杠转义各种特殊字符,最后使用“C”属性对属性进行排序。
如果设置了LegacyDNStringFormat
,将使用旧格式,首先对“C”属性进行排序,使用斜杠作为分隔符,并且不以任何一致的方式处理 non-ASCII 和特殊字符。
例
SSLOptions +FakeBasicAuth -StrictRequire <Files ~ ".(cgi|shtml)$"> SSLOptions +StdEnvVars -ExportCertData </Files>
SSLPassPhraseDialog 指令
描述: | 加密私钥的密码对话框类型 |
句法: | SSLPassPhraseDialog type |
默认: | SSLPassPhraseDialog builtin |
Context: | 服务器配置 |
状态: | 延期 |
模块: | mod_ssl |
当 Apache 启动时,它必须读取 SSL-enabled 虚拟服务器的各种证书(请参阅了 SSLCertificateFile)和私有 Key(请参阅了 SSLCertificateKeyFile)files。因为出于安全原因,Private Key files 通常是加密的,mod_ssl 需要向管理员查询 order 中的 Pass Phrase 来解密那些 files。此查询可以通过两种方式完成,可以按类型配置:
builtin
这是在 Apache 从终端分离之前启动 time 时发生交互式终端对话的默认设置。管理员必须在此处为每个加密的 Private Key 文件手动输入 Pass Phrase。由于可以配置许多 SSL-enabled 虚拟主机,因此使用以下 reuse-scheme 来最小化对话框:当加密私有 Key 文件时,尝试所有已知的密码短语(在开头有 none)。如果其中一个已知的 Pass Phrases 成功,则不会弹出此特定 Private Key 文件的对话框。如果 none 成功,则在终端上查询另一个 Pass Phrase 并记住下一轮(也许可以重复使用)。
这个 scheme 允许 mod_ssl 最大限度地灵活(因为对于 N 加密的 Private Key files,你可以使用 N 个不同的 Pass Phrases -但是当然你必须输入所有这些),同时最小化终端对话框(i.e.当你使用单个时所有 N 个私人 Key files 的密码短语此密码短语只被查询一次)。
|/path/to/program[args...]
该模式允许使用外部程序,该程序充当特定输入设备的管道;程序在stdin
上发送用于builtin
模式的标准提示文本,并且应该在stdout
上写入密码 strings。如果需要多个密码(或输入的密码不正确),则在返回第一个密码之后将写入其他提示文本,然后必须写回更多密码。exec:/path/to/program
这里配置了一个外部程序,在启动时为每个加密的 Private Key 文件调用该程序。它被调用两个 arguments(第一个是`servername:portnumber`'', the second is either
RSA
'',`DSA`'',
ECC
''或 integer 索引从 3 开始,如果配置了三个以上的键),这表明它是哪个服务器和算法必须打印相应的密码短语到stdout
。在版本 2.4.8(未发布)和 2.4.9 中,使用一个参数调用它,形式为```+824+``+825+`为 zero-based integer 编号),表示服务器,TCP port 和证书编号。目的是该外部程序首先运行安全检查,以确保系统不会被攻击者破坏,并且只有当这些检查成功通过时,它才会提供 Pass Phrase。
这些安全检查以及确定 Pass Phrase 的方式都可以像您一样复杂。 Mod_ssl 只定义了接口:一个可执行程序,它在stdout
上提供 Pass Phrase。没有更多或更少!所以,如果你对安全性真的很偏执,那么这就是你的界面。其他任何东西都必须留给管理员,因为本地安全要求是如此不同。
上面的 reuse-algorithm 也在这里使用。换句话说:每个唯一的 Pass Phrase 只调用一次外部程序。
例
SSLPassPhraseDialog "exec:/usr/local/apache/sbin/pp-filter"
SSLProtocol 指令
描述: | 配置可用的 SSL/TLS 协议版本 |
句法: | SSLProtocol[+\|-]protocol ... |
默认: | SSLProtocol all -SSLv3(up to 2.4.16: all) |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
该指令可用于控制在新连接中接受哪些版本的 SSL/TLS 协议。
可用的(case-insensitive)协议是:
SSLv3
这是来自 Netscape Corporation 的安全套接字层(SSL)协议 version 3.0.它是 SSLv2 的继承者,也是 TLSv1 的前身,但在RFC 7568中已弃用。TLSv1
这是传输层安全性(TLS)协议,version 1.0.它是 SSLv3 的后继者,在RFC 2246中定义。几乎每个 client 都支持它。TLSv1.1
(使用 OpenSSL 1.0.1 及更高版本时)
修订 TLS 1.0 协议,如RFC 4346中所定义。TLSv1.2
(使用 OpenSSL 1.0.1 及更高版本时)
修订 TLS 1.1 协议,如RFC 5246中所定义。TLSv1.3
(使用 OpenSSL 1.1.1 及更高版本时)
一个新的 TLS 协议 version,如RFC 8446中所定义。all
这是`+SSLv3 +TLSv1`'' or - when using OpenSSL 1.0.1 and later -
+SSLv3 +TLSv1 +TLSv1.1 +TLSv1.2
''的快捷方式(除了使用+861+
+862+`)。
例
SSLProtocol TLSv1
SSLProxyCACertificateFile 指令
描述: | Remote Server Auth。的连锁 PEM-encoded CA 证书文件 |
句法: | SSLProxyCACertificateFile file-path |
Context: | server config,virtual host,proxy section |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | httpd 2.4.30 及更高版本中允许使用代理部分 context |
此指令设置 all-in-one 文件,您可以在其中汇编您处理 remote 服务器的证书证书 Authorities(CA)。这些用于 Remote 服务器身份验证。这样的文件只是各种 PEM-encoded Certificate files 的串联,按优先顺序排列。除了SSLProxyCACertificatePath之外,这可以另外 and/or 使用。
例
SSLProxyCACertificateFile "/usr/local/apache2/conf/ssl.crt/ca-bundle-remote-server.crt"
SSLProxyCACertificatePath 指令
描述: | Remote Server Auth 的 PEM-encoded CA 证书目录 |
句法: | SSLProxyCACertificatePath directory-path |
Context: | server config,virtual host,proxy section |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | httpd 2.4.30 及更高版本中允许使用代理部分 context |
此指令设置保存您处理其 remote 服务器的证书证书 Authorities(CA)的目录。这些用于验证 Remote 服务器身份验证上的 remote 服务器证书。
此目录中的 files 必须为 PEM-encoded,并通过哈希文件名进行访问。所以通常你不能只将 Certificate files 放在那里:你还必须创建名为 hash-value .N
的符号链接。并且您应始终确保此目录包含相应的符号链接。
例
SSLProxyCACertificatePath "/usr/local/apache2/conf/ssl.crt/"
SSLProxyCARevocationCheck 指令
描述: | 为 Remote Server Auth 启用 CRL-based 吊销检查 |
句法: | SSLProxyCARevocationCheck chain\|leaf\|none |
默认: | SSLProxyCARevocationCheck none |
Context: | server config,virtual host,proxy section |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | httpd 2.4.30 及更高版本中允许使用代理部分 context |
为您处理的 remote 服务器启用证书吊销列表(CRL)检查。必须至少配置SSLProxyCARevocationFile或SSLProxyCARevocationPath中的一个。设置为chain
(推荐设置)时,CRL 检查将应用于链中的所有证书,而将其设置为leaf
会将检查限制为 end-entity 证书。
设置为 chain 或 leaf 时,CRL 必须可用于成功验证
在 version 2.3.15 之前,当在配置了SSLProxyCARevocationFile或SSLProxyCARevocationPath的任何位置中找不到 CRL(s 时,mod_ssl 中的 CRL 检查也成功。通过引入此指令,行为已更改:启用检查时,必须存在 CRL 才能使验证成功-否则将失败并显示"unable to get certificate CRL"
错误。
例
SSLProxyCARevocationCheck chain
SSLProxyCARevocationFile 指令
描述: | Remote Server Auth 的串联 PEM-encoded CA CRL 文件 |
句法: | SSLProxyCARevocationFile file-path |
Context: | server config,virtual host,proxy section |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | httpd 2.4.30 及更高版本中允许使用代理部分 context |
此指令设置 all-in-one 文件,您可以在其中组装您处理 remote 服务器的 Certification Authorities(CA)的证书吊销 Lists(CRL)。这些用于 Remote 服务器身份验证。这样的文件只是各种 PEM-encoded CRL files 的串联,按优先顺序排列。除了SSLProxyCARevocationPath之外,这可以另外 and/or 使用。
例
SSLProxyCARevocationFile "/usr/local/apache2/conf/ssl.crl/ca-bundle-remote-server.crl"
SSLProxyCARevocationPath 指令
描述: | Remote Server Auth 的 PEM-encoded CA CRL 目录 |
句法: | SSLProxyCARevocationPath directory-path |
Context: | server config,virtual host,proxy section |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | httpd 2.4.30 及更高版本中允许使用代理部分 context |
此指令设置保存您处理 remote 服务器的 Certification Authorities(CA)的证书吊销 Lists(CRL)的目录。这些用于在 Remote 服务器身份验证上撤消 remote 服务器证书。
此目录中的 files 必须为 PEM-encoded,并通过哈希文件名进行访问。所以通常你不仅要将 CRL files 放在那里。此外,您必须创建名为 hash-value .rN
的符号链接。并且您应始终确保此目录包含相应的符号链接。
例
SSLProxyCARevocationPath "/usr/local/apache2/conf/ssl.crl/"
SSLProxyCheckPeerCN 指令
描述: | 是否检查 remote 服务器证书的 CN 字段 |
句法: | SSLProxyCheckPeerCN on\|off |
默认: | SSLProxyCheckPeerCN on |
Context: | server config,virtual host,proxy section |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | httpd 2.4.30 及更高版本中允许使用代理部分 context |
此指令设置是否将 remote 服务器证书的 CN 字段与请求 URL 的主机名进行比较。如果两者不相等,则发送 502 状态 code(Bad Gateway)。SSLProxyCheckPeerCN
在发布 2.4.5 及更高版本中被SSLProxyCheckPeerName取代。
在 2.4.5 到 2.4.20 的所有版本中,设置SSLProxyCheckPeerName off
足以启用此行为(因为SSLProxyCheckPeerCN
默认为on
.)在这些版本中,两个指令必须设置为off
以完全避免 remote 服务器证书 name 验证。许多用户报告这非常混乱。
从版本 2.4.21 开始,所有启用SSLProxyCheckPeerName
或SSLProxyCheckPeerCN
选项之一的配置都将使用新的SSLProxyCheckPeerName行为,并且禁用SSLProxyCheckPeerName
或SSLProxyCheckPeerCN
选项之一的所有配置都将禁止所有 remote 服务器证书 name 验证。只有以下 configuration 将在 2.4.21 及更高版本中触发 legacy 证书 CN 比较;
例
SSLProxyCheckPeerCN on SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire 指令
描述: | 是否检查 remote 服务器证书是否已过期 |
句法: | SSLProxyCheckPeerExpire on\|off |
默认: | SSLProxyCheckPeerExpire on |
Context: | server config,virtual host,proxy section |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | httpd 2.4.30 及更高版本中允许使用代理部分 context |
此指令设置是否检查 remote 服务器证书是否已过期。如果检查失败,则发送 502 状态 code(Bad Gateway)。
例
SSLProxyCheckPeerExpire on
SSLProxyCheckPeerName 指令
描述: | 配置 host name 检查 remote 服务器证书 |
句法: | SSLProxyCheckPeerName on\|off |
默认: | SSLProxyCheckPeerName on |
Context: | server config,virtual host,proxy section |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | Apache HTTP Server 2.4.5 及更高版本 httpd 2.4.30 及更高版本中允许使用代理部分 context |
当 mod_ssl 充当 SSL client 时,此指令配置 host name 检查服务器证书。如果请求 URI 中的 host name 与证书主题的 CN attribute(s 之一匹配,或者与 subjectAltName 扩展名匹配,则检查将成功。如果检查失败,则中止 SSL 请求并返回 502 状态 code(错误网关)。
特定情况支持通配符匹配:类型为 dNSName 的 subjectAltName 条目,或以*.
开头的 CN 属性将_与具有相同数量的 name 元素和相同后缀的任何 host name 匹配。 E.g。*.example.org
将 match foo.example.org
,但不会 match foo.bar.example.org
,因为相应 host 名称中的元素数量不同。
此 feature 是在 2.4.5 中引入的,并取代了SSLProxyCheckPeerCN指令的行为,该指令仅针对 host name 测试了第一个 CN 属性中的确切 value。但是,许多用户对单独使用这些指令的行为感到困惑,因此SSLProxyCheckPeerName
和SSLProxyCheckPeerCN
指令的相互行为在发布 2.4.21 时得到了改进。有关原始行为和这些改进的详细信息,请参阅SSLProxyCheckPeerCN指令说明。
SSLProxyCipherSuite 指令
描述: | 密码套件可用于 SSL 代理握手中的 negotiation |
句法: | SSLProxyCipherSuite[protocol] cipher-spec |
默认: | SSLProxyCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+EXP |
Context: | server config,virtual host,proxy section |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | httpd 2.4.30 及更高版本中允许使用代理部分 context |
相当于SSLCipherSuite,但用于代理连接。有关其他信息,请参阅SSLCipherSuite。
SSLProxyEngine 指令
描述: | SSL 代理引擎操作开关 |
句法: | SSLProxyEngine on\|off |
默认: | SSLProxyEngine off |
Context: | server config,virtual host,proxy section |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | httpd 2.4.30 及更高版本中允许使用代理部分 context |
该指令切换了 SSL/TLS Protocol Engine for proxy 的用法。这通常在<VirtualHost>部分内使用,以便在特定的虚拟 host 中启用 SSL/TLS 以进行代理使用。默认情况下,为主服务器和所有已配置的虚拟主机的代理禁用 SSL/TLS 协议引擎。
请注意,SSLProxyEngine
指令通常不应包含在将充当转发代理的虚拟 host 中(使用<Proxy>或将 ProxyRequests指令)。SSLProxyEngine
不需要启用转发代理服务器来代理 SSL/TLS 请求。
例
<VirtualHost _default_:443> SSLProxyEngine on #... </VirtualHost>
SSLProxyMachineCertificateChainFile 指令
描述: | 代理用于选择证书的串联 PEM-encoded CA 证书的文件 |
句法: | SSLProxyMachineCertificateChainFile filename |
Context: | server config,virtual host,proxy section |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | httpd 2.4.30 及更高版本中允许使用代理部分 context |
此指令设置 all-in-one 文件,在该文件中保留所有正在使用的 client 证书的证书链。如果 remote 服务器提供的 CA 证书列表不是其中一个已配置的 client 证书的直接签名者,则需要此指令。
此引用的文件只是各种 PEM-encoded certificate files 的串联。启动时,将检查配置的每个 client 证书,并构建信任链。
安全警告
如果启用此指令,则文件中的所有证书都将被信任,就像它们也在SSLProxyCACertificateFile中一样。
例
SSLProxyMachineCertificateChainFile "/usr/local/apache2/conf/ssl.crt/proxyCA.pem"
SSLProxyMachineCertificateFile 指令
描述: | 连接的 PEM-encoded client 证书文件和代理使用的密钥 |
句法: | SSLProxyMachineCertificateFile filename |
Context: | server config,virtual host,proxy section |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | httpd 2.4.30 及更高版本中允许使用代理部分 context |
此指令设置 all-in-one 文件,您可以将用于验证代理服务器的证书和密钥保存到 remote 服务器。
这个引用的文件只是各种 PEM-encoded 证书 files 的串联,按优先顺序排列。在SSLProxyMachineCertificatePath
之外或另外使用此指令。
目前,不支持加密的私钥
例
SSLProxyMachineCertificateFile "/usr/local/apache2/conf/ssl.crt/proxy.pem"
SSLProxyMachineCertificatePath 指令
描述: | 代理使用的 PEM-encoded client 证书和密钥的目录 |
句法: | SSLProxyMachineCertificatePath directory |
Context: | server config,virtual host,proxy section |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | httpd 2.4.30 及更高版本中允许使用代理部分 context |
此指令设置将用于验证代理服务器的证书和密钥保存到 remote 服务器的目录。
此目录中的 files 必须为 PEM-encoded,并通过哈希文件名进行访问。此外,您必须创建名为hash-value.N
的符号链接。并且您应始终确保此目录包含相应的符号链接。
目前,不支持加密的私钥
例
SSLProxyMachineCertificatePath "/usr/local/apache2/conf/proxy.crt/"
SSLProxyProtocol 指令
描述: | 为代理使用配置可用的 SSL 协议风格 |
句法: | SSLProxyProtocol[+\|-]protocol ... |
默认: | SSLProxyProtocol all -SSLv3(up to 2.4.16: all) |
Context: | server config,virtual host,proxy section |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | httpd 2.4.30 及更高版本中允许使用代理部分 context |
此指令可用于控制 mod_ssl 在为代理建立其服务器环境时应使用的 SSL 协议风格。它只会使用提供的协议之一连接到服务器。
有关其他信息,请参阅SSLProtocol。
SSLProxyVerify 指令
描述: | remote 服务器证书验证的类型 |
句法: | SSLProxyVerify level |
默认: | SSLProxyVerify none |
Context: | server config,virtual host,proxy section |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | httpd 2.4.30 及更高版本中允许使用代理部分 context |
当代理配置为将请求转发到 remote SSL 服务器时,此指令可用于配置 remote 服务器的证书验证。
以下级别可用于 level:
- 无:没有 remote 服务器证书是完全必需
- 可选:remote 服务器可能会提供有效的证书
- require:remote 服务器必须提供有效证书
- optional_no_ca:remote 服务器可能会提供有效的证书
但它不需要(成功)可验证。
实际上只有级别none和require真的很有趣,因为 level 可选不适用于所有服务器而 level**optional_no_ca **实际上是针对身份验证的 idea(但是可以用于建立 SSL 测试页,etc.)
例
SSLProxyVerify require
SSLProxyVerifyDepth 指令
描述: | Remote 服务器证书验证中 CA 证书的最大深度 |
句法: | SSLProxyVerifyDepth number |
默认: | SSLProxyVerifyDepth 1 |
Context: | server config,virtual host,proxy section |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | httpd 2.4.30 及更高版本中允许使用代理部分 context |
该指令设置 mod_ssl 在确定 remote 服务器没有有效证书之前应该验证的深度。
深度实际上是中间证书颁发者的最大数量 i.e。验证 remote 服务器证书时允许遵循的最大 CA 证书数。深度为 0 表示仅接受 self-signed remote 服务器证书,默认深度为 1 表示 remote 服务器证书可以是 self-signed,或者必须由服务器直接知道的 CA 签名(i.e.CA 的证书在SSLProxyCACertificatePath)等
例
SSLProxyVerifyDepth 10
SSLRandomSeed 指令
描述: | 伪随机数 Generator(PRNG)播种源 |
句法: | SSLRandomSeed context source[bytes] |
Context: | 服务器配置 |
状态: | 延期 |
模块: | mod_ssl |
这将在启动 time(context 为startup
)and/or 之前配置一个或多个源用于在 OpenSSL 中播种伪随机数 Generator(PRNG),直到建立新的 SSL 连接(context 为connect
)。该指令只能在 global 服务器 context 中使用,因为 PRNG 是 global 工具。
可以使用以下源变体:
builtin
这是始终可用的内置播种源。它的使用在运行时消耗最少的 CPU 周期,因此可以始终使用而没有缺点。用于播种 PRNG 的源包含当前 time,当前 process id 和随机选择的 128 字节的栈提取。缺点是这不是一个强大的源,并且在启动 time(记分板仍然不可用)时,这个源只产生几个字节的熵。所以你应该总是,至少对于初创公司来说,使用额外的播种源。file:/path/to/source
此变体使用外部文件/path/to/source
作为播种 PRNG 的源。指定字节时,只有文件的第一个字节数字节形成熵(并且字节被赋予/path/to/source
作为第一个参数)。当未指定字节时,整个文件形成熵(并且0
被赋予/path/to/source
作为第一个参数)。特别是在启动 time 时使用它,例如使用可用的/dev/random
and/or/dev/urandom
设备(通常存在于 FreeBSD 和 Linux 等现代 Unix 衍生产品上)。
但要小心:通常/dev/random
只提供与实际拥有的熵数据一样多的 i.e。当您请求 512 字节的熵时,但设备当前只有 100 个字节可用,可能会发生两件事:在某些平台上,您只接收 100 个字节,而在其他平台上,读取阻塞直到有足够的字节可用(可能需要 long time)。这里使用现有的/dev/urandom
更好,因为它永远不会阻塞并实际提供所请求数据的数量。缺点是接收数据的质量可能不是最好的。
exec:/path/to/program
此变体使用外部可执行文件/path/to/program
作为播种 PRNG 的源。指定字节时,只有其stdout
内容的第一个字节数字节形成熵。如果未指定字节,则stdout
上生成的全部数据将形成熵。只有在启动 time 时才需要在外部程序的帮助下进行非常强大的播种(例如,在_示例中使用truerand
实用程序,您可以在基于 AT&T truerand library 的 mod_ssl 发行版中找到)。当然,在连接 context 中使用它会大大减慢服务器的速度。所以通常你应该避免在 context 中使用外部程序。egd:/path/to/egd-socket
(仅限 Unix)
此变体使用外部 Entropy Gathering Daemon(EGD)的 Unix 域 socket(请参阅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 |
Context: | 目录,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | mod_ssl |
如果在 per-location context 中需要 SSL 重新协商,对于 example,在 Directory 或 Location 块中使用SSLVerifyClient,则mod_ssl必须将任何 HTTP 请求主体缓冲到 memory,直到可以执行新的 SSL 握手。该指令可用于设置将用于此缓冲区的 memory 数量。
请注意,在许多配置中,发送请求正文的 client 将不受信任,因此在更改此 configuration 设置时,必须考虑消耗 memory 的拒绝服务攻击。
例
SSLRenegBufferSize 262144
SSLRequire 指令
描述: | 仅当任意复杂的 boolean 表达式为 true 时才允许访问 |
句法: | SSLRequire expression |
Context: | 目录,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | mod_ssl |
不推荐使用 SSLRequire
SSLRequire
已弃用,通常应替换为要求 expr。Require expr
的所谓ap_expr语法是SSLRequire
的语法的超集,具有以下 exception:
在SSLRequire
中,比较 operators <
,<=
,...完全等同于 operators lt
,le
,...并且以某种特殊的方式工作,首先比较两个 strings 的长度然后比较词法 order。另一方面,ap_expr有两组比较 operators:operators <
,<=
,...做词法 string 比较,而 operators -lt
,-le
,...做 integer 比较。对于后者,还有没有前导破折号的别名:lt
,le
,...
该指令指定了必须在 order 中实现以允许访问的一般访问要求。它是一个非常强大的指令,因为需求规范是一个包含任意数量访问检查的任意复杂的 boolean 表达式。
表达式必须 match 以下语法(以 BNF 语法表示法给出):
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" "PeerExtList(" word ")" | word "=~" regex | word "!~" regex wordlist ::= word | wordlist "," word word ::= digit | cstring | variable | function digit ::= [0-9]+ cstring ::= "..." variable ::= "%{" varname "}" function ::= funcname "(" funcargs ")"
对于varname
,可以使用环境变量中描述的任何变量。对于funcname
,可用功能列在ap_expr 文件中。
加载 configuration 时,表达式被解析为内部机器表示,然后在请求处理期间进行评估。在.htaccess context 中,表达式在请求处理期间每次文件遇到时都被解析和执行。
例
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} -ge 1 and %{TIME_WDAY} -le 5 and %{TIME_HOUR} -ge 8 and %{TIME_HOUR} -le 20 ) or %{REMOTE_ADDR} =~ m/^192.76.162.[0-9]+$/
PeerExtList(object-ID)
function 期望在 client 证书中找到由给定 object ID(OID)标识的 X.509 证书扩展的零个或多个实例。如果 left-hand side string 与使用此 OID 标识的扩展的 value 完全匹配,则表达式求值为 true。(如果存在多个具有相同 OID 的 extensions,则至少有一个扩展必须 match)。
例
SSLRequire "foobar" in PeerExtList("1.2.3.4.5.6")
关于 PeerExtList function 的注释
- object ID 既可以指定为 SSL library 识别的描述性 name,例如
"nsComment"
,也可以指定为数字 OID,例如"1.2.3.4.5.6"
。 - 具有 SSL library 已知类型的表达式在比较之前呈现为 string。对于 SSL library 无法识别的类型的扩展,mod_ssl 将解析 value,如果它是原始 ASN.1 类型 UTF8String,IA5String,VisibleString 或 BMPString 之一。对于其中一种类型的扩展,string value 将在必要时转换为 UTF-8,然后与 left-hand-side 表达式进行比较。
参见
- Apache HTTP Server 中的环境变量,有关其他示例。
- 要求 expr
- Apache HTTP Server 中的通用表达式语法
SSLRequireSSL 指令
描述: | 当 SSL 未用于 HTTP 请求时拒绝访问 |
句法: | SSLRequireSSL |
Context: | 目录,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | mod_ssl |
除非为当前连接启用 HTTP over SSL(i.e.HTTPS),否则此指令禁止访问。这在 SSL-enabled 虚拟 host 或目录中非常方便,用于防止暴露应该受保护的内容的 configuration 错误。如果存在此指令,则拒绝所有未使用 SSL 的请求。
例
SSLRequireSSL
SSLSessionCache 指令
描述: | global/inter-process SSL Session 缓存的类型 |
句法: | SSLSessionCache type |
默认: | SSLSessionCache none |
Context: | 服务器配置 |
状态: | 延期 |
模块: | mod_ssl |
这会配置 global/inter-process SSL Session Cache 的存储类型。此缓存是一个可选工具,可加速并行请求处理。对于同一服务器 process(通过 HTTP keep-alive)的请求,OpenSSL 已在本地缓存 SSL session 信息。但是因为现代 clients 通过 parallel 请求(通常最多四个 parallel 请求是 common)请求内联图像和其他数据,这些请求由不同的 pre-forked 服务器进程提供服务。这里 inter-process 缓存有助于避免不必要的 session 握手。
目前支持以下五种存储类型:
none
这会禁用 global/inter-process Session 缓存。这将导致明显的速度损失,并且如果使用某些浏览器可能会导致问题,特别是如果启用了 client 证书。建议不要使用此设置。nonenotnull
这会禁用任何 global/inter-process Session 缓存。然而,它确实强制 OpenSSL 发送 non-null session ID 以容纳需要一个的 buggy clients。dbm:/path/to/datafile
这使用本地磁盘上的 DBM 哈希文件来同步服务器进程的本地 OpenSSL memory 缓存。在高负载下,此 session 缓存可能会遇到可靠性问题。要使用它,请确保已加载mod_socache_dbm。shmcb:/path/to/datafile
[1331]
这使得在 RAM 中的共享 memory 段(通过/path/to/datafile
建立)内使用 high-performance 循环缓冲区(大小为大小字节)来同步服务器进程的本地 OpenSSL memory 缓存。这是推荐的 session 缓存。要使用它,请确保已加载mod_socache_shmcb。dc:UNIX:/path/to/socket
这使用了distcache distributed session 缓存 libraries。参数应使用 distcache 地址语法指定要使用的服务器或代理的位置;对于 example,UNIX:/path/to/socket
指定 UNIX 域 socket(通常是本地 dcclient 代理);IP:server.example.com:9001
指定 IP 地址。要使用它,请确保已加载mod_socache_dc。
例子
SSLSessionCache "dbm:/usr/local/apache/logs/ssl_gcache_data" SSLSessionCache "shmcb:/usr/local/apache/logs/ssl_gcache_data(512000)"
ssl-cache
mutex 用于序列化对 session 缓存的访问以防止损坏。可以使用Mutex指令配置此 mutex。
SSLSessionCacheTimeout 指令
描述: | 在 Session 缓存中 SSL session 到期之前的秒数 |
句法: | SSLSessionCacheTimeout seconds |
默认: | SSLSessionCacheTimeout 300 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 也适用于 Apache 2.4.10 及更高版本中的 RFC 5077 TLS session 恢复 |
此指令设置 global/inter-process SSL Session 缓存,OpenSSL 内部 memory 缓存中存储的信息以及 TLS session 恢复(RFC 5077)恢复的会话的超时秒数。它可以设置为低至 15 用于测试,但应设置为更高的值,如现实生活中的 300。
例
SSLSessionCacheTimeout 600
SSLSessionTicketKeyFile 指令
描述: | TLS session 票证持久 encryption/decryption key |
句法: | SSLSessionTicketKeyFile file-path |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 0.9.8h 或更高版本,则在 httpd 2.4.0 及更高版本中可用 |
(可选)配置 secret key 以加密和解密 TLS session 票证,如RFC 5077中所定义。主要适用于应在多个节点之间共享 TLS 会话信息的集群环境。对于 single-instance httpd 设置,建议不要配置票证 key 文件,而是依赖于 mod_ssl 在启动时生成的(随机)键。
ticket key 文件必须包含 48 个字节的随机数据,最好是从 high-entropy 源创建。在 Unix-based 系统上,可以按如下方式创建 ticket key 文件:
dd if=/dev/random of=/path/to/file.tkey bs=1 count=48
应该频繁地轮换(替换)故障单密钥,因为这是使现有的 session 故障单无效的唯一方法- OpenSSL 目前不允许指定故障单生命周期的限制。只有在重新启动 web 服务器后才会使用新的票证 key。重启后,所有现有的 session 票证都将失效。
ticket key 文件包含敏感的密钥材料,应使用类似于了 SSLCertificateKeyFile的文件权限进行保护。
SSLSessionTickets 指令
描述: | 启用或禁用 TLS session 票证的使用 |
句法: | SSLSessionTickets on\|off |
默认: | SSLSessionTickets on |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 0.9.8f 或更高版本,则在 httpd 2.4.11 及更高版本中可用。 |
该指令允许启用或禁用 TLS session 票证(RFC 5077)。
默认情况下启用 TLS session 票证。使用它们而不以适当的频率(每天 e.g.)重新启动 web 服务器会损害完美的前向保密性。
SSLSRPUnknownUserSeed 指令
描述: | SRP 未知用户种子 |
句法: | SSLSRPUnknownUserSeed secret-string |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 1.0.1 或更高版本,则在 httpd 2.4.4 及更高版本中可用 |
该指令设置用于伪造未知用户的 SRP 用户参数的种子,以避免泄漏给定用户是否存在。指定 secret string。如果未使用此指令,则 Apache 将警报返回给指定未知用户名的 clients。
例
SSLSRPUnknownUserSeed "secret"
SSLSRPVerifierFile 指令
描述: | SRP 验证程序文件的路径 |
句法: | SSLSRPVerifierFile file-path |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 1.0.1 或更高版本,则在 httpd 2.4.4 及更高版本中可用 |
该指令允许 TLS-SRP 和 sets 指向包含 TLS-SRP 用户名,验证者,salt 和 group 参数的 OpenSSL SRP(安全 Remote 密码)验证程序文件的路径。
例
SSLSRPVerifierFile "/path/to/file.srpv"
可以使用openssl
命令 line 实用程序创建验证程序文件:
创建 SRP 验证程序文件
openssl srp -srpvfile passwd.srpv -userinfo "some info"-add username
使用可选-userinfo
参数给出的 value 在SSL_SRP_USERINFO
request 环境变量中是可用的。
SSLStaplingCache 指令
描述: | 配置 OCSP 装订缓存 |
句法: | SSLStaplingCache type |
Context: | 服务器配置 |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 0.9.8h 或更高版本,则可用 |
配置用于 store OCSP 响应的高速缓存,如果启用SSLUseStapling,则包含在 TLS 握手中。 _ OCSP 装订必须配置缓存。使用none
和nonenotnull
的 exception,支持与SSLSessionCache相同的存储类型。
SSLStaplingErrorCacheTimeout 指令
描述: | OCSP 装订缓存中无效响应到期之前的秒数 |
句法: | SSLStaplingErrorCacheTimeout seconds |
默认: | SSLStaplingErrorCacheTimeout 600 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 0.9.8h 或更高版本,则可用 |
在 OCSP 装订缓存(通过SSLStaplingCache配置)中的无效响应到期之前,以秒为单位设置超时。要为有效响应设置缓存超时,请参阅SSLStaplingStandardCacheTimeout。
SSLStaplingFakeTryLater 指令
描述: | 针对失败的 OCSP 装订查询合成“tryLater”响应 |
句法: | SSLStaplingFakeTryLater on\|off |
默认: | SSLStaplingFakeTryLater on |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 0.9.8h 或更高版本,则可用 |
启用后,向 OCSP 响应程序查询装订目的失败时,mod_ssl 将合成 client 的“tryLater”响应。仅在SSLStaplingReturnResponderErrors也启用时有效。
SSLStaplingForceURL 指令
描述: | 覆盖证书的 AIA 扩展中指定的 OCSP 响应器 URI |
句法: | SSLStaplingForceURL uri |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 0.9.8h 或更高版本,则可用 |
该指令覆盖从证书的 authorityInfoAccess(AIA)扩展获得的 OCSP 响应程序的 URI。一个潜在的用途是使用代理来检索 OCSP 查询。
SSLStaplingResponderTimeout 指令
描述: | OCSP 装订查询超时 |
句法: | SSLStaplingResponderTimeout seconds |
默认: | SSLStaplingResponderTimeout 10 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 0.9.8h 或更高版本,则可用 |
当启用SSLUseStapling并且 mod_ssl 正在查询响应程序以进行 OCSP 装订时,此选项设置查询到 OCSP 响应程序的超时。
SSLStaplingResponseMaxAge 指令
描述: | OCSP 装订响应的最大允许年龄 |
句法: | SSLStaplingResponseMaxAge seconds |
默认: | SSLStaplingResponseMaxAge -1 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 0.9.8h 或更高版本,则可用 |
当考虑用于装订目的的 OCSP 响应时,此选项设置最大允许年龄(“新鲜度”)i.e。当SSLUseStapling打开时。默认的 value(-1
)不会强制执行最大年龄,这意味着 OCSP 响应被视为 long,因为它们的nextUpdate
字段是将来的。
SSLStaplingResponseTimeSkew 指令
描述: | OCSP 装订响应验证的最大允许 time 偏差 |
句法: | SSLStaplingResponseTimeSkew seconds |
默认: | SSLStaplingResponseTimeSkew 300 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 0.9.8h 或更高版本,则可用 |
当 mod_ssl 检查包含在 TLS 握手(OCSP 装订)中的 OCSP 响应的thisUpdate
和nextUpdate
字段时,此选项设置允许的最大 time 偏差。仅在SSLUseStapling打开时适用。
SSLStaplingReturnResponderErrors 指令
描述: | 将与装订相关的 OCSP 错误传递给 client |
句法: | SSLStaplingReturnResponderErrors on\|off |
默认: | SSLStaplingReturnResponderErrors on |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 0.9.8h 或更高版本,则可用 |
启用后,mod_ssl 将传递来自不成功的装订相关 OCSP 查询的响应(例如总体状态不是“成功”的响应,证书状态不是“好”的响应,过期响应 etc.)到 client。如果设置为off
,只有表示证书状态为“好”的响应才会包含在 TLS 握手中。
SSLStaplingStandardCacheTimeout 指令
描述: | OCSP 装订缓存中响应到期前的秒数 |
句法: | SSLStaplingStandardCacheTimeout seconds |
默认: | SSLStaplingStandardCacheTimeout 3600 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 0.9.8h 或更高版本,则可用 |
在 OCSP 装订缓存(通过SSLStaplingCache配置)中的响应到期之前,以秒为单位设置超时。该指令适用于有效响应,而SSLStaplingErrorCacheTimeout用于控制 invalid/unavailable 响应的超时。
SSLStrictSNIVHostCheck 指令
描述: | 是否允许 non-SNI clients 访问 name-based 虚拟 host。 |
句法: | SSLStrictSNIVHostCheck on\|off |
默认: | SSLStrictSNIVHostCheck off |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 可在 Apache 2.2.12 及更高版本中使用 |
该指令设置是否允许 non-SNI client 访问 name-based 虚拟 host。如果在默认 name-based 虚拟 host 中设置为on
,则不允许不知道 SNI 的客户端访问属于此特定 IP/port 组合的任何虚拟 host。如果在任何其他虚拟 host 中设置为on
,则不允许 SNI unaware clients 访问此特定虚拟 host。
此选项仅在 httpd 是针对支持 SNI 的 OpenSSL version 进行编译时才可用。
例
SSLStrictSNIVHostCheck on
SSLUserName 指令
描述: | 变量 name 来确定用户 name |
句法: | SSLUserName varname |
Context: | 服务器配置,目录,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | mod_ssl |
该指令设置 Apache 请求 object 中的“user”字段。较低的模块使用它来标识具有字符 string 的用户。特别是,这可能导致设置环境变量REMOTE_USER
。 varname 可以是SSL 环境变量中的任何一个。
请注意,如果使用FakeBasicAuth
选项,则此指令无效(请参阅SSLOptions)。
例
SSLUserName SSL_CLIENT_S_DN_CN
SSLUseStapling 指令
描述: | 在 TLS 握手中启用 OCSP 响应的装订 |
句法: | SSLUseStapling on\|off |
默认: | SSLUseStapling off |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_ssl |
兼容性: | 如果使用 OpenSSL 0.9.8h 或更高版本,则可用 |
此选项启用 OCSP 装订,由 RFC 6066 中指定的“证书状态请求”TLS 扩展定义。如果启用(并由 client 请求),mod_ssl 将在 TLS 握手中包含其自己的证书的 OCSP 响应。配置SSLStaplingCache是启用 OCSP 装订的先决条件。
OCSP 装订缓解了自己查询 OCSP 响应器的问题,但应注意,使用 RFC 6066 规范时,服务器的CertificateStatus
应答可能只包含单个证书的 OCSP 响应。对于其链中具有中间 CA 证书的服务器证书(现在是典型情况),因此在其当前 implementation 中装订只能部分实现“节省往返和资源”的既定目标-另请参阅RFC 6961(TLS 多证书状态扩展)。
启用 OCSP 装订时,ssl-stapling
mutex 用于控制对 order 中 OCSP 装订缓存的访问以防止损坏,sss-stapling-refresh
mutex 用于控制 OCSP 响应的刷新。可以使用Mutex指令配置这些互斥锁。
SSLVerifyClient 指令
描述: | Client 证书验证的类型 |
句法: | SSLVerifyClient level |
默认: | SSLVerifyClient none |
Context: | server config,virtual host,directory,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | mod_ssl |
该指令设置 Client 身份验证的证书验证 level。请注意,此指令可以在 per-server 和 per-directory context 中使用。在 per-server context 中,它适用于建立连接时标准 SSL 握手中使用的 client authentication process。在 per-directory context 中,在读取 HTTP 请求之后但在发送 HTTP 响应之前,它会强制使用重新配置的 client 验证 level 进行 SSL 重新协商。
以下级别可用于 level:
- 无:根本不需要 client 证书
- 可选:客户端可以提供有效证书
- 要求:客户必须出示有效证书
- optional_no_ca:客户可以出示有效证书
但它不需要(成功)可验证。无法依赖此选项进行 client 身份验证。
例
SSLVerifyClient require
SSLVerifyDepth 指令
描述: | Client 证书验证中 CA 证书的最大深度 |
句法: | SSLVerifyDepth number |
默认: | SSLVerifyDepth 1 |
Context: | server config,virtual host,directory,.htaccess |
覆盖: | AuthConfig |
状态: | 延期 |
模块: | mod_ssl |
该指令设置 mod_ssl 在确定 clients 没有有效证书之前应该验证的深度。请注意,此指令可以在 per-server 和 per-directory context 中使用。在 per-server context 中,它适用于建立连接时标准 SSL 握手中使用的 client authentication process。在 per-directory context 中,它会在读取 HTTP 请求之后但在发送 HTTP 响应之前强制使用重新配置的 client 验证深度进行 SSL 重新协商。
深度实际上是中间证书颁发者的最大数量 i.e。验证 client 证书时允许遵循的最大 CA 证书数。深度为 0 表示仅接受 self-signed client 证书,默认深度为 1 表示 client 证书可以 self-signed 或必须由服务器直接知道的 CA 签名(i.e.CA 的证书在SSLCACertificatePath下)等
例
SSLVerifyDepth 10