Openssl 在mac virtualenv上尝试youtube api时出现python ssl证书错误

Openssl 在mac virtualenv上尝试youtube api时出现python ssl证书错误,openssl,ssl-certificate,virtualenv,youtube-data-api,python-3.7,Openssl,Ssl Certificate,Virtualenv,Youtube Data Api,Python 3.7,在长时间的用头撞击Mac系统并试图理解我不知道的东西之后,我有点放弃了。但我仍在努力寻找答案。 我的问题是:我正在尝试用python实现一个简单的youtube API请求。 (注意:我并没有试图通过请求实现它,所以请不要回答说,将karwgs:verify传递给false)。 我还更新了证书,点击了命令,并尝试更新、安装openssl、ssl、certifi等等,但问题是它根本不起作用。 现在,我想我缺乏对系统的了解,但我的问题是,为什么我会出现这个错误: [![ssl.SSLCertVeri

在长时间的用头撞击Mac系统并试图理解我不知道的东西之后,我有点放弃了。但我仍在努力寻找答案。 我的问题是:我正在尝试用python实现一个简单的youtube API请求。 (注意:我并没有试图通过请求实现它,所以请不要回答说,将karwgs:verify传递给false)。 我还更新了证书,点击了命令,并尝试更新、安装openssl、ssl、certifi等等,但问题是它根本不起作用。 现在,我想我缺乏对系统的了解,但我的问题是,为什么我会出现这个错误:

[![ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'api%20key%201.googleapis.com'.][1]][1]
我想做的就是这样:

youtube = build(API_NAME, API_VERSION, developerKey=API_KEY)

早些时候,我认为这与我创建的虚拟环境有关,可能也是因为这个原因,这就引出了我的下一个问题,这就是为什么当我从ide进入“apiclient”时,它会将我带到一个文件,该文件位于usr\local\Cell\Frameworks…\python。。因为据我所知,我认为MAC上的usr\local\Cell是用于brew安装的。但无论如何,我的主要问题是如何解决这个ssl证书错误,所以如果有人能够帮助我,我将不胜感激

%20是十六进制的空白字符-这将使请求的DNS名称“apikey1.googleapis.com”成为非法的DNS名称(根据DNS RFCs,每个标签只允许有a-z a-z 0-9“-”和“”) 我不知道通配符证书能否解决这个问题,因为它取决于TLS实现如何验证标签/主机名。 因此,由于主机名设置错误,我想需要比您发布的代码多几行代码来解决这个问题。 下面是参考页面中的示例

尝试一下,看看问题是否仍然存在。如果是这样,可能是库中主机名设置错误的问题。如果问题得到解决,那么当前代码中的某些代码会弄乱主机名


Matt

经过4个小时的极度痛苦,然后在我朋友的系统中运行相同的代码,我发现这是因为api_service_name字段中的服务名称。这是令人困惑的,因为在API_名称的情况下,我认为我必须把这个名称放在谷歌控制台中,但事实并非如此。 我是为一个和我有同样问题的人而回答的

将您的api\u服务名称或api\u名称更改为“youtube”


希望这能帮助别人

我真的发现了我的错误。谢谢你的回复。我会把答案贴出来,以防万一,如果有人被困在这个问题上
# -*- coding: utf-8 -*-

# Sample Python code for youtube.channels.list
# See instructions for running these code samples locally:
# https://developers.google.com/explorer-help/guides/code_samples#python

import os

import googleapiclient.discovery

def main():
    # Disable OAuthlib's HTTPS verification when running locally.
    # *DO NOT* leave this option enabled in production.
    os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"

    api_service_name = "youtube"
    api_version = "v3"
    DEVELOPER_KEY = "YOUR_API_KEY"

    youtube = googleapiclient.discovery.build(
        api_service_name, api_version, developerKey = DEVELOPER_KEY)

    request = youtube.channels().list(
        part="id"
    )
    response = request.execute()

    print(response)

if __name__ == "__main__":
    main()