2010-12-10 12 views
3

私はLuaSec 0.4のデフォルトのoneshotの例(下記参照)を使用して双方向認証を実装しています。認証は成功しているので、認証局(CA)は、ピアが自分の誰であると認めるかは明らかです。Lua:LuaSecでクライアント認証が成功した後にクライアントの詳細を取得する方法

しかし、ピアが誰であると主張しているのか、私はどのように見ることができますか?例えば。ピアの証明書の組織名を調べるにはどうしたらいいですか?クライアントは現在、CAによってサーバーが認識されていると信頼できるが、クライアントはサーバーが本当に適切なピアであるかどうかを知りません。
もう1つの方法:サーバーは、接続クライアントがCAによって認識されていることを認識しています。しかし、多くのクライアントはCAによって認識されているため、どのクライアントがどのクライアントに接続されているかをサーバーがどのように知ることができますか?

-------- For the sake of completeness 
------- server code: 
require("socket") 
require("ssl") 
local params = { 
    mode = "server", 
    protocol = "sslv3", 
    key = "../certs/serverAkey.pem", 
    certificate = "../certs/serverA.pem", 
    cafile = "../certs/rootA.pem", 
    verify = {"peer", "fail_if_no_peer_cert"}, 
    options = {"all", "no_sslv2"}, 
} 
-- SSL context 
local ctx = assert(ssl.newcontext(params)) 

local server = socket.tcp() 
server:setoption('reuseaddr', true) 
assert(server:bind("127.0.0.1", 8888)) 
server:listen() 
local peer = server:accept() 
-- SSL wrapper 
peer = assert(ssl.wrap(peer, ctx)) 
assert(peer:dohandshake()) 

local fd = peer:getfd() 
peer:send("oneshot test\n") 
peer:close() 

------- client code: 
require("socket") 
require("ssl") 
local params = { 
    mode = "client", 
    protocol = "sslv3", 
    key = "../certs/clientAkey.pem", 
    certificate = "../certs/clientA.pem", 
    cafile = "../certs/rootA.pem", 
    verify = {"peer", "fail_if_no_peer_cert"}, 
    options = {"all", "no_sslv2"}, 
} 
local peer = socket.tcp() 
peer:connect("127.0.0.1", 8888) 
-- SSL wrapper 
peer = assert(ssl.wrap(peer, params)) 
assert(peer:dohandshake()) 
print(peer:receive("*l")) 
peer:close() 

答えて

1

残念ながら、現時点では、IDを取得する方法はありません.LuaSecで証明書を調べる方法はありません。これは、セキュリティ保護されたサーバーへの接続を可能にする、非常に単純なバインディング(APIでは機能ではなく)です。

証明書を取得するには、最も簡単な方法はLuaSecを修正し、内部でSSL_get_peer_certificate(const SSL *ssl)を使用するgetpeercert()のような関数を追加し、メインエントリを含むLuaテーブルを返します。

3

0.4以降では、LuaSecは証明書を取得/復号するためのAPIを提供していません。 Prosody XMPPサーバーでLuaSecを使用し、XMPPも認証にTLS +証明書を使用できるため、LuaSecをハッキングしてAPIをサポートしています。

私たちの仕事はまだ上流に統合されていませんが、うまくいけば間に合うはずです。それまでの間、あなたはここでそれを見つけることができます:

cert = conn:getpeercertificate() 

これは、のような様々な方法でX509の証明書オブジェクトを返します:件名を()、:発行者()http://code.matthewwild.co.uk/luasec-hg

は、リモートエンティティの証明書は同じくらい簡単です取得しますと:extensions()。

一部のAPIは、コードを完成させると変更される可能性がありますが、問題があればお気軽にお問い合わせください。

関連する問題