youtube-dl的证书验证失败

时间:2018-01-02 16:55:49

标签: python macos youtube

我正在尝试使用以下命令从YouTube视频中获取音频:

youtube-dl --extract-audio --audio-format mp3 [video link]

每次我尝试在macOS(High Sierra v10.13.2)的终端上运行此命令时,它都会给我这个错误:

ERROR: Unable to download webpage: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)> (caused by URLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)'),))

注意:我安装了youtube-dl,还有Python 2.7和Python 3.6(如果有帮助的话)

如果有人可以帮我解决这个问题,那就太棒了。

2 个答案:

答案 0 :(得分:1)

我已经有这个问题了一段时间,但从来没有能够解决它。所以我做了

的临时修复

[终端]

  
    

- 没有检查证书

  

可悲的是,这只是将您的HTTPS youtube-dl请求转换为纯文本HTTP请求。

经过一番挖掘后,我发现这是一个Python v3.6问题。

https://bugs.python.org/issue29065#msg283984

如果您使用VIM或任何编辑来检查

vim '/Applications/Python 3.6/ReadMe.rtf'

如果您寻找(证书验证和OpenSSL \) 你会看到......

在安装Python v3.6期间,他们决定使用自己的私有版本的OpenSSL,遗憾的是,它本身不能使用默认的根证书。但是,它附带一个命令脚本来安装一组策略的默认根证书。

该bug推荐我使用python certifi模块。这些模块似乎很适合查找证书的位置。

[Python v3.6]

  
    

import certifi

         

certifi.where()

         

'/库/框架/ Python.framework /版本/ 3.6 / LIB / python3.6 /站点包/ CERTIFI / cacert.pem'

  

那真的只是说明了它的位置,但是为了以防万一,我使用了python终端解释器。

[终端]

  
    

打开'/ Applications / Python 3.6 /安装Certificates.command'

  

我个人这是我的终极回应...

[终端]

  
    

- pip install --upgrade certifi

         

要求已经是最新的:/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages中的证书

         

- 删除任何现有文件或链接

         

- 创建符号链接到证书证书包

         

- 设置权限

         

追踪(最近一次呼叫最后一次):

         

文件“”,第44行,

         

文件“”,第40行,主要

         

PermissionError:[Errno 1]不允许操作:'cert.pem'

         

注销

         

保存会话...

         

...复制共享历史记录......

         

...保存历史记录...截断历史记录文件...

         

...完成。

         

[已完成处理]

  

但它工作了,我无需处理任何SSL验证失败! (-.-)\ /( - .-)/

答案 1 :(得分:0)

我将尝试针对此问题采取适当的方法,而不仅仅是列出对我有用的方法。以下内容不需要Install Certificates.command脚本,该脚本可能会或可能不会与Python一起安装。


问题根源

需要指出的是,错误的根源不是Python本身。仔细查看错误消息,您会发现Python只是传达了OpenSSL库(由_ssl.c调用)产生的错误。如果您使用的Python是使用homebrew安装的,则可能有更多使用自制软件安装的网络实用程序(例如wget)也有类似的问题。

这意味着为了解决该问题,我们需要确保Python使用的OpenSSL库可以访问有效的最新证书包。


找到正确的OpenSSL库

由于系统上可能安装了许多OpenSSL库,因此需要找到Python解释器使用的库。 OpenSSL库由ssl Python模块加载,因此我们需要首先找到它:

pyssld=$(python3 -c 'import ssl, pathlib; print(pathlib.Path(ssl.__file__).parent)')
echo "$pyssld"

这将打印出目录,我们应该在其中寻找ssl用来加载OpenSSL的C库。这是通过以下命令完成的:

pyssl=$(find "$pyssld" -iname '*ssl*.so')
echo "$pyssl"

最后,我们可以检查Python ssl模块加载的OpenSSL库的位置:

pyopenssl=$(otool -L "$pyssl" | grep libssl | awk '{print $1}')
echo "$pyopenssl"

这将打印如下内容:

/opt/homebrew/opt/openssl@1.1/lib/libssl.1.1.dylib

这指向Python使用的OpenSSL库所在的位置。


解决问题

获取证书包

要获取与OpenSSL库一起使用的最新证书捆绑包,您可以安装Python certifi软件包。

pip3 install --upgrade certifi
cabundle=$(python3 -c 'import certifi; print(certifi.where())')
echo $cabundle

将新证书捆绑添加到OpenSSL

最后,我们需要将证书捆绑包放在OpenSSL可以找到它的地方。我们知道图书馆的位置。但是捆绑包存储在其他目录中。要跳到正确的目录并链接捆绑软件,请使用:

cd $(echo "$pyopenssl" | sed -E 's%/opt/(openssl[^/]*).*%/etc/\1%')
ln -sf "$cabundle" cert.pem

清理

在检查了一切正常之后,您现在可以清理我们使用的环境变量。

unset cabundle pyopenssl pyssl pyssld