草庐IT

python - AppEngine urlfetch validate_certificate=False/None 不被尊重

coder 2023-08-16 原文

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

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

当我使用自签名证书(几乎总是通过 ssh 将https端口转发到虚拟机)对localhost服务器进行这样的提取时:
result = urlfetch.fetch(url=url, method=method, payload=payload,
                        deadline=DEADLINE, validate_certificate=None)

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

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

这个问题发生在 Python 2.7.9-10 上,通过 Homebrew/XCode 在 OS X 10.10.2-4 上使用 AppEngine 1.9.18 到 1.19.26。

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

这是我试图解决这个问题的方法:
  • 将证书添加到 Mac 的登录钥匙串(keychain)(在浏览器中工作,而不是来自 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
  • google/appengine/dist27/python_std_lib/httplib.py(第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验证了证书是否有效。

    它已被添加到钥匙串(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')"
    

    如果将SSL_CERT_FILE设置为服务器的证书(即,由于openssl命令基本上是这样工作的,因此可能会期望它起作用),这也会失败,并且在SSL_CERT_PATH设置为/usr/local/etc/openssl/certs的情况下也会失败。

    请注意,pve是一个虚拟环境,其中help(ssl)显示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 (compatibility version 1.0.0, current version 1.0.0)

    /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)

    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1225.1.1)



    如果运行brew info openssl,它会在CAVEATS下注释:

    A CA file has been bootstrapped using certificates from the system keychain. To add additional certificates, place .pem files in /usr/local/etc/openssl/certs



    但显然由于某种原因,python 没有使用自制软件的 openssl 算法来查找证书。

    因此,我仍然不知道为什么 Python 标准库不验证文档中指定的 OpenSSL 目录中的证书以及钥匙串(keychain)(.pem.p12格式,“始终信任”为Secure Sockets Layer (SSL))。

    最佳答案

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

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

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

    关于python - AppEngine urlfetch validate_certificate=False/None 不被尊重,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28866770/

    有关python - AppEngine urlfetch validate_certificate=False/None 不被尊重的更多相关文章

    1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    2. ruby - 默认情况下使选项为 false - 2

      这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

    3. Python 相当于 Perl/Ruby ||= - 2

      这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

    4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

      什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

    5. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

      华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

    6. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

      我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

    7. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

      本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

    8. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

      2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

    9. Python 刷Leetcode题库,顺带学英语单词(31) - 2

      ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

    10. ruby - 为什么 Integer.respond_to?( :even? ) 返回 false? - 2

      我一直在研究RubyKoans,我发现about_open_classes.rbkoan很有趣。特别是他们修改Integer#even?方法的最后一个测试。我想尝试一下这个概念,所以我打开了Irb并尝试运行Integer.respond_to?(:even?),但令我惊讶的是我得到了错误。然后我尝试了Fixnum.respond_to?(:even?)并得到了错误。我还尝试了Integer.respond_to?(:respond_to?)并得到了true,当我执行2.even?时,我也得到了true。我不知道发生了什么。谁能告诉我缺少什么? 最佳答案

    随机推荐