2012-05-16 3 views
3

У меня есть закрытый ключ с паролем в файле .pem; Я хочу использовать его для подписания запросов на удаленный сервер. Я могу загрузить ключ и введите пароль после запроса на него:Как загрузить закрытый ключ с защитой паролем из файла .pem с помощью M2Crypto?

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 
>>> 

(заменить "..." по "Библиотека/python2.4/сайт-пакеты")

Что я делаю неправильно?

ответ

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' 
+0

Спасибо - это сделал трюк :-) – Tobias

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> 
Смежные вопросы