gpt4 book ai didi

python - "WindowsError: [Error 5] Access is denied"使用 urllib2

转载 作者:可可西里 更新时间:2023-11-01 13:26:08 26 4
gpt4 key购买 nike

我在使用 urllib2 读取网站时收到“WindowsError:[错误 5] 访问被拒绝”消息。

from urllib2 import urlopen, Request
from bs4 import BeautifulSoup

hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11'}
req = Request('https://' + url, headers=hdr)
soup = BeautifulSoup( urlopen( req ).read() )

完整的追溯是:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "C:\Python27\lib\urllib2.py", line 431, in open
response = self._open(req, data)
File "C:\Python27\lib\urllib2.py", line 449, in _open
'_open', req)
File "C:\Python27\lib\urllib2.py", line 409, in _call_chain
result = func(*args)
File "C:\Python27\lib\urllib2.py", line 1240, in https_open
context=self._context)
File "C:\Python27\lib\urllib2.py", line 1166, in do_open
h = http_class(host, timeout=req.timeout, **http_conn_args)
File "C:\Python27\lib\httplib.py", line 1258, in __init__
context = ssl._create_default_https_context()
File "C:\Python27\lib\ssl.py", line 440, in create_default_context
context.load_default_certs(purpose)
File "C:\Python27\lib\ssl.py", line 391, in load_default_certs
self._load_windows_store_certs(storename, purpose)
File "C:\Python27\lib\ssl.py", line 378, in _load_windows_store_certs
for cert, encoding, trust in enum_certificates(storename):
WindowsError: [Error 5] Access is denied

我已经尝试按照建议从具有管理员权限的命令提示符运行脚本 here , 但它不能解决问题。

关于如何解决这个错误有什么建议吗?

最佳答案

这看起来像是 Windows 证书存储不一致。 httplib - 由 urllib2 内部调用- 最近从无服务器证书验证改为默认强制执行服务器证书验证。因此,您将在任何基于 urllib 的 python 脚本中遇到此问题。 , httplib并在您的用户配置文件中运行。

也就是说,您的 Windows 证书存储区似乎出了点问题。 httplib尝试为指定的证书存储区枚举证书时失败 CA certification authority (在 Intermediate Certification Authorities 中显示为 certmgr.msc )但成功用于 ROOT这是正常的受信任根证书存储(请参阅问题评论)。因此,我建议检查 certmgr:intermediate certificate authorities 中的所有证书最近添加的证书和/或一般错误的 Windows 日志。你的情况是urllib2内部调用 httplib然后尝试设置默认的 ssl 上下文,并强制执行证书验证,作为其中的一部分,它通过调用 ssl.enum_certificates 枚举系统的可信证书 anchor 。 .此函数is implementedC作为_ssl_enum_certificates_impl并在内部调用 WINAPIs CertOpenSystemStoreCertEnumCertificatesInStore .对于证书存储位置 CA它只是在访问被拒绝的两个 winapi 调用之一中失败。

如果你想进一步调试这个你也可以尝试manually invoke WINAPI:CertOpenSystemStoreLPTCSTR::'CA'作为一个参数并尝试从这一端调试它,尝试其他 Windows certstore 管理工具和/或调用 Microsoft 支持以获得帮助。

也有迹象表明其他人在连接该 api 调用时遇到了类似的问题,请参阅 google:access denied CertOpenSystemStore

如果您只是想让它工作而不修复根本原因,您可以尝试使用以下解决方法来临时修补 _windows_cert_stores不包括损坏的 CA certstore 或完全禁用信任 anchor 加载逻辑。 (所有其他 ssl.SSLContext 调用将在当前进程中修补)

请注意,这实际上会禁用服务器证书验证。

ssl.SSLContext._windows_cert_stores = ("ROOT",)         # patch windows_cert_stores default to only include "ROOT" as "CA" is broken for you.
#ssl.SSLContext.load_default_certs = lambda s,x:None # alternative, fully NOP load_default_certs to do nothing instead.
ctx = ssl.create_default_context() # create new sslcontext, not veryfing any certificates, hostnames.
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11'}
req = Request('https://' + url, headers=hdr)
x = urlopen( req , context=ctx).read()
ssl.SSLContext._windows_cert_stores = ("ROOT","CA") # UNDO PATCH

希望这些信息能帮助您解决问题。祝你好运。

关于python - "WindowsError: [Error 5] Access is denied"使用 urllib2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33264502/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com