Why it doesn't work?

作業のメモ、記録をブログに残しています。

Python requestsで SSLError(SSLCertVerificationError)が発生する

requestsであるサイトにアクセスすると以下のようなエラーが発生しました。

HTTPSConnectionPool(host='www.xxx.jp', port=443): Max retries exceeded with url: /rss/feed.rss (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1076)')))

一つや二つのサイトなら無視しようかなとも考えましたが、最近はかなりの数のサイトでエラーが発生するようになったので対策を調べてみました。

1. verifyオプションをFalseに設定する

2.python-requests.org
仕様によると、デフォルトではSSL認証がTrueになっているのが、Falseに指定することでSSL認証が行われなくなります。

res = requests.get(https://'www.xxx.jp', verify=False)

レスポンスのステータスも200と期待通りの動作となりますが、かえって多くのサイトで以下のような警告が発生するようになりになり、よけい鬱陶しいことになりました。

C:\Work\Python\Python37\lib\site-packages\urllib3\connectionpool.py:851: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)

2. urllib3の警告を非表示にする

と言うわけで、警告を非表示に設定してみます。

import requests
import urllib3
from urllib3.exceptions import InsecureRequestWarning
urllib3.disable_warnings(InsecureRequestWarning)
res = requests.get(https://'www.xxx.jp', verify=False)
print(res.status_code)

セキュアかどうかは別として、これで警告も出力されなくなりました。
今日はここまで