python3 SSL连接私有CA证书免认证

654次阅读
没有评论

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


python3 SSL 连接私有 CA 证书免认证


解决办法

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

成功取值

python3 SSL 连接私有 CA 证书免认证

正文完
 
ddn
版权声明:本站原创文章,由 ddn 2017-08-29发表,共计2136字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。