理解caddy “ auto_https”以及为什么禁用它仍然可以使用HTTPS而不是HTTP
from--https://caddy.community/t/making-sense-of-auto-https-and-why-disabling-it-still-serves-https-instead-of-http/9761
1/2
2020年9月

当你的 网站地址 17 遵守要求 自动HTTPS激活 78, Caddy隐式侦听HTTPS端口(默认443 )。

可以使用Caddyfile配置自动HTTPS 全球选择 auto_https 93, 或通过 每个服务器JSON配置 30auto_https 可以设置为以下任一条件:

  • disable_redirects—禁用隐式HTTP- > HTTPS重定向。
  • off —除了删除隐式重定向之外,还禁用站点地址会议的自动TLS配置 自动HTTPS激活 要求。继续隐式收听HTTPS端口。

禁用自动HTTPS (仅使用HTTP )

The auto_https 应该考虑设置,好像它已被命名 auto_tls 相反,它更清楚地描述了它的工作,与默认行为下的隐式HTTPS无关。

您可能会考虑 auto_https off 顾名思义:

{
  auto_https off
}

localhost {
  root * /usr/share/caddy
  file_server
}

auto_https off仅禁用HTTP- > HTTPS重定向以及自动启用TLS (自动创建和更新)。站点地址仍然仅隐式侦听HTTPS,但是连接现在将产生以下结果( URL请求):

  • https://localhost :
    服务器记录 TLS握手错误, 说明没有证书可用— Caddy不会自动创建TLS证书。
  • localhost:443 (http://localhost:443) :
    客户收到回复:“客户端向HTTPS服务器发送了HTTP请求。” — Caddy仅允许HTTPS连接。 端口是正确的,但协议方案不是。
  • localhost / localhost:80 / http://localhost :
    客户无法连接拒绝的错误— Caddy不再将隐式重定向应用于HTTPS。

The 激活规则 78 令人惊讶的是,Caddy仍会意外地继续隐式收听HTTPS端口,但无法建立您所期望的安全连接 auto_https off

Caddy的错误日志将指出原因,TLS证书不可用,因为它未生成,因此握手将不成功。如果找到证书( eg,则通过 tls 指令)握手成功,HTTPS正常工作。

为了使Caddy允许不安全的连接,您必须更加明确一些,并且 网站地址 没有资格 HTTPS激活

您可以通过将您的站点地址声明为:来选择退出隐式HTTPS:

  • http://localhost 或 localhost:80 -默认情况下,仅收听HTTP端口( 80 )。
  • :80 -只是端口,没有提供主机名或IP地址。这不必是HTTP端口

下面的Caddyfile中的每个站点地址都达到相同的结果。auto_https off 不需要,因为隐式HTTPS不再适用:

http://localhost, localhost:80, :80, :9000 {
  root * /usr/share/caddy
  file_server
}

允许HTTP和HTTPS而不进行隐式重定向

如果您希望通过HTTP和HTTPS提供内容,而没有HTTP- > HTTPS重定向,那么您对Caddy的新想法可能是使用 auto_https disable_redirects。不,被禁用的重定向也是使站点地址在HTTP端口上侦听的原因。

您实际上需要您的站点地址来明确声明意图 聆听两个端口。为此, 指定多个站点标签 10, 用逗号或空格分隔。

一种方法是指定协议方案,该方案推断标准端口(,可以通过以下方式更改 http_port 和 https_port 全球选择 93):

http://localhost, https://localhost {
  root * /usr/share/caddy
  file_server
}

仅添加HTTP端口也可以工作(任何其他端口将被视为 https://):

localhost:80, localhost {
  root * /usr/share/caddy
  file_server
}
  • 明确的 https:// 为该特定站点地址启用自动HTTPS,从而实现TLS的自动管理。
  • 明确的 http:// (或任何其他防止 自动HTTPS激活)防止对该站点地址(进行隐式重定向到HTTPS ),从而在HTTP上建立了不安全的连接。

您会注意到 auto_https disable_redirects 不在Caddyfile全局选项中,当允许不安全的HTTP连接时,它没有任何用处。


如果仅使用HTTPS指令,例如 tls 22单个站点块的上述方法将不起作用。相反,您需要一个HTTP站点块和另一个HTTPS站点块。为避免复制大部分站点块,可以使用第三部分作为 导入片段 3:

(site-example) {
  root * /usr/share/caddy
  file_server
}

http://example.com {
  import site-example
}

https://example.com {
  tls internal
  import site-example
}

上面的示例使用Caddy生成的自签名证书,而不是从LetsEncrypt进行配置。这就是凯迪为 localhost 站点地址自动。

禁用隐式HTTP- > HTTPS重定向(仅HTTPS )

HTTP- > HTTPS重定向很好 17, 但是,如果出于任何原因您都选择退出,则需要使用auto_https disable_redirects。除非您在HTTP上明确具有站点地址侦听,否则仅HTTPS可用。

{
  auto_https disable_redirects
}

https://example.com {
  root * /usr/share/caddy
  file_server
}

请注意,因为 disable_redirects 是全局选项,无法选择性地禁用Caddyfile中特定站点块的隐式重定向。您可以通过以下方式添加显式重定向 redir 指令 6:

{
  auto_https disable_redirects
}

http://example.localhost {
  redir https://{host}{uri} permanent
}

https://example.localhost {
  root * /usr/share/caddy
  file_server
}

杂项

测试

如果实验。请注意缓存301重定向或TLS证书的浏览器。更改配置很容易,并且为什么行为与期望不匹配会感到困惑。例如,Firefox私有窗口仍将记住301个重定向。Chrome隐身窗口相当可靠,请确保在测试之间关闭浏览器会话(所有隐身窗口实例)。

工具之类的 curl 当请求省略协议方案时,其行为会有所不同: https://localhost vs localhost:443 (相当于 http://localhost:443, 不 https://localhost:443)。

码头工人-使用内部证书

当Caddy为以下各项创建自签名证书( eg时 localhost 网站地址或使用时 tls internal),它将自动将根证书添加到您的系统信任存储中。但是,在Docker中运行时,它是在正在运行的容器中而不是在主机系统中运行。

为避免来自Web浏览器的不安全警告,您需要手动添加 /data/caddy/pki/authorities/local/root.crt 对您的系统的信任会存储自己。根证书的有效期为10年,而中间的( 1周)和叶( 1天)将从该根证书中更新。

您可以将根证书添加到其他设备信任存储中,Caddy从根证书生成的所有内部证书将被视为有效。不要分享 root.key 文件

误导 tls docs:

文档有点误导 tls 提供自己的证书文件以供使用 22 正如他们暗示的那样 自动HTTPS 将被禁用:

< cert_file > 和 < key_file > 是证书和私钥PEM文件的路径。仅指定一个无效;同时指定两者将禁用自动HTTPS。

这对于自动TLS配置很有意义,但是在符合资格的情况下,隐式重定向仍然令人惊讶地应用 自动HTTPS激活。 如果不需要隐式重定向,请使用 disable_redirects

{
  auto_https disable_redirects
}

example.localhost {
  tls /my-certs/localhost-cert.pem /my-certs/localhost-key.pem
  root * /usr/share/caddy
  file_server
}

TL; DR:

您可能不想禁用 auto_https

  • 通过HTTP服务内容 http:// 您的网站地址( eg http://example.com)。
  • 服务HTTP和HTTPS,同时声明站点地址 http:// 和 https://, 或重复一个指定HTTP端口( eg的站点地址 example.com, example.com:80 { ... })。
  • localhost 自动颁发自签名证书,而不是通常的LetsEncrypt默认值。如果您需要相同的 FQDN 1 站点地址,使用全局选项 local_certs, 或每个站点块 tls internal
    • 如果使用Docker,请将Caddy的根证书添加到您的主机系统信任存储中,以避免来自Web浏览器的不安全警告。
上一篇
下一篇