2

M2Crypto-0.20.2 を使用しています。OpenSC プロジェクトの engine_pkcs11 と、SSL 経由で xmlrpc 呼び出しを行うトークン ベースの認証に Aladdin PKI クライアントを使用したいと考えています。

from M2Crypto import Engine

Engine.load_dynamic()
dynamic = Engine.Engine('dynamic')
# Load the engine_pkcs from the OpenSC project
dynamic.ctrl_cmd_string("SO_PATH", "/usr/local/ssl/lib/engines/engine_pkcs11.so")
Engine.cleanup()

Engine.load_dynamic()
# Load the Aladdin PKI Client
aladdin = Engine.Engine('dynamic')
aladdin.ctrl_cmd_string("SO_PATH", "/usr/lib/libeTPkcs11.so")

key = aladdin.load_private_key("PIN","password")

これは私が受け取るエラーです:

key = pkcs.load_private_key("PIN","eT0ken")
File "/usr/local/lib/python2.4/site-packages/M2Crypto/Engine.py", line 70, in load_private_key
    return self._engine_load_key(m2.engine_load_private_key, name, pin)
File "/usr/local/lib/python2.4/site-packages/M2Crypto/Engine.py", line 60, in _engine_load_key
    raise EngineError(Err.get_error())
M2Crypto.Engine.EngineError: 23730:error:26096075:engine routines:ENGINE_load_private_key:not initialised:eng_pkey.c:112:

の場合load_private_key()、最初の引数として何を渡す必要がありますか? M2Crypto のドキュメントでは説明されていません。

エンジンのロード中にエラーは発生しませんが、エンジンが正しくロードされているかどうかはわかりません。エンジン ID は特定の名前でなければならないようですが、そのリストはどこにもありません。 'dynamic'私のために働いています。

どんな助けでも大歓迎です!

4

6 に答える 6

2

見つかった !!!!

はい、まさに私が生まれた方法です。

したがって、実際にはENGINE_init()はM2Crypto.Engineに実装されていません。したがって、唯一の解決策:パッチ適用!!! (非常に小さい...)そこで、新しいEngineメソッドを作成しました(Engine.py内)

def engine_initz(self):
        """Return engine name"""
        return m2.engine_initz(self._ptr)

なぜengine_initz?engine_initはSWIG/_engine.iですでに定義されているため、次のようになります。

void engine_init(PyObject *engine_err) {
    Py_INCREF(engine_err);
    _engine_err = engine_err;
}

何が行われているのかよくわからないので、新しいものを作成することを好みました...そこで、SWIG/_engine.iに以下を追加しました。

%rename(engine_initz) ENGINE_init;
extern int ENGINE_init(ENGINE *);

そして、__ m2crypto.soを再コンパイルし、秘密鍵を起動する前に「pkcs11.engine_initz()」を追加するだけで、機能します。

于 2010-02-04T17:47:13.763 に答える
1

現在のM2Cryptoに存在するengine_initコードが何を、なぜ実行するのかわかりません。M2Cryptoに次のパッチを適用してENGINE_init()をengine_init2として公開すると、次のようになります。

Index: SWIG/_engine.i
===================================================================
--- SWIG/_engine.i  (revision 719)
+++ SWIG/_engine.i  (working copy)
@@ -44,6 +44,9 @@
 %rename(engine_free) ENGINE_free;
 extern int ENGINE_free(ENGINE *);

+%rename(engine_init2) ENGINE_init;
+extern int ENGINE_init(ENGINE *);
+
 /*
  * Engine id/name functions
  */

この後、次のコードでさらに詳しく説明します(ただし、現在urllibは完全には機能しません)。

import sys, os, time, cgi, urllib, urlparse
from M2Crypto import m2urllib2 as urllib2
from M2Crypto import m2, SSL, Engine

# load dynamic engine
e = Engine.load_dynamic_engine("pkcs11", "/Users/martin/prefix/lib/engines/engine_pkcs11.so")
pk = Engine.Engine("pkcs11")
pk.ctrl_cmd_string("MODULE_PATH", "/Library/OpenSC/lib/opensc-pkcs11.so")

m2.engine_init2(m2.engine_by_id("pkcs11")) # This makes the trick

cert = e.load_certificate("slot_01-id_01")
key = e.load_private_key("slot_01-id_01", sys.argv[1])

ctx = SSL.Context("sslv23")
ctx.set_cipher_list("HIGH:!aNULL:!eNULL:@STRENGTH")
ctx.set_session_id_ctx("foobar")
m2.ssl_ctx_use_x509(ctx.ctx, cert.x509)
m2.ssl_ctx_use_pkey_privkey(ctx.ctx, key.pkey)

opener = urllib2.build_opener(ctx)
urllib2.install_opener(opener)
于 2010-02-05T11:51:46.570 に答える
1

Becky が提供したペーストビンのリンクを見ると、新しい API では次のように変換されると思います。

from M2Crypto import Engine, m2

dynamic = Engine.load_dynamic_engine("pkcs11", "/Users/martin/prefix/lib/engines/engine_pkcs11.so")

pkcs11 = Engine.Engine("pkcs11")

pkcs11.ctrl_cmd_string("MODULE_PATH", "/Library/OpenSC/lib/opensc-pkcs11.so")

r = pkcs11.ctrl_cmd_string("PIN", sys.argv[1])

key = pkcs11.load_private_key("id_01")

したがって、「/Users/martin/prefix/lib/engines/engine_pkcs11.so」を「/usr/local/ssl/lib/engines/engine_pkcs11.so」と「/Library/OpenSC/lib/ opensc-pkcs11.so」と「/usr/lib/libeTPkcs11.so」を組み合わせることで、Aladdin で動作するようになる可能性があります。

于 2010-02-03T22:54:51.193 に答える
0

問題は実際には「load_private_key()」ではないと思います。「MODULE_PATH」定義とload_private_key()呼び出しの間に何かが欠けているようです。「/usr/lib/libeTPkcs11.so」を間違ったパスに置き換えた場合はどうなりますか?私の場合、これに関連するエラーはありません。

高いデバッグレベルでフォアグラウンドで「pcscd」を実行しましたが、Pythonの実行中にスマートカードが呼び出されることはありません...したがって、間違いなく、何が問題なのかわかりません...

「openssl」に相当するものは、「-pre」コマンドを使用することです。「-pre」(「-post」の反対)は、ロードする前にエンジンに送信されるコマンドです。おそらく、すべての「ctrl_cmd_string」呼び出しの後にエンジンを「ロード」するメソッドを呼び出す必要がありますか?..。

失った :-/

于 2010-02-04T15:06:29.930 に答える
0

それはまさに私が試したコードです。しかし、それは次のエラーで終了しました:

Traceback (most recent call last):
  File "prog9.py", line 13, in <module>
    key = pkcs11.load_private_key("id_45")
  File "/usr/lib/pymodules/python2.5/M2Crypto/Engine.py", line 70, in load_private_key
    return self._engine_load_key(m2.engine_load_private_key, name, pin)
  File "/usr/lib/pymodules/python2.5/M2Crypto/Engine.py", line 60, in _engine_load_key
    raise EngineError(Err.get_error())
M2Crypto.Engine.EngineError: 11814:error:26096075:engine outines:ENGINE_load_private_key:not initialised:eng_pkey.c:112:

アラジン lib ではなく、OpenSC PKCS11 lib を使用しています。しかし、問題が解決したとは思いません。

于 2010-02-04T11:22:24.407 に答える
0

Heikki が提案したコード (マイナス 1 行) を試してみたところ、Erlo と同じエラーが発生しました。load_private_key() の場合、引数に何を入力すればよいかを知るにはどうすればよいですか?

dynamic = Engine.load_dynamic_engine("pkcs11", "/usr/local/ssl/lib/engines/engine_pkcs11.so")
#  m2.engine_free(dynamic) this line gave me an error TypeError: in method 'engine_free', argument 1 of type 'ENGINE *'

pkcs11 = Engine.Engine("pkcs11")
pkcs11.ctrl_cmd_string("MODULE_PATH", "/usr/lib/libeTPkcs11.so")

r = pkcs11.ctrl_cmd_string("PIN", "password")

key = pkcs11.load_private_key("id_01")
于 2010-02-04T14:23:42.417 に答える