Python ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:749)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/41691327/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)
提问by Dan Little
I am trying to use the betbrain.py from Github (https://github.com/gto76/betbrain-scraper) that has the following code:
我正在尝试使用来自 Github ( https://github.com/gto76/betbrain-scraper)的 betbrain.py ,它具有以下代码:
#!/usr/bin/python3
#
# Usage: betbrain.py [URL or FILE] [OUTPUT-FILE]
# Scrapes odds from passed betbrain page and writes them to
# stdout, or file if specified.
import os
import sys
import urllib.request
from bs4 import BeautifulSoup
from http.cookiejar import CookieJar
import parser_betbrain
import printer
DEFAULT_URL = 'https://www.betbrain.com/football/england/premier-league/#!/matches/'
# If no arguments are present, it parses the default page.
# Argument can be an URL or a local file.
def main():
html = getHtml(sys.argv)
soup = BeautifulSoup(html, "html.parser")
matches = parser_betbrain.getMatches(soup)
string = printer.matchesToString(matches)
output(string, sys.argv)
def getHtml(argv):
if len(argv) <= 1:
return scrap(DEFAULT_URL)
elif argv[1].startswith("http"):
return scrap(argv[1])
else:
return readFile(argv[1])
# Returns html file located at URL.
def scrap(url):
cj = CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
try:
return opener.open(url)
except ValueError:
error("Invalid URL: " + url)
def readFile(path):
try:
return open(path, encoding='utf8')
except IOError:
error("Invalid input filename: " + path)
def output(string, argv):
if len(argv) <= 2:
print(string)
else:
writeFile(argv[2], string)
def writeFile(path, string):
try:
fo = open(path, "w", encoding='utf8')
fo.write(string);
fo.close()
except IOError:
error("Invalid output filename: " + path)
def error(msg):
msg = os.path.basename(__file__)+": "+msg
print(msg, file=sys.stderr)
sys.exit(1)
if __name__ == '__main__':
main()
However when run it comes back with this error
但是,当运行时它会返回此错误
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 1318, in do_open
encode_chunked=req.has_header('Transfer-encoding'))
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1239, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1285, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1234, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1026, in _send_output
self.send(msg)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 964, in send
self.connect()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1400, in connect
server_hostname=server_hostname)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 401, in wrap_socket
_context=self, _session=session)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 808, in __init__
self.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 1061, in do_handshake
self._sslobj.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 683, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/Daniel/Desktop/betbrain-scraper-master 2/betbrain.py", line 71, in <module>
main()
File "/Users/Daniel/Desktop/betbrain-scraper-master 2/betbrain.py", line 22, in main
html = getHtml(sys.argv)
File "/Users/Daniel/Desktop/betbrain-scraper-master 2/betbrain.py", line 30, in getHtml
return scrap(DEFAULT_URL)
File "/Users/Daniel/Desktop/betbrain-scraper-master 2/betbrain.py", line 41, in scrap
return opener.open(url)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 526, in open
response = self._open(req, data)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 544, in _open
'_open', req)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 504, in _call_chain
result = func(*args)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 1361, in https_open
context=self._context, check_hostname=self._check_hostname)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 1320, in do_open
raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)>
How can I fix this problem? I am running Python 3.6.0 on MacOS 10.12.1
我该如何解决这个问题?我在 MacOS 10.12.1 上运行 Python 3.6.0
回答by Scovetta
Open a terminal and take a look at:
打开终端并查看:
/Applications/Python 3.6/Install Certificates.command
Python 3.6 on MacOS uses an embedded version of OpenSSL, which does not use the system certificate store. More details here.
MacOS 上的 Python 3.6 使用嵌入式版本的 OpenSSL,它不使用系统证书存储。更多细节在这里。
(To be explicit: MacOS users can probably resolve by opening Finder and double clicking Install Certificates.command)
(明确地说:MacOS 用户可能可以通过打开 Finder 并双击Install Certificates.command来解决)
回答by Nagalakshmi Srirama
I ran this on MacOS /Applications/Python\ 3.6/Install\ Certificates.command
我在 MacOS 上运行这个 /Applications/Python\ 3.6/Install\ Certificates.command
回答by Joe Jadamec
On CentOS Linux, Python3.6, I edited this file (make a backup copy first)
在 CentOS Linux、Python3.6 上,我编辑了这个文件(先做一个备份副本)
/usr/lib/python3.6/site-packages/certifi/cacert.pem
to the end of the file, I added my public certificate from my .pem file. you should be able to obtain the .pem file from your ssl certificate provider.
在文件的末尾,我从我的 .pem 文件中添加了我的公共证书。您应该能够从您的 ssl 证书提供商处获取 .pem 文件。
回答by S.Harini Sudarsan
Here's how I fixed it:
这是我修复它的方法:
- Opened the Install Cerificates.Command.The shell script got executed.
- Opened the Python 3.6.5 and typed in
nltk.download()
.The download graphic window opened and all the packages got installed.
- 打开安装 Cerificates.Command.Shell 脚本被执行。
- 打开 Python 3.6.5 并输入
nltk.download()
。下载图形窗口打开,所有包都安装好了。