5

我在 .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”)

我究竟做错了什么?

4

2 回答 2

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'
于 2012-05-16T09:19:37.577 回答
1

一个警告:从 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>
于 2015-03-08T08:06:18.110 回答