系统【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

成功取值



欢迎留言