openssl s_client 使用 IP,但对域名不起作用

openssl s_client 使用 IP,但对域名不起作用

我最近设置了一个内部(有防火墙) apache2 网络服务器,我的一位同事由于某种原因无法访问该服务器(PR_END_OF_FILE_ERROR,表示握手/SSL/密码出现问题)。由于我对那里的根本问题没有足够清晰的认识,所以我不打算用这个问题来解决他不明确的问题。但:

在尝试理解问题背后的原因时,我注意到了以下奇怪的行为:如果我运行

openssl s_client -connect 111.222.333.111:443

IP地址,然后我就可以按预期测试所有密码等。连接基本上是瞬间建立的,一切似乎都很好。但如果我用

openssl s_client -connect my_domainname.com:443

即使用已注册的域名,那么似乎什么都没有发生,openssl-s_client永远不会返回(好像它仍在尝试永远建立连接?)并且我无法让它给我任何输出。但是,my_domainname.com在浏览器中打开时,除了一位同事之外,其他人都可以按预期工作,并且pingdignmap也正确解析了域名。相反,

openssl s_client -connect google.com:443

可以正常工作,所以看起来我配置有误?还是openssl的 DNS 解析出了问题?

答案1

我发现了这个问题,它可能与其他很多人无关,但这确实是我的具体情况中的问题:

问题

openssl s_client,显然默认情况下(?),从 DNS 名称服务器请求 IPv4 和 IPv6 地址,然后尝试连接仅通过 IPv6如果它对 IPv6 DNS 请求获得有效响应。问题是我没有打开 IPv6 HTTP(S) 端口,因此openssl从 DNS 服务器请求 IPv6 地址,获得有效响应和有效 IPv6,然后尝试连接到该 IPv6 地址并被防火墙阻止。

其他程序(例如nmapFirefox)显然默认使用 IPv4,或者在注意到 IPv6 失败后回退到 IPv4,这就是为什么我一开始无法检测到问题的原因。

如何检测

如果它对其他人有帮助:我通过监听端口 53(DNS)上的 TCP 流量发现这是问题所在:

sudo tcpdump -n port 53

在我执行之后,我注意到了以下交换openssl s_client

18:24:57.649939 IP local-ip.50643 > dns-server.53: 12404+ [1au] A? domain-name.com. (55)
18:24:57.650293 IP local-ip.39731 > dns-server.53: 26725+ [1au] AAAA? domain-name.com. (55)
18:24:57.651843 IP dns-server.53 > local-ip.50643: 12404* 2/0/1 CNAME cname-of-server., A server-ipv4-address (146)
18:24:57.651877 IP dns-server.53 > local-ip.39731: 26725* 2/0/1 CNAME cname-of-server., AAAA server-ipv6-address (158)

表示openssl已请求并随后收到 IPv4 ( A) 和 IPv6 ( AAAA) DNS 问题和答案。(此处及下文中的local-ipdns-servercname-of-server和为server-ipv6-address占位server-ipv4-address符,而非文字。)

然后我检查了作为对 DNS 查询的回复而给出的 IPv4 和 IPv6 地址的流量:

sudo tcpdump host server-ipv6-address # in one tab
sudo tcpdump host server-ipv4-address # in another tab

在运行openssl s_client命令之前。我注意到IPv6 主机有未答复的会话建立(SYN,输出)数据包,但 IPv4 上没有任何数据包,这表明它[S]忽略了收到的 IPv4 地址并尝试仅使用 IPv6 答案进行连接。tcpdumpopenssl

如果你修复它它就会起作用

在我更改服务器的防火墙设置以允许传入 IPv6 HTTP(S) 数据包后,openssl s_client能够成功连接并tcpdump显示与 IPv6 主机的握手正常。附注:端口打开后,Firefox 会自动切换到 IPv6。

相关内容