TLS和DNS

2018-04-28  本文已影响15人  偶是星爷

今天遇到一个https连接失败的问题。内部用的OpenSSL库打印以下错误

SSL23_GET_SERVER_HELLO:unknown protocol

网上 https://stackoverflow.com/a/15168180/1118964 这个解释比较靠谱,返回这个错误是因为服务器没有正确返回ServerHello。最后查问题,结果是因为DNS缓存导致。TCP连接到一台不支持https的服务器上,所以才会有时成功有时失败。

写DNS缓存的同学粗略的认为,域名和ip是一一对应关系。比如 http://www.mycloud.com 解析返回了一个addrinfo,这个地址不一定能用于 https://www.mycloud.com

int getaddrinfo(const char *node, const char *service,
                const struct addrinfo *hints,
                struct addrinfo **res);

getaddrinfo函数的service参数,https解析需要传入"443"或是"https",如果留空,返回的结果只能看运气了。某些服务器443端口虽然开了,但是不支持https,所以才有Stack Overflow上提到的wget大法。

DNS解析是一项复杂的任务,除非特别有必要,还是尽量用系统的实现。


思考题:如何解析到一个ipv6的地址?

上一篇下一篇

猜你喜欢

热点阅读