背景
次のようにyoutube-dlのコマンドを叩くと,SSL: CERTIFICATE_VERIFY_FAILED
のエラーが吐かれてしまうことがあります.それについての原因と解決策と書いていきます.
youtube-dl `url`
ERROR: Unable to download webpage: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1045)> (caused by URLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1045)')))
どうやらpyhon3.6の不具合で,証明書のパスが通らなくなってしまうことがあるみたいです.
バグの詳細が気になる方はpython3.6のbugtrackerはこちらです.
解決策1
最も簡単な方法はSSLでエラーが起きているなら,HTTPで通信するということです.
コマンドに--no-check-certificate
のオプションをつけることでSSL証明書なしでダウンロードできます.
youtube-dl `url` --no-check-certificate
解決策2
やっぱりSSLで通信したほうがいいよねと思う方もいることでしょう.
証明書のパスが通っていないので,通せばいいだけです.
certifi
というパッケージが簡単にpython3.6の証明書の場所を教えてくれます.
pip3 install --upgrade certifi
簡単にpython3のインタプリタでパスを尋ねます.
>>> import certifi
>>> certifi.where()
'/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/certifi/cacert.pem'
これでpemファイル(SSL証明書)の場所が分かったので,パスを通します.
export SSL_CERT_FILE=/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/certifi/cacert.pem
これでパスが通ったので,無事にSSLのエラーがなく,youtube-dlのコマンドを使うことができます.exportなので,bashrcやzshrcなどに書いておくと便利かもです.
Reference
StackOverflow Certificate Verification Failure for youtube-dl