Pulpcode

捕获,搅碎,拼接,吞咽

0%

python中支持rsa安装

起因

python自带的rsa库不能够适用于生产环境,必须安装M2Crypto库。

但M2Crypto的安装并不简单,需要一些库的依赖。

安装步骤

swig下载:

下载版本:SWIG Version 3.0.4(注意这里必须是3.0.4,否则会报错)

1
2
3
4
wget http://jaist.dl.sourceforge.net/project/swig/swig/swig-3.0.4/swig-3.0.4.tar.gz
tar zxvf swig-3.0.4.tar.gz
cd swig-3.0.4.tar.gz
./configure

如果出现以下错误:

1
2
3
configure: error:
Cannot find pcre-config script from PCRE (Perl Compatible Regular Expressions)
library package. This dependency is needed for configure to complete…

则需要安装pcre。

pcre安装:

1
2
3
4
5
6
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.37.tar.gz
tar zxvf pcre-8.37.tar.gz
cd pcre-8.37.tar.gz
./configure
sudo make
sudo make install

接着继续我们的swig安装

1
2
3
./configure
sudo make
sudo make install

执行swig后若提示:未发现libpcre.so.1,则需要查找后,建立连接 ln -s 源文件 链接名称

安装 openssl

1
2
3
4
5
6
wget https://www.openssl.org/source/openssl-1.0.1m.tar.gz
tar xzf openssl-1.0.1m.tar.gz
cd openssl-1.0.1m
./config --prefix=/usr/local --shared
make && make test
sudo make install

注意我安装的是1.0.1m,我尝试过去安装0.9.8zd版本的,是会报错的:

1
/usr/bin/ld: libcrypto.a(e_4758cca.o): relocation R_x86_64_32 against `.data` can not be used when making a shared object; recompile with -fPIC libcrypto.a(e_4758cca.o): error adding symbols 错误的值

网上的各种例子都会让你命令行参数加什么fPIC,但是并没什么用。

安装 M2Crypto

1
2
3
4
5
wget https://pypi.python.org/packages/source/M/M2Crypto/M2Crypto-0.22.3.tar.gz
tar zxvf M2Crypto-0.22.3.tar.gz
cd M2Crypto-0.22.3
python setup.py build build_ext --openssl=/usr/local
sudo python setup.py install build_ext --openssl=/usr/local

验证安装成功

打开python解释器,执行如下命令

1
import M2Crypto

如果报类似如下错误:

1
/usr/lib/python2.7/dist-packages/pkg_resources.py:1031: UserWarning:...

则需要减去一些权限:

1
chmod g-wx, o-wx /home/xxx/.python-eggs

如果bash报错说不支持上面的命令,可以分开分别执行

1
2
chmod g-wx /home/xxx/.python-eggs
chmod o-wx /home/xxx/.python-eggs

打开openssl,执行如下两条命令,来生成公钥和私钥:

1
2
genrsa -out rsa_private_key.pem 1024
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

运行如下脚本,验证一切安装ok

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# -- coding: utf-8 --

from M2Crypto import RSA, EVP, Rand

def priv_sign(dgst):
"""
私钥签名
"""
priv=RSA.load_key(‘rsa_private_key.pem’)
signature = priv.sign(dgst)
return signature

def pub_verify(dgst, signature):
"""
公钥验证
"""
pub = RSA.load_pub_key('rsa_public_key.pem')
res = pub.verify(dgst, signature)
return res == 1


if __name__ == "__main__":
m = priv_sign("aiqier")
print m
print pub_verify("aiqier", m)