gpt4 book ai didi

java: 让 Apache HttpClient 连接到具有特定 IP 的主机

转载 作者:行者123 更新时间:2023-12-02 10:22:40 24 4
gpt4 key购买 nike

某些域名通过 DNS 解析为多个 IP。我需要向所有这些 IP 发出 http 请求(一种服务运行状况检查)。我可以使用

InetAddress[] addrs = InetAddress.getAllByName("google.com")

解析所有应检查的IP。 这与谷歌无关,但通过在谷歌上的测试,我发现了谜题

我正在尝试使用 Apache HttpClient 发出请求。像这样:

HttpHead req = new HttpHead(url);
//InetAddress addr = InetAddress.getByAddress("google.com", new byte[] {74, 125, (byte) 131, 101});
InetAddress addr = // one of those we got from InetAddress.getAll...
CloseableHttpResponse resp = cli.execute(new HttpHost(addr, 443, "https"), req);

它似乎有效,但是我决定检查它是否手动构建 IP - 请参阅注释字符串。如果取消注释并改为使用从 dns 枚举中获取 addr,一切正常,返回 200。

但是如果我随后将这一行中的 IP 地址更改为 8, 8, 8, 8 并期望获得连接超时(因为它是谷歌的DNS地址,它不监听 443 端口,它受防火墙保护) - 我看到的是 404。因此我不确定它使用指定的IP进行真实连接而不是验证。

这让我觉得这种方法是错误的,我错误地使用了这个 HttpHost。

替代方法是使用针对给定设置的自定义DnsResolverHttpClient,它只会提供特定的 IP,并且轮流执行。然而,这看起来像丑陋且不方便的黑客,所以我正在寻找“正确”的方式......

附注以纯文本形式向套接字发送请求(无需任何库)的变体可以正常工作,但最有可能的解决方案还需要与 https 一起使用这使得这个变体变得困难。

最佳答案

您访问特定 IP 的方法是正确且有效的:

try {
HttpClient hc = HttpClientBuilder.create().build();
HttpGet req = new HttpGet("https://www.google.com");
HttpResponse res = hc.execute(new HttpHost("8.8.8.8", 443, "https"), req);
System.out.println(res.getStatusLine());
} catch (Exception e) {
System.out.println(e.getMessage());
}

打印:

Certificate for <8.8.8.8> doesn't match any of the subject alternative names: [*.c.docs.google.com, .....

显然是Google's Public DNS服务器8.8.8.8除了 DNS 之外,还监听端口 443:

$ openssl s_client -showcerts -connect 8.8.8.8:443 | more
CONNECTED(0000012C)
---
Certificate chain
0 s:/C=US/ST=California/L=Mountain View/O=Google LLC/CN=*.c.docs.google.com
i:/C=US/O=Google Trust Services/CN=Google Internet Authority G3

现在我无法明智地谈论它所提供的内容,但我可以得出结论:8.8.8.8并不意味着处理 https://www.google.com流量 *.c.docs.google.com也没有任何主题备用名称匹配 www.google.com .

关于java: 让 Apache HttpClient 连接到具有特定 IP 的主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54220483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com