python环境设置ssl

Python012

python环境设置ssl,第1张

爬取数据需要用python请求网络数据, https的加密实现依赖openssl

利用源码直接安装

安装zlib库

安装openssl到 /usr/local/openssl 目录,安装之后,编译

安装结束后执行以下命令

进入/usr/local目录下,执行以下命令

在/etc/ld.so.conf文件的最后面,添加如下内容:/usr/local/openssl/lib

然后执行以下命令

添加OPESSL的环境变量,在etc/的profile的最后一行,添加:

查看openssl版本

使用源码按过于繁琐,如果对软件版本没有特殊要求的话可以使用yum命令安装和更新,既方便又快捷

先看下ssl有没有被引入

报错是因为python没有带--with-ssl 选项编译

修改Setup.dist文件 (把Setup这个不带后缀的也一起改了)

修改结果如下:(去掉最后4行的注释)

切到python文件夹下

完成之后

没有报错, 大功告成

参考链接

ImportError: No module named _ssl

linux上安装Openssl步骤详解

查看源代码,ssl.wrap_socket直接调用本地代码(openssl)函数SSL_CTX_use_cert_chain_file,它需要一个文件的路径,因此您无法做的是尝试做的。

参考:

在ssl / init .py中,我们看到:

def wrap_socket(sock,keyfile =无,certfile =无,

server_side = False,cert_reqs = CERT_NONE,

ssl_version = PROTOCOL_SSLv23,ca_certs = None,

do_handshake_on_connect = True):

return SSLSocket sock,keyfile = keyfile,certfile = certfile,

server_side = server_side,cert_reqs = cert_reqs,

ssl_version = ssl_version,ca_certs = ca_certs,

do_handshake_on_connect = do_handshake_on_connect)

将我们指向SSLSocket构造函数(它在同一个文件中),我们看到以下情况:

self._sslobj = _ssl2.sslwrap(self._sock,server_side,

keyfile,certfile,

cert_reqs,ssl_version,ca_certs)

_ssl2在C(_ssl2.c)中实现

查看sslwrap函数,我们看到它正在创建一个新对象:

return(PyObject *)newPySSLObject(Sock,key_file ,cert_file,

server_side,verification_mode,

protocol,cacerts_file)

查看该对象的构造函数,我们最终会看到:

ret = SSL_CTX_use_certificate_chain_file(self->ctx,

cert_file)

这个函数在openssl中定义,所以现在我们需要切换到那个代码库。

在ssl / ssl_rsa.c中,我们最终在函数中找到:

BIO_read_filename in,file)

如果你深入到BIO代码(openssl的一部分)最终成为正常的fopen():

fp = fopen(ptr,p)

所以它看起来像它当前写的。它必须在C的fopen()可打开的文件中。

此外,由于python的ssl库很快跳转到C,我在一个解决方法中看不到一个明显的monkeypatch的地方。

python安装完毕后,提示找不到ssl模块:

解决方法:

查看安装结果

[ [email protected] ~]$ rpm -aq|grep openssl

openssl-devel-1.0.1e-57.el6.x86_64

openssl-1.0.1e-57.el6.x86_64