当前位置: 首页 > 知识库问答 >
问题:

获取[SSL:CERTIFICATE_VERIFY_FAILED]错误时,试图在geopy中运行地理编码器如何验证证书以获得所需的输出?

阎知
2023-03-14

我正在学习一门关于蟒蛇的乌德米课程,我正在和熊猫一起工作。目前,我正在使用geopy来尝试返回输入地址的坐标。特别是,我正在运行ArcGIS地理代码,但当我运行它时,我收到一个SSL错误,说它无法获得SSL证书。我将在此处包含代码和错误:

这是我尝试运行的代码,并会得到输出。下面是我实际得到的输出:

In [1]: from geopy.geocoders import ArcGIS
...: nom = ArcGIS()
...: nom.geocode("3995 23rd St, San Francisco, CA 94114")
Out[1]: Location(3995 23rd St, San Francisco, California, 94114,      (37.75298458728149, -122.4317017142651, 0.0))

>>> import geopy
>>> from geopy import ArcGIS
>>> nom = ArcGIS()
>>> nom.geocode("3995 23rd St, San Francisco, CA 94114")

回溯(最近一次调用):文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py”,第 1317 行,在 do_open encode_chunked=req.has_header('Transfer-encoding')) 文件中 “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py”,第 1229 行,在请求 self._send_request(method、url、body、headers、encode_chunked) 文件中 “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py”, 第 1275 行,在 _send_request self.endheaders(body, encode_chunked=encode_chunked) 文件 “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py”中,第 1224 行,在 endheaders self._send_output(message_body, encode_chunked=encode_chunked) 文件中 “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py”, 第 1016 行,在 _send_output self.send(msg) 文件 “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py”, 第 956 行,在 send self.connect() 文件中 “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py”,第 1392 行,在 connect server_hostname=server_hostname) 文件 “/Library/Frameworks/Python/Python.framework/Versions/3.7/lib/python3.7/ssl.py”中,第 412 行,在 wrap_socket session=session 文件中 “/Library/Frameworks/Python/Python.framework/Versions/3.7/lib/lib.py”,第 853 行,在 _create self.do_handshake() 文件中 “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py“,第 1117 行,位于 do_handshake self._sslobj.do_handshake() SSL 中。SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败: 无法获取本地颁发者证书 (_ssl.c:1056)

在处理上述异常期间,发生了另一个异常:

回溯(最近一次调用):文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/geopy/geocoders/base.py”,第 344 行,在 _call_geocoder page = requester(req, timeout=timeout, **kwargs) 文件 “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py”,第 525 行,在打开响应中 = self._open(req, data) 文件 “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py”, 第 543 行,_open '_open',req) 文件 “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py”,第 503 行,在 _call_chain result = func(*args) 文件 “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py”, 第 1360 行,在 https_open context=self._context, check_hostname=self._check_hostname) 文件 “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py”, 第 1319 行,在 do_open 中引发 URLError(err) urllib.error.URLError:

在处理上述异常期间,发生了另一个异常:

Traceback(最近一次调用last): File " ",第1行,在文件“/Library/Frameworks/python . framework/Versions/3.7/lib/python 3.7/site-packages/geo py/geocoders/ArcGIS . py”中,第195行,在geocode response = self中。_call_geocoder(url,time out = time out)File "/Library/Frameworks/python . framework/Versions/3.7/lib/python 3.7/site-packages/geo py/geocoders/base . py ",第375行,in _ call _ geocoder raise GeocoderServiceError(message)GeocoderServiceError:[SSL:CERTIFICATE _ VERIFY _ FAILED]证书验证失败:无法获取本地颁发者证书(_ssl.c:1056)

共有2个答案

公西修文
2023-03-14

从GeoPy文档中:您可以通过certifi将GeoPy的地理编码器链接到您的自定义TLS验证设置。

import ssl
import certifi
import geopy.geocoders
ctx = ssl.create_default_context(cafile=certifi.where())
geopy.geocoders.options.default_ssl_context = ctx
燕照
2023-03-14

好的,我实际上已经找到了一个似乎对此有效的解决方案。以下代码使我能够更新和/或安装我的系统似乎没有或没有注意到的任何所需的SSL证书。我将附加代码以及我发现工作解决方案的堆栈和源代码来源的Github:

# install_certifi.py
#
# sample script to install or update a set of default Root Certificates
# for the ssl module.  Uses the certificates provided by the certifi package:
#       https://pypi.org/project/certifi/
import os
import os.path
import ssl
import stat
import subprocess
import sys
STAT_0o775 = ( stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR
             | stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP
             | stat.S_IROTH |                stat.S_IXOTH )
def main():
    openssl_dir, openssl_cafile = os.path.split(
        ssl.get_default_verify_paths().openssl_cafile)
    print(" -- pip install --upgrade certifi")
    subprocess.check_call([sys.executable,
        "-E", "-s", "-m", "pip", "install", "--upgrade", "certifi"])
    import certifi
    # change working directory to the default SSL directory
    os.chdir(openssl_dir)
    relpath_to_certifi_cafile = os.path.relpath(certifi.where())
    print(" -- removing any existing file or link")
    try:
        os.remove(openssl_cafile)
    except FileNotFoundError:
        pass
    print(" -- creating symlink to certifi certificate bundle")
    os.symlink(relpath_to_certifi_cafile, openssl_cafile)
    print(" -- setting permissions")
    os.chmod(openssl_cafile, STAT_0o775)
    print(" -- update complete")
if __name__ == '__main__':
    main()

这是我找到解决方案的堆栈。这里是来源的Github。

我亲自将此代码复制到Sublime并将其保存为. py文件,然后在python3中运行程序。运行程序后,我尝试使用ArcGIS重新运行我的geopy程序,现在成功接收了请求的坐标。

我希望这有帮助!

 类似资料:
  • 我正在使用Py魅力和python 3.8和最新版本的不和谐。我试图运行这个脚本,但得到了这个错误。有人能帮忙吗? -------以下------ 错误 /Users/mellie/PycharmProjects/Dominations/venv/bin/python/Users/mellie/PycharmProjects/Domi。py回溯(最后一次调用):文件“/Users/mellie/Py

  • - 我运行了此脚本,但出现了此错误。我怎么做?

  • 我正在尝试使用python从web获取数据。我导入了urllib。请求包,但在执行时,我得到错误: 我正在Mac OS High Sierra上使用Python 3.7 当我将URL更改为“http”时,我能够获取数据。但是,我相信,这可以避免检查SSL证书。 因此,我在互联网上查找并找到了一个解决方案:运行 这解决了我的问题。但是我对SSL之类的东西一无所知。你能帮我理解它到底做了什么来解决我的

  • 错误: TypeError:无法读取未定义的LoginForm c:/reactjs/hello-world/src/components/accountbox/LoginForm.js的属性“state”:23 2023 value={this.state.input.email}^24 onchange={this.handlechange}25 class=“form-control”26

  • 接口说明 获取验证码图片 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 如开启https功能,请求地址的协议应改为https,如:https://www.example.com/wish3dearth/api/access/v1.0.0/getLicenseInfo API地址 GET /authcenter/api/verify/v1.0.0/cap

  • 我试图在我的应用程序中启用SSL,为此我必须在CACERTS中更新PFX证书。下面是我所做的步骤,但是当我试图在CACERTS中导入PFX时,我得到了低于错误的结果。 keytool-certreq-alias abc03.dc.abc.com-keystore/opt/logo/certificates/abc03.dc.abc.com.jks-file/opt/logo/certificate