【问题标题】:Send HTTPS get requests to same host but different host ips向同一主机发送 HTTPS 获取请求但主机 ip 不同
【发布时间】:2018-04-16 13:58:12
【问题描述】:

我想向同一主机发送 HTTPS 请求,但我想每次都选择目标 IP。

例如“dig digitalocean.com”显示这些 IP:

digitalocean.com.   300 IN  A   104.16.110.208
digitalocean.com.   300 IN  A   104.16.112.208
digitalocean.com.   300 IN  A   104.16.109.208
digitalocean.com.   300 IN  A   104.16.113.208
digitalocean.com.   300 IN  A   104.16.111.208

使用 HTTP 它可以工作:

HTTPoison.get("http://104.16.110.208/", [{"host","www.digitalocean.com"}])
{:ok,
 %HTTPoison.Response{body: "", headers: [...], request_url: "http://104.16.110.208/",
  status_code: 301}}

但是使用 HTTPS 我得到一个错误:

HTTPoison.get("https://104.16.110.208/", [{"host", "www.digitalocean.com"}])
{:error,
 %HTTPoison.Error{id: nil,
  reason: {:options, {{:server_name_indication, '104.16.110.208'}}}}}

有没有办法通过带有 HTTPoison 的 HTTPS 或在 Elixir/Erlang 中实现此目的而无需修改 etc/hosts?

【问题讨论】:

  • 我不知道在不允许不安全的 https 的情况下这是否可行(我还需要使用--insecurecurl 发出此请求),但这有效:HTTPoison.get("https://104.16.110.208/", [{"host", "www.digitalocean.com"}], hackney: [:insecure])
  • @Dogbert thx,这是有道理的。但是我已经复制了您的确切 HTTPoison 行,对我来说它不起作用。你能告诉我它为你运行的版本吗?
  • 我已经找到了如何使用 curl https:// DOMAIN.TLD --resolve 'DOMAIN.TLD:443:IP_ADDRESS' 来实现它。但我无法弄清楚如何在 Erlang/Elixir 中根据请求执行此操作。
  • 你能把这个放在问题里吗?我有(几乎,但 HTTPotion 作为长生不老药库)同样的问题......基本上就像“我正在寻找相当于 curl--resolve 选项”
  • 尝试在hackney 中添加ssl_options,并将server_name_indication 设置为www.digitalocean.com。见erlang.org/doc/man/ssl.html。问题是,如果您不提供 SNI 名称,那么它将从您在连接到服务器时使用的主机名/IP 中使用

标签: https erlang elixir httpoison


【解决方案1】:

你需要像下面这样使用它

HTTPoison.get("https://104.16.110.208/", [{"host","www.digitalocean.com"}], hackney: [{:ssl_options, [{:server_name_indication, "digitalocean.com"}]}])

HTTPoison.get("https://104.16.110.208/", [{"host","www.digitalocean.com"}], hackney: [ssl_options: [server_name_indication: 'digitalocean.com']])

由于您使用 IP 进行连接,默认情况下server_name_indication 将被假定为 IP。这是您需要在您的情况下覆盖的内容

【讨论】:

  • 这几乎行得通。我不得不为ssl_option 使用单引号(它说明了上面的错误,这是有道理的,因为它是一个 erlang 库,所以应该有“erlang 引号”)。另外,我认为格式可以改进。 get(…, hackney: [ssl_options: [server_name_indication: 'digitalocean.com]])' 为我工作。
  • @PatrickJ.S.,感谢您的反馈。用相同的方式更新了答案
猜你喜欢
  • 2015-04-16
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 2010-12-28
  • 2015-03-21
  • 2021-07-01
相关资源
最近更新 更多