Python篇之如何利用openssl库快速实现socket加密

作者: 张唐恺
2016-12-29
2904
原创

当下的网络环境,HTTP(Hypertext Transfter Protocol)转向HTTPS(Hypertext Transfter Protocol Secure,即HTTP + SSL [Secure Socket Layer] )是必然的趋势,越来越多的互联网公司开始尝试或已经迁移到支持HTTPS的服务器,浏览器地址栏最左侧的绿色小锁的也更多的出现在人们的视野中,市占率最高的谷歌旗下浏览器Chrome也开始对无加密的HTTP网站应用更严格的政策。


这一切的背后盖因明文发送信息的HTTP背后巨大的安全隐患,而互联网热潮中用户对隐私安全等级的要求也节节攀升。


python作为常用的网络事宜“打杂工具”在网络爬虫、后台开发等等都占有举足轻重的地位。学会使用python实现SSL加密有助于程序员在上述背景下更好的完成自己的工作。


python自带的官方module: Lib/ssl.py可以调用被业界广泛使用的开源库OpenSSL,该模块提供的ssl.SSLSocket类派生于基础的socket模块中的socket.socket类,因此如果你熟悉python中socket的使用,将大大降低学习ssl库的难度。简单来讲,可以说ssl库只不过是在原有socket的基础上“包裹”(wrapper)了一层安全模块。

接下来是实际代码展示,这里仅涉及客户端的写法,不过服务端是类似的。

socket库
回顾socket库的使用,可以发现python中的socket一如既往的简单,实例化socket对象之后就可以去连接服务端的socket接口了。


ssl库

对比后发现正如前文所述,支持SSL加密的socket实例是在socket这个object中额外添加了例如客户端证书、CA证书和SSL协议版本等参数,这一点可在python shell验证:

可以看到ssl_socket只是多了一些安全相关的attributes,剩下的完全一致。

pyOpenSSL库
另一个值得注意的地方是,ssl库仅支持pem格式的证书文件,所以当使用如pfx格式的证书时就需要进行格式转换,使用openssl命令即可办到但是这增加了额外的工作量,更好的办法是使用第三方库pyOpenSSL来在python代码中完成格式转换。

上面的代码相当于一条openssl的命令:


▲▲openssl绝对安全吗?
答案是否定的。如果你时常关注信息安全相关的新闻,你一定不会忘记一个名为heartbleed的漏洞,没错这个风险极高的bug正是针对openssl的。


“黑客利用心脏出血漏洞可以获区用户的密码或欺骗用户访问钓鱼网站,ssl标准库包含一个心跳包(heartbeet)选项, 允许连接SSL一端的电脑(客户端)发出一条简短的信息以确认另一端的电脑(服务器)仍然在线,信息安全人员发现某种定制后的恶意心跳信息可以欺骗另一端的电脑泄漏机密信息” [1]。因为漏洞与心跳包相关,所以该漏洞也被形象得称为心脏出血。


尽管该漏洞已经可以通过升级OpenSSL得以解决,但还是在时刻警醒互联网从业人员,网络环境中没有绝对的安全,技术人员只能群策群力创造一个相对安全的运行环境,时刻保持清醒的头脑并冷静得思虑才是应对安全问题的正确态度。


参考索引:

[1] OpenSSL重大漏洞——心脏流血,那是什么,如何补救



版权所有 侵权必究

如需转载请联系

0571-28829811

恒生技术之眼