環境
- OS: Windows 10 Pro 21H1 (19043.1320)
- Python: 3.8
- PyMongo: 3.12.1
状況
PythonのライブラリであるPyMongoを使って、MongoDB Atlasで作ったクラスタに接続しようとすると、下記のような例外が発生し、接続することができませんでした。
pymongo.errors.ServerSelectionTimeoutError: hogehoge-shard-00-00.usai2.mongodb.net:27017:
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1124)
解決策
StackOverflowにて、解決方法が回答されていました。
エラーの原因としては、自身のWindowsクライアントにインストールLet’s Encryptのルート証明書(ISRG Root X1)または中間証明書(Let’s Encrypt R3)の有効期限が切れているからのようです、たぶん。
(MongoDB AtlasはLet’s Encryptを使用している)
確認してみると、自分の場合は中間証明書の期限が切れていました。(注:今回の事象発生は2021/10/29)
ですので、期限が切れている証明書を更新します。まず、下記ページにアクセスします。
ルート証明書を更新する必要がある場合は、「Root Certificates」->「Active」->「ISRG Root X1」->「der」をクリックして、証明書をダウンロードします。
中間証明書を更新する必要がある場合は、「Intermediate Certificates」->「Active」->「Let’s Encrypt R3」->「der」をクリックして、証明書をダウンロードします。
あとは、ダウンロードした証明書をそれぞれインストールするだけです。
ダウンロードした証明書ファイルをダブルクリックして開きます。
セキュリティの警告が表示された場合は、そのまま「開く」をクリックします。
有効期限が切れていないことを確認し、「証明書のインストール」をクリックします。
インポートウィザードが開きます。保存場所は任意の場所を選択し、「次へ」をクリックします。
「証明書の種類に基づいて、自動的に証明書ストアを選択する」を選択し、「次へ」をクリックします。
「完了」をクリックします。
「正しくインポートされました。」というメッセージが表示されるので、「OK」をクリックします。
証明書ウィンドウも「OK」をクリックして閉じます。
以上で、新しい証明書がインストールできました。
証明書を更新することで、正常にMongoDB Atlasのクラスタへ接続することができました。