2012-05-16 5 views
3

.pem 파일에 암호로 보호 된 개인 키가 있습니다. 원격 서버에 요청을 서명하는 데 사용하고 싶습니다. 나는 그것을를 입력하라는 메시지가 후 암호를 키를로드하고 입력 할 수있어 :M2Crypto를 사용하여 .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/사이트 패키지"에 의해)

내가 뭘 잘못하고 있니?

답변

6

이것은 콜백 함수에서 매개 변수 지원이 부족하기 때문입니다. 최소한 하나의 매개 변수로 호출되므로 TypeError 예외가 발생합니다 (M2Crypto에 의해 catch 됨).

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

한 가지주의를 : 파이썬 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>