from--https://caddy.community/t/making-sense-of-auto-https-and-why-disabling-it-still-serves-https-instead-of-http/9761
当你的 网站地址 17 遵守要求 自动HTTPS激活 78, Caddy隐式侦听HTTPS端口(默认443 )。
可以使用Caddyfile配置自动HTTPS 全球选择 auto_https
93, 或通过 每个服务器JSON配置 30。auto_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://
您的网站地址( eghttp://example.com
)。 - 服务HTTP和HTTPS,同时声明站点地址
http://
和https://
, 或重复一个指定HTTP端口( eg的站点地址example.com, example.com:80 { ... }
)。 localhost
自动颁发自签名证书,而不是通常的LetsEncrypt默认值。如果您需要相同的 FQDN 1 站点地址,使用全局选项local_certs
, 或每个站点块tls internal
。- 如果使用Docker,请将Caddy的根证书添加到您的主机系统信任存储中,以避免来自Web浏览器的不安全警告。