我在.pem文件中有一个受密码保护的私钥;我想用它来签署对远程服务器的请求。我能够加载密钥并在提示后输入密码:
python
>>> import M2Crypto
>>> pk = M2Crypto.RSA.load_key('private.pem')
Enter passphrase:
>>>
但是,我需要这个服务器进程,每天早上重新启动,因此必须以某种方式自动传递密码。为此目的,load_key方法支持回调参数,因此我尝试了几种变体:
>>> def gimmepw():
... return 'mysecret'
...
>>> pk = M2Crypto.RSA.load_key('private.pem', gimmepw)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/local/Plone/Python-2.4/.../M2Crypto/RSA.py", line 351, in load_key
return load_key_bio(bio, callback)
File "/usr/local/Plone/Python-2.4/.../M2Crypto/RSA.py", line 372, in load_key_bio
rsa_error()
File "/usr/local/Plone/Python-2.4/.../M2Crypto/RSA.py", line 302, in rsa_error
raise RSAError, m2.err_reason_error_string(m2.err_get_error())
M2Crypto.RSA.RSAError: bad password read
>>>
(用“lib / python2.4 / site-packages”替换“...”)
我做错了什么?
答案 0 :(得分:6)
这是由于回调函数中缺少参数支持。由于将使用至少一个参数调用,因此将发生TypeError
异常(由M2Crypto捕获)。
>>> def gimmepw(*args):
... print 'args:', repr(args)
... return 'test'
...
>>> M2Crypto.RSA.load_key('key.pem', gimmepw)
args: (0,)
<M2Crypto.RSA.RSA instance at 0xb6e8050c>
你应该尝试:
def gimmepw(*args):
return 'mysecret'
答案 1 :(得分:0)
一个警告:从Python 2.7开始,callback
方法的返回值必须返回str
类型。
例如,unicode
类型将以相同的方式出错。
>>> def gimmepw(*args):
... return u'test'
...
>>> M2Crypto.RSA.load_key('key.pem', gimmepw)
Traceback (most recent call last):
File "test_intuit_data.py", line 76, in <module>
intuit_rsa_key = RSA.load_key(file='key.pem', callback=gimmepw)
File "lib/python2.7/site-packages/M2Crypto/RSA.py", line 351, in load_key
return load_key_bio(bio, callback)
File "lib/python2.7/site-packages/M2Crypto/RSA.py", line 372, in load_key_bio
rsa_error()
File "lib/python2.7/site-packages/M2Crypto/RSA.py", line 302, in rsa_error
raise RSAError, m2.err_reason_error_string(m2.err_get_error())
M2Crypto.RSA.RSAError: bad password read
如果您使用str
类型以外的任何输入,请务必适当地转换为str
:
>>> def gimmepw(*args):
... return str(u'test')
...
>>> M2Crypto.RSA.load_key('key.pem', gimmepw)
<M2Crypto.RSA.RSA instance at 0xb6e8050c>