系统【Centos 7.1.1503】
python【Python 3.6.1】
最近在写docker的一些小工具,docker registry使用要求必须是https方式进行连接,如果不是https连接则会报错不安全。
docker login registry.xxx.com
所以我在本地搭建了私有registry基于v2版本,网上很多都是v1版本的,那个已经淘汰过时了,很多人会坑在那个上面.
我们访问docker registry api可以查询镜像列表和tag列表,这是我目前做的最基本的功能。
我使用pycharm进行开发,因为我使用自己生成的CA证书,我之前就已经把CA导入本地可信任列表中所以我用python访问一直没有问题。
当我把脚本放到centos7环境时就不行了。
代码如下
#!/usr/bin/python # -*- coding: utf-8 -*- #by typ #docker registry列表 import urllib.request import sys import json import ssl registry_url="https://registry.typ.com/" def _conn(url): try: passwordmanager = urllib.request.HTTPPasswordMgrWithDefaultRealm() passwordmanager.add_password(None, url, 'typ', '123456') handler = urllib.request.HTTPBasicAuthHandler(passwordmanager) opener = urllib.request.build_opener(handler) response = opener.open(url) data = response.read().decode('utf-8') data_json = json.loads(data) return data_json except Exception as e: print("连接私有仓库错误...请检查") return False
在linux上运行报错如下
我需要把自定义错误去掉,不然无法打印错误信息
错误如下:
错误显示证书不被认证,因为我们使用的是自己颁发的证书所以无法认证.
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
解决办法
import ssl ssl._create_default_https_context = ssl._create_unverified_context
import urllib.request import sys import json import ssl #私有仓库地址 registry_url="https://registry.typ.com/" ssl._create_default_https_context = ssl._create_unverified_context def _conn(url): try: passwordmanager = urllib.request.HTTPPasswordMgrWithDefaultRealm() passwordmanager.add_password(None, url, 'typ', '123456') handler = urllib.request.HTTPBasicAuthHandler(passwordmanager) opener = urllib.request.build_opener(handler) response = opener.open(url) data = response.read().decode('utf-8') data_json = json.loads(data) return data_json except Exception as e: print("连接私有仓库错误...请检查") return False
成功取值