Apache 模块 mod_md

Description:跨虚拟主机 Management 域,通过 ACME 协议配置证书
Status:Experimental
Module Identifier:md_module
Source File:mod_md.c
Compatibility:在版本 2.4.30 和更高版本中可用

Summary

此模块 Management 一个或多个虚拟主机的域的通用属性。它有两个主要目的:一是通过 ACME 协议(RFC 8555)监督/更新 https:证书。证书将在过期之前由模块进行更新,以解决互联网服务中断的问题。有一些方法可以监视以这种方式 Management 的所有证书的状态,以及可以在续订,到期和错误时运行您自己的通知命令的配置。

其次,mod_md 提供了备用的 OCSP 装订实现。这适用于托管证书以及您自己配置的证书。 OCSP 装订对于任何 https:站点都是必不可少的组件,它会影响页面加载时间,并根据其他设置影响页面可用性。在下面的装订部分中有更多内容。

默认的 ACME Management 证书的机构是Let's Encrypt,但是可以配置另一个支持该协议的 CA。

简单的配置示例:

TLS in a VirtualHost context

MDomain example.org

<VirtualHost *:443>
ServerName example.org
DocumentRoot htdocs/a

SSLEngine on
# no certificates specification
</VirtualHost>

在服务器启动时,此设置将与Let's Encrypt联系以请求该域的证书。如果“让我们加密”可以验证域的所有权,则模块将检索证书及其证书链,将其存储在本地文件系统中(请参阅MDStoreDir),并在下次重新启动时将其提供给mod_ssl

服务器已经在运行时会发生这种情况。所有其他主机将 continue 像以前一样工作。当证书不可用时,将通过“ 503 服务不可用”回答对托管域的请求。

Prerequisites

此模块还需要加载mod_watchdog

使用 Let's Encrypt 进行证书注册和续订要求您的服务器可以从公共 Internet 的端口 80(http :)和/或端口 443(https :)上访问。 (除非您的服务器配置为使用 DNS 进行挑战-“通配符证书”下的内容更多)

该模块将从“加密”提供的方法中进行选择。通常,LE 在端口和 DNS 上都会带来挑战,而 Apache 选择一种可用的方法。

为了确定哪一个可用,模块将查看 Apache httpd 监听的端口。如果这些端口包括端口 80,则假定 http:质询(名为 http-01)可用。如果服务器在端口 443 上侦听,则还将 https:质询(名为 tls-alpn-01)添加到列表中。 (如果配置了MDChallengeDns01,则还将添加质询 dns-01.)

如果您的设置不是那么简单,则有两种方法可以影响此设置。首先,如果服务器位于端口 Map 程序(如防火墙)之后,请查看MDPortMap。其次,您可以通过直接配置MDCAChallenges来完全覆盖模块的猜测。

https: Challenges

对于通过 TLS 协议进行的域验证,“ tls-alpn-01”是质询类型的名称。它要求 Apache 服务器在端口 443 上侦听(如果将该端口 Map 到其他端口,请参阅MDPortMap)。

让我们加密将使用特殊指示器“ acme-tls/1”打开到 Apache 的 TLS 连接(TLS 的此指示部分称为 ALPN,因此称为挑战名称.浏览器也使用 ALPN 来请求 HTTP/2 连接)。

与 HTTP/2 协议一样,要允许此操作,请配置:

Protocols h2 http/1.1 acme-tls/1

并且 tls-alpn-01 挑战类型可用。

Wildcard Certificates

通配符证书是可能的,但不能直接使用。让我们加密需要对它们进行“ dns-01”质询验证。没有其他被认为是足够好的。

这里的困难是 Apache 无法独自做到这一点。顾名思义,“ dns-01”要求您显示某些特定的 DNS 记录,其中包含一些质询数据。因此,您需要_write 您域的 DNS 记录。

如果您知道该怎么做,可以将其与 mod_md 集成。假设您在/ usr/bin/acme-setup-dns 中有一个脚本,可以使用以下命令配置 Apache:

MDChallengeDns01 /usr/bin/acme-setup-dns

并且 Apache 需要设置/删除域的 DNS 质询记录时将调用此脚本。

假设您想要``的证书,mod_md 将调用:

/usr/bin/acme-setup-dns setup mydomain.com challenge-data
# this needs to remove all existing DNS TXT records for 
# _acme-challenge.mydomain.com and create a new one with 
# content "challenge-data"

然后它将调用

/usr/bin/acme-setup-dns teardown mydomain.com
# this needs to remove all existing DNS TXT records for 
# _acme-challenge.mydomain.com

Monitoring

Apache 有一个用于监视的标准模块:mod_status。 mod_md 提供了一个部分,使监视您的域变得容易。

您会看到按字母 Sequences 列出的所有 MD,它们包含的域名,总体状态,有效期和特定设置。设置显示您选择的续订时间(或默认值),使用的 CA 等。

“续订”列将显示证书续订的活动和错误描述。这应该使人们更容易发现一切正常或出了什么问题。

如果 MD 出错,也会在此处显示。这样一来,您无需评估服务器日志就可以评估问题。

还有一个新的“ md-status”处理程序可用于以 JSON 格式为您提供“ server-status”中的 MD 信息。您将其配置为

<Location "/md-status">
SetHandler md-status
</Location>

在您的服务器上。与“服务器状态”一样,您将需要为此添加权限。

如果您只想检查特定域的 JSON 状态,只需将其附加到状态 URL:

> curl https://<yourhost>/md-status/another-domain.org
{
"name": "another-domain.org",
"domains": [
"another-domain.org",
"www.another-domain.org"
],
...

续订域名时,此 JSON 状态还显示活动日志:

{
"when": "Wed, 19 Jun 2019 14:45:58 GMT",
"type": "progress", "detail": "The certificate for the managed domain has been renewed successfully and can be used. A graceful server restart now is recommended."
},{
"when": "Wed, 19 Jun 2019 14:45:58 GMT",
"type": "progress", "detail": "Retrieving certificate chain for test-901-003-1560955549.org"
},{
"when": "Wed, 19 Jun 2019 14:45:58 GMT",
"type": "progress", "detail": "Waiting for finalized order to become valid"
},{
"when": "Wed, 19 Jun 2019 14:45:50 GMT",
"type": "progress", "detail": "Submitting CSR to CA for test-901-003-1560955549.org"
},
...

您还可以在暂存目录中的文件“ job.json”中找到该信息,并在激活目录后找到它。这样,您也可以在以后的任何时间检查它们。

此外,还有MDCertificateStatus可以访问 JSON 格式的相关证书信息。

Stapling

如果您想首先尝试仅在一个受管域中进行装订,请配置:

<MDomain mydomain.net>
MDStapling on
</MDomain>

并使用“服务器状态”和/或MDMessageCmd查看其运行方式。您将看到装订信息是否存在,有效时间,从何处来以及何时刷新。

如果这一切都令您满意,则可以为所有证书或仅受管证书打开它。

mod_ssl 的现有装订实现已被许多站点使用多年。 mod_ssl 和 mod_md 之间有两个主要区别:

  • 按需与计划:mod_ssl 在请求时检索装订信息,例如在新的连接上。 mod_md 会在服务器启动时以及其生命周期的 2/3s 之后立即检索它。

  • 在内存中与持久化:mod_ssl 可以持久化此信息,但是大多数示例配置都使用内存缓存。 mod_md 始终存储在文件系统中。

如果您不走运,并且在 CA 的 OCSP 服务中断期间重新启动服务器,则用户可能无法再访问您的站点。没有持久性,您的服务器将无法向 Client 端提供数据,而 Client 端浏览器也无法获取数据,因为 OCSP 服务没有响应。

mod_md 中的实现将一直存在,在重新启动后再次加载并使其可用于传入连接。该信息过期前一两天,它将对其进行更新,使其能够在较长的 OCSP 服务停机时间内进行复制。

由于向后兼容,因此无法大幅度更改 mod_ssl 中的现有实现。例如,如果不停止许多现有安装(不会加载它),mod_ssl 无法将依赖项添加到 mod_watchdog。

MDActivationDelay Directive

Description:
Syntax:MDActivationDelay duration
Context:server config
Status:Experimental
Module:mod_md
Compatibility:在 2.4.42 版和更高版本中可用

MDBaseServer Directive

Description:控制是否可以 Management 基本服务器或仅托管虚拟主机。
Syntax:MDBaseServer on|off
Default:MDBaseServer off
Context:server config
Status:Experimental
Module:mod_md

控制基本服务器(所有 VirtualHost 外部的服务器)是否应由 mod_md Management。默认情况下不会。由于它可能具有令人困惑的副作用的原因。建议您为所有受管域都拥有虚拟主机,并且不要依赖于全局备用服务器配置。

MDCAChallenges Directive

Description:用于证明域所有权的 ACME 挑战的类型。
Syntax:MDCAChallenges name [ name ... ]
Default:MDCAChallenges tls-alpn-01 http-01 dns-01
Context:server config
Status:Experimental
Module:mod_md

在证明域所有权时设置挑战类型(按优先 Sequences)。该模块支持挑战方法“ tls-alpn-01”,“ dns-01”和“ http-01”。该模块将查看服务器的整体配置,以找出可以使用的方法。

例如,如果服务器在端口 80 上侦听,则“ http-01”方法可用。 “ dns-01”的先决条件是已配置的MDChallengeDns01命令。上面的“ https:挑战”中介绍了“ tls-alpn-01”。

此自动选择适用于大多数设置。但是,由于 Apache 是具有许多配置选项的功能非常强大的服务器,因此并非在所有可能的情况下都存在这种情况。例如:它可以侦听多个 IP 地址,其中某些 IP 地址可以在 https:上访问,而有些 IP 地址则无法访问。

如果直接配置MDCAChallenges,则会禁用此自动选择。相反,模块在与 ACME 服务器通话时将使用配置的质询列表(质询类型也必须由服务器提供)。将按照指定的 Sequences 检查这些挑战。

MDCertificateAgreement Directive

Description:您确认您接受了证书颁发机构的服务条款。
Syntax:MDCertificateAgreement accepted
Context:server config
Status:Experimental
Module:mod_md

当您使用 mod_md 获得证书时,您就成为了 CA 的 Client(例如,让我们加密)。这意味着您需要阅读并同意他们的服务条款,以便您了解他们提供的服务以及他们可能排除或要求您提供的服务。 mod_md 本身不能同意这样的事情。

MDCertificateAuthority Directive

Description:ACME 证书颁发机构服务的 URL。
Syntax:MDCertificateAuthority url
Default:MDCertificateAuthority https://acme-v02.api.letsencrypt.org/directory
Context:server config
Status:Experimental
Module:mod_md

CA 提供服务的 URL。

现在让我们加密提供四个此类 URL。两个用于 ACME 协议自己的旧版本,通常称为 ACMEv1.还有两个用于 RFC 8555 版本的名称为 ACMEv2.

每个版本都有 2 个端点,因为它们是生产端点和用于测试的“登台”端点。测试端点的工作原理相同,但是不会提供浏览器可以识别的证书。但是,它也有非常宽松的速率限制。这样就可以重复测试服务,而不会阻塞自己。

LE 舞台设置

MDCertificateAuthority https://acme-staging-v02.api.letsencrypt.org/directory

MDCertificateCheck Directive

Description:
Syntax:MDCertificateCheck name url
Context:server config
Status:Experimental
Module:mod_md
Compatibility:在 2.4.42 版和更高版本中可用

MDCertificateFile Directive

Description:为 MD 指定静态证书文件。
Syntax:MDCertificateFile path-to-pem-file
Context:server config
Status:Experimental
Module:mod_md

它在MDomainSet内使用,并指定保存受管域的证书链的文件。匹配密钥是通过MDCertificateKeyFile指定的。

Example

<MDomain mydomain.com>
  MDCertificateFile /etc/ssl/my.cert
  MDCertificateKeyFile /etc/ssl/my.key
</MDomain>

这等效于 mod_ssl SSLCertificateFile指令。它有多种用途。

如果要使用静态文件将现有域迁移到一个自动的“我们加密”证书中。您定义MDomainSet,在此处添加文件,然后从 VirtualHosts 中删除SSLCertificateFile

这将为您提供与以前相同的功能,并且配置中的重复行可能更少。然后,您可以向其中添加MDRenewMode“ always”(始终),该模块将在文件中的证书过期之前获得新证书。完成此操作后,请删除MDCertificateFile并重新加载服务器。

另一个用例是您与其他 ACME Client 端(例如出色的certbot)续订“加密加密”证书。然后,让您的 MD 指向 certbot 中的文件,并使它们一起工作。

MDCertificateKeyFile Directive

Description:为静态证书指定静态私钥。
Syntax:MDCertificateKeyFile path-to-file
Context:server config
Status:Experimental
Module:mod_md

它在MDomainSet内部使用,并指定包含托管域私钥的文件。匹配的证书是通过MDCertificateFile指定的。

这等效于 mod_ssl SSLCertificateKeyFile指令。

MDCertificateMonitor Directive

Description:证书日志监视器的 URL。
Syntax:MDCertificateMonitor name url
Default:MDCertificateMonitor crt.sh https://crt.sh?q=
Context:server config
Status:Experimental
Module:mod_md

这是“服务器状态” HTML 用户界面的一部分,与核心功能本身无关。它定义了该页面上提供的链接,用于轻松检查证书监视器。证书的 SHA256 指纹将附加到配置的 URL。

证书监视器提供对证书透明度(CT)日志的监督,以跟踪域证书的使用。您可能至少会看到,Let's Encrypt(或您配置的任何 CA)已经将证书 Importing 到 CTLogs 中。

注意:证书日志更新和监视器对这些更新的接收会受到一些延迟。这在日志和监视器之间有所不同。全新证书不会立即被知晓。

MDCertificateProtocol Directive

Description:与证书颁发机构一起使用的协议。
Syntax:MDCertificateProtocol protocol
Default:MDCertificateProtocol ACME
Context:server config
Status:Experimental
Module:mod_md

指定要使用的协议。当前仅支持ACME

MDCertificateStatus Directive

Description:公开 JSON 中的公共证书信息。
Syntax:MDCertificateStatus on|off
Default:MDCertificateStatus on
Context:server config
Status:Experimental
Module:mod_md

启用后,“ https://domain/.httpd/certificate-status”中的“受管域”中的资源可用,该资源将返回当前证书和续订证书的 JSON 文档列表键属性(如果有)。

Example

{
  "valid-until": "Thu, 29 Aug 2019 16:06:35 GMT",
  "valid-from": "Fri, 31 May 2019 16:06:35 GMT",
  "serial": "03039C464D454EDE79FCD2CAE859F668F269",
  "sha256-fingerprint": "1ff3bfd2c7c199489ed04df6e29a9b4ea6c015fe8a1b0ce3deb88afc751e352d"
  "renewal" : { ...renewed cert information... }
}

MDChallengeDns01 Directive

Description:
Syntax:MDChallengeDns01 path-to-command
Context:server config
Status:Experimental
Module:mod_md

定义需要设置/销毁“ dns-01”质询时要调用的程序。该程序被赋予参数“ setup”或“ teardown”,后跟域名。对于“设置”,还提供了挑战内容。

只要可以使用'http:'或'https:'质询方法,就无需指定此选项。但是,“让我们加密”使“ dns-01”成为通配符证书可用的唯一挑战。如果您需要其中之一,则需要进行配置。

有关更多详细信息,请参见上面有关通配符证书的部分。

MDContactEmail Directive

Description:
Syntax:MDContactEmail address
Context:server config
Status:Experimental
Module:mod_md

ACME 协议要求您在注册时提供联系人网址。目前,Let's Encrypt 需要一个电子邮件地址(它将使用它来通知您有关续订或更改的服务条款)。 mod_md在您的 Apache 配置中使用MDContactEmail指令电子邮件,因此请在此处指定正确的地址。如果MDContactEmail不存在,则mod_md将使用ServerAdmin指令。

MDDriveMode Directive

Description:MDRenewMode 的旧名称。
Syntax:MDDriveMode always|auto|manual
Default:MDDriveMode auto
Context:server config
Status:Experimental
Module:mod_md

存在此指令是为了向后兼容,它是MDRenewMode的旧名称。

MDHttpProxy Directive

Description:为传出连接定义代理。
Syntax:MDHttpProxy url
Context:server config
Status:Experimental
Module:mod_md

使用 http 代理连接到MDCertificateAuthority。如果您的 Web Service 器只能通过转发代理访问 Internet,请进行定义。

MDMember Directive

Description:受管域的其他主机名。
Syntax:MDMember hostname
Context:server config
Status:Experimental
Module:mod_md

您可以使用MDMember将此类名称添加到托管域中,而不是在同一行上列出所有 DNS 名称。

Example

<MDomain example.org>
    MDMember www.example.org
    MDMember mail.example.org
</MDomain>

如果在特定 MD 之外的全局上下文中使用它,则只能将一个值“ auto”或“ manual”指定为所有其他 MD 的默认值。有关这些特殊值的说明,请参见MDomain

MDMembers Directive

Description:控制是否自动添加别名域名。
Syntax:MDMembers auto|manual
Default:MDMembers auto
Context:server config
Status:Experimental
Module:mod_md

定义是否将 VirtualHost 的ServerNameServerAlias值自动添加到托管域的成员。

MDMessageCmd Directive

Description:处理 Management 域的事件
Syntax:MDMessageCmd path-to-cmd optional-args
Context:server config
Status:Experimental
Module:mod_md

当受管域发生以下事件之一时,将调用此命令:“更新”,“已安装”,“到期”,“错误”。将来可能会调用更多命令,并忽略不准备处理的事件。

这是MDNotifyCmd的更灵活的伴侣。

Example

MDMessageCmd /etc/apache/md-message

# will be invoked when a new certificate for mydomain.org is available as: /etc/apache/md-message renewed mydomain.com

程序不应阻塞,因为模块将 await 其完成。非 0 的返回码被视为错误。

“错误”并不是引起立即关注的直接原因,因为尽早进行更新以使互联网恢复正常。每小时最多报告一次。

“到期”应当真。到达MDWarnWindow时发出。默认情况下,这是证书生存期的 10%,因此,对于“让我们加密”来说,当前意味着证书到期前 9 天。该警告每天最多重复一次。

“更新”表示已获取新证书,并将其存储在 MD 存储区的“登台”区域中。它将在下次服务器重新启动/重新加载时被激活。

当新证书已从登台转移到 MD 存储区中的域位置时,将触发“已安装”。这在服务器启动/重新加载时发生。与所有其他调用不同,MDMessageCmd以 root 权限运行(在* nix 系统上),并且可以访问证书文件(和密钥)。可以在此事件上处理其他应用程序或其他格式所需的证书。

MDMustStaple Directive

Description:控制新证书是否带有 OCSP 必须装订标志。
Syntax:MDMustStaple on|off
Default:MDMustStaple off
Context:server config
Status:Experimental
Module:mod_md

定义新请求的证书是否应设置“ OCSP 必须装订”标志。如果证书具有此标志,则要求服务器向每个 Client 端发送 OCSP 装订响应。仅当您配置mod_ssl生成此代码(请参阅SSLUseStapling和朋友)时,此方法才有效。

MDNotifyCmd Directive

Description:托管域就绪后,运行程序。
Syntax:MDNotifyCmd path [ args ]
Context:server config
Status:Experimental
Module:mod_md

当受管域注册或更新其证书时,将运行配置的可执行文件。给它作为附加参数的已处理 MD 的名称(在此处指定的参数之后)。它应该返回状态代码 0 以指示它已经成功运行。

MDomain Directive

Description:定义属于一组的域名列表。
Syntax:MDomain dns-name [ other-dns-name... ] [auto|manual]
Context:server config
Status:Experimental
Module:mod_md

列表中的所有名称都作为一个受管域(MD)进行 Management。 mod_md 将请求一个对所有这些名称均有效的单个证书。该指令使用全局设置(请参阅下面的其他 MD 指令)。如果您需要一个 MD 的特定设置,请使用<MDomainSet>

受管域还需要进行 2 个其他设置:联系人电子邮件地址(通过MDContactEmailServerAdmin)和MDCertificateAgreementServerAdmin的邮件地址用于在 CA 进行注册(默认情况下为“让我们加密”)。 CA 可能会使用它来通知您有关其服务或证书状态的更改。

第二个设置MDCertificateAgreement的值应为“ accepted”。通过指定此选项,您确认您接受 CA 的服务条款。

Example

MDContactEmail [email protected]
MDCertificateAgreement accepted
MDomain example.org www.example.org

<VirtualHost *:443>
    ServerName example.org
    DocumentRoot htdocs/root

    SSLEngine on
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.org
    DocumentRoot htdocs/www

    SSLEngine on
</VirtualHost>

您可以在此指令中使用两个特殊名称:“ manual”和“ auto”。这决定了受管域是否应具有已配置(“手动”)的名称列表,还是提供更多便利。通过“自动”,虚拟主机的所有名称都将添加到 MD。方便地,“自动”也是默认设置。

Example

MDomain example.org

<VirtualHost *:443>
    ServerName example.org
    ServerAlias www.example.org
    DocumentRoot htdocs/root

    SSLEngine on
</VirtualHost>

MDomain example2.org auto

<VirtualHost *:443>
    ServerName example2.org
    ServerAlias www.example2.org
    ...
</VirtualHost>

在此示例中,域“ www.example.org”会自动添加到 MD“ example.org”中。与“ example2.org”类似,其中“ auto”被显式配置。每当您向该虚拟主机添加更多 ServerAlias 名称时,它们也将被添加到托管域中。

如果您希望显式声明所有域名,请使用“手动”模式。如果名称与预期名称不匹配,将记录错误。


Directive

Description:适用于相同托管域的指令的容器。
Syntax:<MDomainSet dns-name [ other-dns-name... ]>...</MDomainSet>
Context:server config
Status:Experimental
Module:mod_md

这是指令MDomain,它具有仅为此 MD 添加设置的可能性。实际上,您也可以使用“ <MDomain ..>”作为快捷方式。

这允许您配置使用其他证书颁发机构,具有其他续订要求等的 MD。

Example

<MDomain sandbox.example.org>
    MDCertificateAuthority   https://someotherca.com/ACME
</MDomain>

一个常见的用例是为您的域分别配置 https:要求。

Example

<MDomain example.org>
    MDRequireHttps temporary
</MDomain>

MDPortMap Directive

Description:将外部端口 Map 到内部端口以进行域所有权验证。
Syntax:MDPortMap map1 [ map2 ]
Default:MDPortMap http:80 https:443
Context:server config
Status:Experimental
Module:mod_md

ACME 协议提供了两种通过 HTTP 验证域所有权的方法:一种使用“ http:” URL(端口 80),一种使用“ https:” URL(端口 443)。如果您的服务器无法通过两者之一访问,则 ACME 只能通过配置 DNS 服务器来工作,请参阅MDChallengeDns01

在大多数面向公众的服务器上,“ http:”到达端口 80,“ https:”到达端口 443.该模块检查 Apache 服务器正在侦听的端口,并假定这些端口可用。这意味着,当您的服务器未在端口 80 上侦听时,它将假定来自 Internet 的“ http:”请求将不起作用。

这是一个很好的猜测,但可能是错误的。例如,您的 Apache 可能监听 80 端口,但是您的防火墙可能阻止了它。 “ http:”仅在您的 Intranet 中可用。因此,该模块将错误地认为 Let's Encrypt 可以在服务器上使用“ http:”挑战。然后这将失败,因为您的防火墙将丢弃那些防火墙。

Example

MDPortMap http:- https:8433

上面的示例显示了如何指定来自互联网的“ http:”请求永远不会到达。此外,它还说“ https:”请求将到达本地端口 8433.

如果有适当的端口转发,这是必要的,则可以从 Internet 上的端口 443 访问服务器,但是 httpd 使用的本地端口是另一个。您的服务器可能仅侦听端口 8443 和 8000,但可以侦听端口 443 和 80(来自 Internet)。

MDPrivateKeys Directive

Description:设置生成的私钥的类型和大小。
Syntax:MDPrivateKeys type [ params... ]
Default:MDPrivateKeys RSA 2048
Context:server config
Status:Experimental
Module:mod_md

定义为托管域生成哪种私钥以及使用什么参数。现在唯一受支持的类型是“ RSA”,并且它采用的唯一参数是密钥所使用的位数。

当前(2017 年)建议至少为 2048 位,此处不接受较小的数字。较高的数字可提供更长的安全性,但在计算上更昂贵,例如增加服务器上的负载。这可能对您来说不是问题。

其他密钥类型将在以后定义。

Example

MDPrivateKeys RSA 3072

请注意,此设置仅对新键有效。您拥有的任何现有私钥均不会受到影响。同样,这仅影响为证书生成的私钥。 ACME 帐户密钥不受此影响。

MDRenewMode Directive

Description:控制是否更新证书。
Syntax:MDRenewMode always|auto|manual
Default:MDRenewMode auto
Context:server config
Status:Experimental
Module:mod_md

在默认的“自动”模式下,该模块将执行每个受管域最有意义的操作。对于没有证书的域,它将从证书颁发机构获得证书。

但是,如果您定义的 MD 未被 Apache 的任何 VirtualHost 使用,则它不会打扰。对于具有静态证书文件的 MD(请参阅MDCertificateFile),它假定您拥有自己的源,并且也不会续订它们。

您可以通过两种方式覆盖此默认设置。如果指定“ always”(始终),则模块将续签 MD 的证书,而不管域是否正在使用或是否有静态文件。

为了达到相反的效果,请配置“手动”,并且不会尝试进行任何更新。

MDRenewWindow Directive

Description:控制何时更新证书。
Syntax:MDRenewWindow duration
Default:MDRenewWindow 33%
Context:server config
Status:Experimental
Module:mod_md

如果证书的有效性低于持续时间,则 mod_md 将获得新的签名证书。

通常,证书的有效期大约为 90 天,mod_md 会在证书过期之前最早将其续约 33%进行续签(因此,对于 90 天的有效期,证书应在过期 30 天之前进行续签)。如果您认为这不是您所需要的,则可以指定确切的时间,例如:

Example

# 21 days before expiry
MDRenewWindow 21d 
# 30 seconds (might be close)
MDRenewWindow 30s
# 10% of the cert lifetime
MDRenewWindow 10%

在自动驱动模式下,该模块至少每 12 小时检查一次托管域的状态以及是否需要执行某些操作。对于错误(例如,当 CA 无法访问时),它将在几秒钟后最初重试。如果该操作 continue 失败,它将退回至每小时检查的最大间隔。

MDRequireHttps Directive

Description:将托管域的 http:流量重定向到 https:。
Syntax:MDRequireHttps off|temporary|permanent
Default:MDRequireHttps off
Context:server config
Status:Experimental
Module:mod_md

这是一个方便的指令,可简化从托管域的 http:到 https:的迁移。带有:

Example

MDRequireHttps temporary

您宣布暂时希望将所有通过 http:URL 的流量重定向到 https:。这是安全的,您可以随时再次将其删除。

以下结果: 如果您希望 Client 端 不再 使用 http:URL,请配置:

永久(至少半年!)

MDRequireHttps permanent

这有两件事:

  • 使用301状态代码,使用https:方案将对http:资源的所有请求重定向到相同的 url。这告诉 Client 这将永远存在,并且应该相应地更新他们拥有的所有链接。

  • https:个请求的所有答案都将带有标题Strict-Transport-Security,其使用期限为半年。这告诉浏览器,与该域名通话时,它**绝(半年)永远不要使用http:。浏览器在看到此信息后将拒绝与您未加密的网站联系。这样可以防止恶意中间件降级连接并监听/操纵流量。哪个好但是您不能简单地再次将其收回。

基本上,您可以使用mod_alias和某些Redirect配置实现相同的目的。如果您自己执行此操作,请确保从重定向中排除路径/.well-known/*,否则 mod_md 可能无法在新证书上签名。

如果全局设置,则它适用于所有托管域。如果只希望将其用于特定域,请使用:

Example

<MDomain xxx.yyy>
  MDRequireHttps temporary
</MDomain>

MDServerStatus Directive

Description:控制是否将受管域信息添加到服务器状态。
Syntax:MDServerStatus on|off
Default:MDServerStatus on
Context:server config
Status:Experimental
Module:mod_md

Apache 的“服务器状态”处理程序允许您配置资源以监视正在发生的事情。现在,该部分列出了所有托管域,其中包括 DNS 名称,续订状态,生存期和主要属性。

您可以使用此指令将其关闭。

MDStapleOthers Directive

Description:对不是由 mod_md Management 的证书启用装订。
Syntax:MDStapleOthers on|off
Default:MDStapleOthers on
Context:server config
Status:Experimental
Module:mod_md
Compatibility:在 2.4.42 版和更高版本中可用

此设置仅在启用MDStapling时生效。它控制mod_md是否还应为不受其直接控制的证书提供装订信息,例如通过 ACME CA 更新。

MDStapling Directive

Description:为全部或特定 MDomain 启用装订。
Syntax:MDStapling on|off
Default:MDStapling off
Context:server config
Status:Experimental
Module:mod_md
Compatibility:在 2.4.42 版和更高版本中可用

mod_md提供了用于提供 OCSP 装订信息的实现。这是mod_ssl提供的替代方法。为了向后兼容,默认情况下禁用此功能。

可以为服务器上的所有证书或单个MDomain打开装订。这将替换这些主机在mod_ssl中的任何装订配置。禁用后,mod_ssl装订将完成工作(当然,如果它本身已启用)。这允许从一种实现逐渐过渡到另一种实现。

mod_md装订也适用于该模块未 Management 证书的域(有关如何控制此证书的信息,请参见MDStapleOthers)。这允许使用新的装订而不使用任何 ACME 证书 Management。

MDStaplingKeepResponse Directive

Description:控制何时应删除旧响应。
Syntax:MDStaplingKeepResponse duration
Default:MDStaplingKeepResponse 7d
Context:server config
Status:Experimental
Module:mod_md
Compatibility:在 2.4.42 版和更高版本中可用

该时间窗口指定何时应再次从存储中删除用于装订的 OCSP 响应数据。超过 7 天(默认)的响应信息会在服务器重新启动/重新加载时删除。当证书经常更新/重新配置时,这可以防止 Store 增长。

MDStaplingRenewWindow Directive

Description:控制装订响应何时更新。
Syntax:MDStaplingRenewWindow duration
Default:MDStaplingRenewWindow 33%
Context:server config
Status:Experimental
Module:mod_md
Compatibility:在 2.4.42 版和更高版本中可用

如果装订中使用的 OCSP 响应的有效性低于持续时间,则mod_md将获得新的 OCSP 响应。

颁发证书的 CA 通常还会操作 OCSP 响应程序服务,并确定其有关证书有效性的已签名响应本身有效的时间。有效的响应时间越长,可以缓存的时间就越长,这意味着每个人的整体性能都更好。生存时间越短,证书吊销越快地传播到 Client 端。此外,服务可靠性也是一个考虑因素。

通过调整装订续订窗口,您可以自己控制部分内容。如果您将续订时间缩短(例如,在当前信息过期之前的很短时间),则会获得最大的缓存时间。但是服务中断(例如停机维护)会影响您。如果您在到期前很长的时间进行更新,更新将变得更加频繁,这将导致 CA 服务器基础结构上的负载增加,并且服务器的子进程之间的协调也将更多。

默认值选择为 33%,这意味着仅剩余响应寿命的三分之一时便开始更新。对于发出 OCSP 响应且生存期为 3 天的 CA,这意味着 2 天的缓存和 1 天的续订尝试。服务中断必须持续 24 小时才能影响您的域。

也可以设置一个绝对更新窗口,例如“ 2d”(2 天)。

MDStoreDir Directive

Description:本地文件系统上存储受管域数据的路径。
Syntax:MDStoreDir path
Default:MDStoreDir md
Context:server config
Status:Experimental
Module:mod_md

定义托管域数据在本地文件系统上的存储位置。这是相对于服务器根目录的绝对路径或相对路径。默认值将在服务器根目录中创建目录“ md”。

如果您进行了移动并且已经有数据,请确保先将数据移动/复制到新位置,重新配置然后重新启动服务器。如果重新配置并首先重新启动,则服务器将尝试获取它认为缺少的新证书。

MDWarnWindow Directive

Description:定义要警告证书过期的时间窗口。
Syntax:MDWarnWindow duration
Default:MDWarnWindow 10%
Context:server config
Status:Experimental
Module:mod_md

有关如何指定时间的说明,请参见MDRenewWindow

模块检查证书的剩余寿命,并在剩余的警告窗口不足时调用MDMessageCmd。默认情况下,这意味着来自 Let's Encrypt 的证书需要 9 天。

它也适用于带有静态证书文件的受管域(请参阅MDCertificateFile)。