问题描述
执行python脚本报错,报错信息如下
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/itchat/utils.py", line 125, in test_connect
r = requests.get(config.BASE_URL)
File "/Library/Python/2.7/site-packages/requests/api.py", line 70, in get
return request('get', url, params=params, **kwargs)
File "/Library/Python/2.7/site-packages/requests/api.py", line 56, in request
return session.request(method=method, url=url, **kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 488, in request
resp = self.send(prep, **send_kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 609, in send
r = adapter.send(request, **kwargs)
File "/Library/Python/2.7/site-packages/requests/adapters.py", line 423, in send
timeout=timeout
File "/Library/Python/2.7/site-packages/requests/packages/urllib3/connectionpool.py", line 594, in urlopen
chunked=chunked)
File "/Library/Python/2.7/site-packages/requests/packages/urllib3/connectionpool.py", line 350, in _make_request
self._validate_conn(conn)
File "/Library/Python/2.7/site-packages/requests/packages/urllib3/connectionpool.py", line 835, in _validate_conn
conn.connect()
File "/Library/Python/2.7/site-packages/requests/packages/urllib3/connection.py", line 330, in connect
cert = self.sock.getpeercert()
File "/Library/Python/2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 324, in getpeercert
'subjectAltName': get_subj_alt_name(x509)
File "/Library/Python/2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 166, in get_subj_alt_name
cert = _Certificate(openssl_backend, peer_cert._x509)
AttributeError: 'X509' object has no attribute '_x509'
You can't get access to internet or wechat domain, so exit.
解决办法
google错误关键字“AttributeError: 'X509' object has no attribute '_x509'”发现说是OpenSSL版本太低导致
python -c 'import OpenSSL; print(OpenSSL.__version__)'
,这个命令可以查看OpenSSL版本号,终端执行后:

网上搜说OpenSSL版本号需要>0.13
于是接下来就看怎么升级OpenSSL
OpenSSL并不是一个单独的库,是在其他库里依赖的,这里一直没有搞清楚是不是在pyOpenSSL里,升级了pyOpenSSL到最新版本17.0.0,执行python脚本仍然报同样的错误
看到了cryptography官网里关于OpenSSL的描述(官网点这里 )
根据官网文档描述执行了如下操作:
brew install openssl@1.1
env LDFLAGS="-L$(brew --prefix openssl@1.1)/lib" CFLAGS="-I$(brew --prefix openssl@1.1)/include" pip install cryptography
安装完成后,再次执行python脚本,还是报同样的错误
此时我的内心是崩溃的。。。
继续google,降低了requests库的版本号:
pip install requests==2.11.1
再次执行python脚本,还是报同样的错。。。
最后决定再次卸载pyOpenSSL和cryptography库:
pip uninstall pyOpenSSL cryptography
sudo pip install pyOpenSSL cryptography
再次执行python脚本,竟然执行成功了。。。
这时执行:
python -c 'import OpenSSL; print(OpenSSL.__version__)'
发现版本号还是0.13.1。。。这中间一定是发生了什么不可描述的事情。。(之前也卸载重装pyOpenSSL和cryptography库,问题还是存在,应该是中间哪一步)
网友评论