Bri*_*unt 11 python google-app-engine urllib2 ssl-certificate google-app-engine-python
在AppEngine开发人员应用程序服务器中,我收到如下错误:
SSLCertificateError: Invalid and/or missing SSL certificate for URL ...
Run Code Online (Sandbox Code Playgroud)
当我这样获取https带有自签名证书的服务器时(几乎总是localhost通过ssh端口转发到vm):
result = urlfetch.fetch(url=url, method=method, payload=payload,
deadline=DEADLINE, validate_certificate=None)
Run Code Online (Sandbox Code Playgroud)
人们不会想到为无效证书的SSL失败validate_certificate的False,虽然这很可能是2.7.9政策在Python总是验证SSL证书的副作用.
请注意,传递False(而不是None)for validate_certificate也不起作用.
这个问题在Python 2.7.9-10上通过OS X 10.10.2-4上的Homebrew/XCode与AppEngine 1.9.18到1.19.26发生.
在Google App Engine上存在关于此问题(例如12096),但我正在寻找解决方法.
这是我试图解决的问题:
将证书添加到Mac的登录密钥链(在浏览器中工作,而不是从Python工作)
将证书添加到app-engine-python/lib/cacerts/cacerts.txt和/或./lib/cacerts/urlfetch_cacerts.txt (尽管这可能需要重启验证就为它工作,因为这似乎是在那里它们被使用的唯一的情况下)与如
$ echo >> /usr/local/share/app-engine-python/lib/cacerts/urlfetch_cacerts.txt
$ openssl x509 -subject -in server.crt >> /usr/local/share/app-engine-python/lib/cacerts/urlfetch_cacerts.txt
使用PEP-0476解决方法禁用ssl HTTPs检查,即
ssl._create_default_https_context = ssl._create_unverified_context
在import ssl(1149行左右)或之后google/appengine/dist27/python_std_lib/httplib.py
这在Mac上尤其成问题,因为从XCode 7/OS X El Capital降级不再是一个实用的选择.
每次更新开发应用程序服务器时,更好的解决方法都不会涉及对AppEngine代码进行猴子修补.
编辑
请注意,Mac内置的OpenSSL证书存储在/System/Library/OpenSSL其中,受到SIP /无根的保护,如果可以的话,坦率地说这很麻烦并且值得保留.
我已经验证证书通过使用验证openssl s_client -connect localhost:7500 -CAfile server.pem.
它被添加到Keychain中,并添加到散列来自/usr/local/etc/openssl/certs的hash.#格式openssl x509 -subject_hash -in server.pem(或者自制软件ssl,即/usr/local/Cellar/openssl/1.0.2d_1/bin/openssl).在这种情况下/usr/local/Cellar/openssl/1.0.2d_1/bin/openssl s_client -connect localhost:7500验证证书(但python仍然没有).
我曾尝试使用自制的python和openssl版本,但无济于事.在Python中运行以下似乎总是失败;
./pve/bin/python -c "import requests; requests.get('https://localhost:7500')"
Run Code Online (Sandbox Code Playgroud)
如果SSL_CERT_FILE设置为服务器的证书,也会失败(即,对于添加的度量,可能期望它起作用,因为openssl命令基本上像这样工作),并且在SSL_CERT_PATH设置为的地方也失败/usr/local/etc/openssl/certs.
注意,pve是一个help(ssl)显示a FILE的虚拟环境/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py
进一步验证自制的Python _ssl.so链接到自制程序的openssl我运行:
xcrun otool -L /usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_ssl.so
返回
./Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_ssl.so:
/usr/local/opt/openssl/lib/libssl.1.0.0.dylib(兼容性版本1.0.0,当前版本1.0.0)
/usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib(兼容性版本1.0.0,当前版本1.0.0)
/usr/lib/libSystem.B.dylib(兼容版本1.0.0,当前版本1225.1.1)
如果一个人运行brew info openssl它的评论CAVEATS如下:
已使用系统密钥链中的证书引导CA文件.要添加其他证书,请将.pem文件放在/ usr/local/etc/openssl/certs中
但显然由于某种原因,python没有使用自制软件的openssl算法来查找证书.
所以,我仍然处于亏损状态,为什么Python标准库未确认是在文件以及钥匙串指定的OpenSSL的目录证书(在.pem和.p12格式,以"永远信赖"的Secure Sockets Layer (SSL)).
小智 8
这是dev_appserver由httplib.HTTPSConnection最近的一些Python版本中的行为更改(默认情况下打开证书检查)导致的错误(我相信2.7.9).
由于该错误位于独立于经过测试的应用程序运行的内部dev_appserver代码(google_appengine/google/appengine/api/urlfetch_stub.pyappengine SDK的文件)中,因此无法在SDK更新后继续进行修复.
我能想到的唯一永久性解决方法是启用CA证书validate_certificate并将其添加到文件中.作为临时修复,您可以使用变通方法#3 进行修补.urlfetch_cacerts.txturlfetch_stub.py
| 归档时间: |
|
| 查看次数: |
2776 次 |
| 最近记录: |