繁体   English   中英

AppEngine urlfetch validate_certificate=False/None 不被尊重

[英]AppEngine urlfetch validate_certificate=False/None not being respected

在 AppEngine 开发人员应用程序服务器中,我收到如下错误:

SSLCertificateError: Invalid and/or missing SSL certificate for URL ...

当我使用自签名证书对https服务器进行这样的提取时(几乎总是通过 ssh 将localhost端口转发到虚拟机):

result = urlfetch.fetch(url=url, method=method, payload=payload,
                        deadline=DEADLINE, validate_certificate=None)

人们不会期望 SSL 无效证书失败,其中validate_certificateFalse ,尽管这很可能是 Python 中的 2.7.9 策略始终验证 ssl 证书的副作用。

请注意,为validate_certificate传递False (而不是None )也不起作用。

此问题发生在 Python 2.7.9-10 上,通过 OS X 10.10.2-4 上的 Homebrew/XCode 和 AppEngine 1.9.18 到 1.19.26。

Google App Engine 上存在关于此的问题(例如12096 ),但我正在寻找解决方法。

这是我试图解决的问题:

  1. 将证书添加到 Mac 的登录钥匙串(在浏览器中工作,而不是在 Python 中工作)

  2. 将证书添加到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

  3. 使用PEP-0476解决方法禁用 ssl HTTPs 检查即

    ssl._create_default_https_context = ssl._create_unverified_context

    import ssl google/appengine/dist27/python_std_lib/httplib.py的 ssl(大约第 1149 行)时或之后

这在 Mac 上尤其成问题,因为从 XCode 7/OS X El Capital 开始降级不再是一个实用的选择。

一个更好的解决方法是不涉及在每次更新开发应用程序服务器时适当地猴子修补 AppEngine 代码。


编辑

请注意,Mac 内置的 OpenSSL 证书存储在/System/Library/OpenSSL中,它受到SIP/rootlessness的保护,坦率地说,处理起来很麻烦,但如果可以的话,这是一个值得保留的功能。

我已经通过使用openssl s_client -connect localhost:7500 -CAfile server.pem验证了证书是否有效。

它已添加到钥匙串和/usr/local/etc/openssl/certs中,格式为hash.# ,其中 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 /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')"

这也会在SSL_CERT_FILE设置为服务器证书的情况下失败(即,为了增加措施,人们可能希望它起作用,因为openssl命令基本上是这样工作的),并且在SSL_CERT_PATH设置为/usr/local/etc/openssl/certs的情况下也会失败.

注意, pve是一个虚拟环境,其中help(ssl)显示/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.pyFILE

进一步验证自制软件 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) )。

这是一个由最近的 Python 版本(我相信 2.7.9)中的httplib.HTTPSConnection行为更改(默认情况下启用证书检查)引起的dev_appserver错误。

由于该错误位于独立于测试应用程序运行的内部dev_appserver代码(appengine SDK 的文件google_appengine/google/appengine/api/urlfetch_stub.py )中,因此无法进行修复,使其在 SDK 更新后仍然有效。

我能想到的唯一永久解决方法是启用validate_certificate并将CA证书添加到urlfetch_cacerts.txt文件中。 作为临时修复,您可以使用解决方法 #3 修补urlfetch_stub.py

我在 Windows 上遇到了同样的问题。 我使用的是旧版本的 Python (2.7)。 当我升级到 Python 2.7.11 时,问题就消失了。

在我的情况下,解决此问题的解决方法是将 .../google-cloud-sdk/platform/lib/third_party/fancy_urllib 文件夹复制到项目文件夹。

否则 _SetupSSL 中的 urlfetch_stub.py 调用 importfancy_urllib 调用 ImportError: No module named Fantasy_urllib

西南:

  • Ubuntu 18.04
  • 蟒蛇 2.7.17 / 2.7.12
  • 谷歌云 SDK 319.0.0

警告:root:/Users/<用户名>/Library/Python/2.7/lib/python/site-packages/lib/cacerts/urlfetch_cacerts.txt 丢失; 没有这个 urlfetch 将无法验证 SSL 证书。

这是对我有用的

cd /Users/<username>/Library/Python/2.7/lib/python/site-packages/lib

谷歌云 SDK 在/Users/<username>/Documents/libraries/google-cloud-sdk/

sudo ln -s /Users/<username>/Documents/libraries/google-cloud-sdk/platform/google_appengine/lib/cacerts cacerts

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM