我好像无法将数据上传到我在atlas上托管的mongo数据库。我复制了这里发布的确切步骤。 https://www.w3schools.com/python/python_mongodb_insert.asp
import pymongo
import requests
url= "mongodb://jordan:*********@jordandb-shard-00-00-ykcna.mongodb.net:27017,jordandb-shard-00-01-ykcna.mongodb.net:27017,jordandb-shard-00-02-ykcna.mongodb.net:27017/test?ssl=true&replicaSet=JordanDB-shard-0&authSource=admin&retryWrites=true"
client = pymongo.MongoClient(url)
mydb = client.test
mycol = mydb["customers"]
mydict = {"name":"John", "adress":"Highway 37"}
x = mycol.insert_one(mydict)
print(client.list_database_names())
我收到超时错误。每一行都有效,直到我到达插入行(x = ....)。我正在使用pycharm和python 3.7。但是我也在jupyter上尝试了这个并且收到了同样的错误:
pymongo.errors.ServerSelectionTimeoutError: jordandb-shard-00-00-ykcna.mongodb.net:27017: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056),jordandb-shard-00-01-ykcna.mongodb.net:27017: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056),jordandb-shard-00-02-ykcna.mongodb.net:27017: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)
这有几个原因。 最明显的一个是你错过了证书链。
您可以通过以下方式获取链信息:
openssl s_client -showcerts -servername jordandb-shard-00-00-ykcna.mongodb.net -connect jordandb-shard-00-00-ykcna.mongodb.net:27017 </dev/null
哪个会告诉你它来自DigiCert。因此,要么您缺少本地证书库中的证书链(某些发行版可能需要您安装root ca信任)。但是如果你确实安装了root ca。是时候检查证书的验证时间了。
如果您添加| openssl x509 -noout -dates
,您将获得此证书的有效日期:
openssl s_client -showcerts -servername jordandb-shard-00-00-ykcna.mongodb.net -connect jordandb-shard-00-00-ykcna.mongodb.net:27017 </dev/null | openssl x509 -noout -dates
这告诉您证书来自DigiCert。
证书从7/02-19 00:00 GMT
到11/2-19 12:00 GMT
有效。
在任何终端运行date
应该有希望告诉你,你处于这两个日期之间。
在任何其他情况下,我会说这是由于自签名证书。 在这种情况下,您需要做以下两件事之一:
MongoClient(..., ssl_ca_certs='/path/to/ca.pem')
MongoClient(..., ssl_cert_reqs=ssl.CERT_NONE)
要么提供自定义CA,要么告诉Mongo忽略证书验证(后者是最糟糕的选择。即使你说“我不会忘记稍后解决”,呵呵)。
你可以使用pymongo默认功能
connObj = MongoClient(MONGO_HOST, MONGO_PORT)
connObj[MONGO_DB].authenticate(MONGO_UNAME, MONGO_PASSWD)