python访问HTTPS服务返回WRONG_VERSION_NUMBER错误
今天又踩了一个坑,记一下。
有一个python客户端访问HTTPS服务请求,返回如下错误:
<urlopen error [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:579)>
怎么也找不到原因,openssl的版本没有问题啊。
python脚本如下:
$ cat client.py
#!/usr/bin/env python
import ssl, urllib2
import sys
try:
ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
ctx.load_cert_chain("tls-cert.pem", "tls-key.pem")
request = urllib2.Request("https://localhost:9090/service/hello")
contents = urllib2.urlopen(request, context=ctx).read()
print contents
sys.exit(0)
except urllib2.HTTPError,ev:
print ev
sys.exit(1)
except urllib2.URLError,ev:
print ev
sys.exit(1)
except IOError,ev:
print ev
sys.exit(1)
运行结果为:
$ python client.py
<urlopen error [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:579)>
无法确认这是什么问题引起的。
最后发现真正的原因是server端不是一个HTTPS服务,而是一个HTTP服务,把我给坑惨了,python客户端运行的错误输出信息没有任何这方面的提示,一直在检查openss的版本,以及python的办法,都解决不了。
我猜测原因可能是client端认为这是一个HTTPS服务,所以把从服务端收到的消息按照HTTPS的格式进行了解析,而碰巧针对HTTPS里面的VERSION字段随机对应到了一个值,这个值恰好不是一个有效的VERSION值,所以就报出了这个误导性的错误信息。