今天遇到一个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的地址?
网友评论