部署噩梦之python2.7.9——CERTIFICATE_VERIFY_FAILED

昨天又去了一趟现场部署,都是辛酸泪。那边的vpn用不了,无法远程部署,真是坑爹。

上次部署完代码之后尝试运行代码,在python用urllib2进行https请求是发生CERTIFICATE_VERIFY_FAILED这个异常,一直卡在那里两个小时,无法解决。

问题明显是https的证书问题,但是因为对https证书不熟悉,无法解决问题。当时问过负责人,他们的网站最近刚换过https证书,老师对这个也不太懂,所以就鸵鸟算法,说是负责人那边没有配合我们这边部署。

但是今天去到现场部署,立即又搜了下stackoverflow,搜了下segmentfault,很快就找到答案了。大概是问题最近才集中涌现吧,别问我是不是一直用百度,我一直用的谷歌。感谢下这为仁兄,http://reality0ne.com/?p=816。这位仁兄引用了一个PEP地址—— https://www.python.org/dev/peps/pep-0476/

之前在本机测试没有发现这个问题(Mac OS with python 2.7.6),是因为这个python版本没有打上那个补丁。部署环境原来的python环境是预装的2.4,也没有被打上这个补丁。

在部署过程中,我因为嫌2.4太落后,很多之后版本内置支持的东西都没有,所以弃用,编译了一个2.7.9使用。“幸运的是”,这个补丁是已经被打补丁的2.7.X版本,所以python对https证书认证的补丁已经被打上去了,导致了我在本地部署和在服务器部署的情况不相同。

HTTPS认证:

它的主要作用可以分为两种:

一种是建立一个信息安全通道,来保证数据传输的安全;

另一种就是确认网站的真实性,凡是使用了 https 的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,也可以通过 CA 机构颁发的安全签章来查询

HTTPS和HTTP的区别主要为以下四点:

一、https协议需要到ca申请证书,一般免费证书很少,需要交费。

二、http是超文本传输协议,信息是明文传输,https 则是具有安全性ssl加密传输协议。

三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

1. 一般意义上的https,就是服务器有一个证书。

2. 少许对客户端有要求的情况下,会要求客户端也必须有一个证书。例如U盾

SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)(就是更屌)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。

我在部署过程中,遇到一种HTTPS证书自签名的情况,自签名的情况可以参见这么一段解释:

不是每个公司都会以数百美金一年的代价向CA购买SSL证书。在企业应用中,付费的SSL证书经常被自签名证书所替代。当然,对于自签名证书iOS是没有能力验证的。Safari遇到这种无法验证的自签名证书的唯一处理方法,就是将问题扔给用户,让用户决定是否应该相信此类证书。它提供了两个按钮,一个“继续”按钮和一个“取消”按钮。当你点击“取消”按钮,则你将无法访问所请求的资源。 当你点击“继续”按钮,则Safari会认为用户授权它放弃对该服务器的验证,所产生的风险由用户自己承担。 当然,HTTPS传输仍然是加密的。

因为我部署的python脚本是在部署单位的内部使用的,所以可以免除认证,所以我选择了下面两种解决方法中的第二种来进行解决,方便快捷。

如果不想验证的话,问题怎么解决:

1、不对服务器进行验证

import ssl

context = ssl._create_unverified_context()

2、取消验证

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

/*

第二种方式叫做monkey_patch:

monkey patch指的是在运行时动态替换,一般是在startup的时候。因为python语言的特性使得这种打补丁的方式是可行的

*/

这次的部署也让我接触到了PEP,python software的tweet,mercurial,真是受益匪浅。

最近还不知道maillist这个东西是怎么用的,看来还得去看看。

时间: 2024-11-08 18:23:52

部署噩梦之python2.7.9——CERTIFICATE_VERIFY_FAILED的相关文章

有容云老司机带路, 使用Docker实现丝般顺滑的持续集成

持续集成作为最先进的项目实践之一,近年来逐渐受到国内软件公司的重视:但对于许多朋友来说,可能从来都没有听说过持续集成这个词,抑或只是了解一个概念但并没有实践过. 什么是持续集成?它对软件开发有哪些好处呢? 持续集成的概念 持续集成,Continuous integration ,简称CI. 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火,如何能在不断变化的需求中快

项目管理工具之Trac

trac部署 @依赖: python2.5+,setuptools0.6+ ,genshi0.6+ pip自动安装依赖 db:mysql5.0+,mysqldb1.2.2+(MySQL-python) git:1.5.6+ webserver:nginx,apache other:babel0.9.5+,docutils0.3.9+,pygments(for syntax highlighiting),pytz(timezone) @安装trac     #pip环境准备 yum install

利用ngxtop工具对nginx日志实时分析

参考:通过ngxtop实时监控webserver的访问情况 一.部署 准备:python2.7.3+.SQLite(否则会报错) 编译安装SQLite cd /usr/local/src && wget    #下载安装包,最新安装包请参考 tar xf sqlite-autoconf-3230100.tar.gz && cd sqlite-autoconf-3230100  #解压安装包 ./configure --prefix=/usr/local/sqlite &am

网易 UI 自动化工具 Airtest 浅用记录

一 使用目的 该工具主要是面向游戏UI测试基于图像识别,如游戏框架unity,Cocos-js以及网易内部的游戏框架 同时也支持原生Android App 的基于元素识别的UI自动化测试. 本文主要使用目的是做安卓原生App的元素UI自动化. 二 资源索引 官方资源 网易游戏新开源的 UI 自动化测试项目 [Airtest Project] Airtest官网 Airtest官网上手教程 AirtestProject Github主页 AirtestIDE官方中文文档 Airtest 官方中文文

python版本随意切换之python2.7+django1.8.7+uwsgi+nginx源码包部署。

资源准备: wget https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz wget https://www.djangoproject.com/m/releases/1.8/Django-1.8.7.tar.gz wget https://pypi.python.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9

nginx+uwsgi+django1.9+mysql+python2.7部署到CentOS6.5

一.相关版本介绍 名称 说明 服务器 CentOS6.5 nginx 1.12.1 python 2.7.13 django 1.9 mysql 5.5.32 uwsgi 2.0.15 下面介绍一下我的部署过程,针对不同的配置可能有所不同仅供参考: 二.操作系统基本配置 如果你的操作系统是本地的一台虚拟机,可能需要配置yum源和IP地址.关于yum源和IP地址的配置因为挺简单的,我这里就不详细的做介绍了,仅提供以下信息: 2.1配置yum源仓库: 配置文件地址:/etc/yum.repos.d

白手起家Django项目发布中篇_Centos下Python2和3并存环境部署

python环境部署 我们今天学习的内容是如何将Django项目部署到linux服务器上,我们部署的linux系统是centos7首先,我们先在linux上搭建我们的Python3环境: 在这里首先强调一下,Centos7系统自带的Python2我们不要删除,我们要做的是在Python2和python3并存. 1.  安装Python3的依赖包 2.  命令: [[email protected] Desktop]# yum install zlib-devel bzip2-devel open

centos6.5+python2.7+flask+apache+mod-wsgi部署

flask部署,使用的是centos6.5,python2.7,版本很重要.基本步骤如下: 一.创建虚拟环境,创建目录把项目拷进去 二.安装mod-wsgi和apache easy_install mod_wsgi # centos6.5中部署apache包名叫httpd yum install httpd 三.在apache中启用安装到python中的mod_wsgi #终端输入 mod_wsgi-express module-config #得到,注意这的版本跟项目使用的python版本要一

django1.77+mod_wsgi+python2.79+apache2.24 在阿里云centos部署攻略

心平气和的记录一下今天 踩的坑以防万一 以后还踩 首先我今天的平台是在 阿里云上的一台纯净版的 centos6.5 64位主机上进行的 首先装python2.7 去官网下载python2.7安装包 然后下来之后使用编译的方式安装. 这里就有个坑 因为后面需要安装mod_wsgi的关系 这里安装python2.7安装包一定需要用 --enable-shared的方式安装动态库 不然后面无论你如何挣扎 都无法 编译mod_wsgi..这个问题我今天 到处查资料 最后在stackoverflow上看到