Python使用minio上传文件时urllib3的SSL报错
问题出现
minio的服务器一直使用的是http进行访问,但是最近因为业务要求,全部都换成了https请求。换成https之后,上传文件就会报此错:urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host=‘10.10.30.241’, port=9000): Max retries exceeded with url: /facebook?location= (Caused by SSLError(SSLCertVerificationError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1124)’)))
解决方法一
因为我看到了报错是urllib报错,所以我直接去翻了urllib源码,直接修改了urllib3源码得以解决.
修改文件是:connectionpool.py
修改connectionpool.py文件第775行:
self.cert_reqs = 'CERT_NONE'
解决方法二
第一个方法解决是解决了,但是极其不方便。
因为你要换地方部署脚本或者重新安装时,每次都需要进源码修改。
之后我又翻了minio源码,找到了问题所在
minio里面的urliib并没有关闭ssl验证,我本来想在这里改,但是想到在这里改还是修改源码啊,我仔细看了下发现个参数:http_client
我们只需要在创建minio对象的时候自定义这个参数就可以了
minioClient = Minio(
'1.1.1.1:9000',
access_key='mxxxxxxx',
secret_key='mxxxxxxx',
http_client=urllib3.PoolManager(
timeout=urllib3.util.Timeout(connect=10, read=10),
maxsize=10,
cert_reqs='CERT_NONE',
ca_certs= os.environ.get('SSL_CERT_FILE') or certifi.where(),
retries=urllib3.Retry(
total=5,
backoff_factor=0.2,
status_forcelist=[500, 502, 503, 504]
)
)
# secure=False
)
至此问题解决
附minio文件上传全部代码
import logging
from minio import Minio
from minio.error import S3Error
import urllib3
import certifi
import os
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
logging.basicConfig(
level=logging.INFO,
filename='../mysqlbackup_up.log',
filemode='a',
format='%(asctime)s %(name)s %(levelname)s--%(message)s'
)
# 确定要上传的文件
def upload_file(file_name, file_path):
# 创建一个客户端
minioClient = Minio(
'1.1.3.1:9000',
access_key='mxxxxx',
secret_key='mxxxxxx',
http_client=urllib3.PoolManager(
timeout=urllib3.util.Timeout(connect=10, read=10),
maxsize=10,
cert_reqs='CERT_NONE',
ca_certs= os.environ.get('SSL_CERT_FILE') or certifi.where(),
retries=urllib3.Retry(
total=5,
backoff_factor=0.2,
status_forcelist=[500, 502, 503, 504]
)
)
# secure=False
)
# 判断桶是否存在
check_bucket = minioClient.bucket_exists("test")
if not check_bucket:
minioClient.make_bucket("test")
try:
logging.info("start upload file")
minioClient.fput_object(bucket_name="test", object_name=file_name, file_path=file_path)
logging.info("file {0} is successfully uploaded".format(file_name))
print('成功')
except FileNotFoundError as err:
print(err)
logging.error('upload_failed: ' + str(err))
except S3Error as err:
print(err)
logging.error("upload_failed:", err)