昨天又去了一趟现场部署,都是辛酸泪。那边的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这个东西是怎么用的,看来还得去看看。