curl:如何为https请求指定目标主机名

2023-12-30

我有一个x.example为双方提供流量a.example and b.example. x.example都有证书a.example and b.example。 DNS 为a.example and b.example尚未设置。

如果我添加一个/etc/hosts条目为a.example指向x.example的ip并运行curl -XGET https://a.example,我得到了200。

但是如果我跑curl --header 'Host: a.example' https://x.example, I get:

curl:(51)SSL:没有替代证书主题名称与目标匹配 主机名 x.example

我认为它会使用 a.example 作为主机。也许我不明白 SNI/TLS 是如何工作的。

Because a.example是 HTTP 标头,TLS 握手还无法访问它吗?但它确实可以访问 URL 本身吗?


事实上,TLS 中的 SNI 并不是这样工作的。 SNI 与 TLS 相关的所有内容一样,发生在任何类型的 HTTP 流量之前,因此Host该步骤中不考虑标头(但稍后对于网络服务器了解您正在连接的主机也很有用)。

因此,要启用 SNI,您需要在 HTTP 客户端中设置一个特定的开关,告诉它在与您需要的主机名值握手期间发送适当的 TLS 扩展。

的情况下curl,您至少需要版本7.18.1(基于https://curl.haxx.se/changes.html https://curl.haxx.se/changes.html)然后它似乎自动使用中提供的值Host标头。它还取决于它链接到的 OpenSSL(或您平台上的等效库)版本。

参见第 1.10 点https://curl.haxx.se/docs/knownbugs.html https://curl.haxx.se/docs/knownbugs.html这谈到了一个错误,但解释了发生的情况:

当给定一个主机名部分带有尾随点的 URL 时:“https://example.com./”,libcurl 将去掉该点并在内部使用不带点的名称,并在 HTTP 主机中将其发送为无点:标头和 TLS SNI 字段中。

The --connect-to选项对于您的情况也可能有用。或者--resolve作为替代/etc/hosts, see https://curl.haxx.se/mail/archive-2015-01/0042.html https://curl.haxx.se/mail/archive-2015-01/0042.html例如,或者https://makandracards.com/makandra/1613-make-an-http-request-to-a-machine-but-fake-the-hostname https://makandracards.com/makandra/1613-make-an-http-request-to-a-machine-but-fake-the-hostname你可以加--verbose在所有情况下都能更详细地了解正在发生的情况。看这个例子:https://www.claudiokuenzler.com/blog/693/curious-case-of-curl-ssl-tls-sni-http-host-header https://www.claudiokuenzler.com/blog/693/curious-case-of-curl-ssl-tls-sni-http-host-header;您还将看到如何直接测试openssl.

如果你有a.example在你的/etc/hosts你应该只运行curlhttps://a.example/它应该照顾Host标头和 SNI(或使用--resolve反而)

因此,要直接回答您的问题,请替换

curl --header 'Host: a.example' https://x.example

with

curl --connect-to a.example:443:x.example:443 https://a.example

它应该可以完美地工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

curl:如何为https请求指定目标主机名 的相关文章

  • fsockopen() 和 SSL 出错,“无法启用加密”

    我正在尝试连接到 Nominet EPP 测试台 但收到 无法启用加密 的消息 这似乎是一个罕见的错误 没有记录的解决方案或原因 用行 socket fsockopen ssl testbed epp nominet org uk 700
  • 使用普通用户和 https 的 gitea

    我正在尝试设置 gitea 以使用 https 和我从 LetsEncrypt 获得的证书 运行该服务作为普通用户 我已经让它与普通用户在端口 80 上使用 http 一起工作git并使用 iptables 将端口 80 重定向到端口 30
  • 链和主证书添加之间 X509 结构的正确释放是否有所不同?

    我需要从内存中添加 PEM 类型证书 这意味着我无法使用内置的从文件读取帮助程序 我的问题是没有关于如何释放内存的文档 现在我最好的猜测如下 SSL CTX use certificate X509 structure SHOULD be
  • Android - API 请求

    我开发了一个应用程序 它也在 iPhone 上 问题出在 api 请求上 我为所有请求设置了超时 有时会出现 30 60 秒的中断 看起来这个应用程序执行了几个请求 然后就中断了 一直超时 大约 45 秒后一切正常 不知道是服务器问题还是安
  • 如何将域添加到 aws 上的现有 SSL 证书

    我有一个与 Amazon Web Services 上的负载均衡器关联的 SSL 证书 我想在该证书上有一个额外的域 我的问题是 是否可以向 aws 上现有的 ssl 证书添加额外的域 我发现您可以在创建证书时添加其他名称 但我不知道如何使
  • 使用 php ping 网站

    我想创建一个 php 脚本 它将 ping 一个域并列出响应时间以及请求的总大小 这将用于监控网站网络 我尝试过curl 这是我到目前为止的代码 function curlTest2 url clearstatcache return if
  • 如何在flutter中绕过SSL证书验证?

    如何在flutter中绕过SSL证书验证 错误 握手异常 客户端中的握手错误 操作系统错误 CERTIFICATE VERIFY FAILED 自签名证书 handshake cc 345 您需要配置 HttpService 以使用自签名
  • 使用 Spring 的 REST 多部分混合请求(文件+json)

    我需要将一个文件和一个 json 一起发送到我的 Spring 控制器 我有以下控制器类 Controller RequestMapping perform public class PerformController RequestMap
  • 信任库是否需要子 ca 证书?

    我正在尝试设置分层 PKI 我是否可以创建仅包含根 ca 证书的信任库 这是否意味着我的应用程序信任由子 ca 证书签名的证书 而子 ca 证书又由根 ca 签名 顺便说一句 您似乎必须提供整个证书链 包括根 ca 证书 当然 如果根 ca
  • 重复使用相同的卷曲手柄。性能大幅提升?

    在 PHP 脚本中 我对不同的 URL 执行了许多不同的curl GET 请求 一百个 将重复使用来自curl init提高性能 还是与请求的响应时间相比可以忽略不计 我这么问是因为在当前的架构中保持相同的句柄并不容易 交叉发布自我应该关闭
  • 如何使用 net/http 验证 ruby​​ 中的 SSL 证书链

    我如何验证网站的证书 例如https processing ukash com https processing ukash com 在 ruby 中使用 net http https Net HTTP new processing uka
  • Google Chrome 中的 ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED

    我有一个使用 SSL 客户端证书授权的网站 所有客户端证书都是使用 OpenSSL 生成的并且是自签名的 一切都适用于所有网络浏览器 但推荐的是 Google Chrome 因为它使用与 IE 相同的 SSL 仓库 因此证书安装非常简单 点
  • 如何通过 TLS 1.2 运行 django runserver

    我正在本地 Mac OS X 机器上测试 Stripe 订单 我正在实现这段代码 stripe api key settings STRIPE SECRET order stripe Order create currency usd em
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke
  • 无法使用 OpenSSL 验证服务器证书

    我已经使用 OpenSSL 编写了一个 SOAP 客户端 在 Ubuntu 12 04 上用 C 编写 但它目前无需检查服务器安全证书即可运行 这是我用来设置连接和检查证书的函数 bool bInitialiseSSL SSL CTX ct
  • 应用程序传输安全已禁用,但仍然出现 SSL 握手错误

    我在通过 HTTPS SSL 连接到 API 时遇到问题 我已经使用下面的字典完全禁用了应用程序传输安全性 ATS 尽管 SSL 证书通过了 NSCURL 的所有测试
  • 通过 C# Mailkit / Mimekit 发送电子邮件,但出现服务器证书错误

    Visual Studio 2015 中的 0 代码 1 我正在使用 Mailkit 最新版本 1 18 1 1 从我自己的电子邮件服务器发送电子邮件 2 电子邮件服务器具有不受信任的自签名证书 3 我在代码中添加了以下两行 以忽略服务器证
  • FormsAuthentication:安全吗?

    Using 表单验证构建成asp net创建一个为经过身份验证的用户创建 cookie 的登录系统非常快速且简单 FormsAuthentication SetAuthCookie uniqueUsername false 与中的一些代码配
  • 将 CURL 命令行转换为 VBA

    在 CURL 中 我可以使用这一行 curl data DataToBeSent https example com resource cgi 我正在努力将此类行转换为在 VBA 中使用 这是我到目前为止的尝试 Sub POST Metho
  • 应用程序网关中的 SSL 证书到期日期

    我们有一个带有 SSL 证书的 Azure 应用程序网关 我们知道我们的证书即将过期 我们需要更新它 我们的问题是 我们无法获取网关信息中的实际到期日期 至少无法从门户获取 有人知道我们可以在哪里检索此信息吗 可能没有直接从 Azure 门

随机推荐