2010-12-10 178 views
3

我使用LuaSec 0.4的默认'oneshot'示例(请参见下文)来实现双向身份验证。身份验证是成功的,所以显然证书颁发机构(CA)承认这些同伴是他们自称的人。Lua:在成功通过LuaSec进行客户端身份验证后如何获取客户端详细信息

但是,我怎么能看到同行声称是谁?例如。我如何检查对等方证书的组织名称?因为尽管客户端现在可以相信服务器已被CA知道,但客户端并不知道服务器是否真的是合适的对等设备。
而另一种方式:服务器知道连接客户端是由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

不幸的是,似乎目前没有办法在LuaSec中获取身份/检查证书。这是一个非常简单的绑定(就API而言,不是功能),以便连接到安全的服务器。

为了获得证书,最简单的方法是修改LuaSec并添加一个像getpeercert()这样的函数,它在内部使用SSL_get_peer_certificate(const SSL *ssl)并返回一个包含主条目的Lua表。

3

从0.4 LuaSec不提供用于检索/解码证书的API。由于我们在Prosody XMPP服务器中使用LuaSec,并且XMPP也可以使用TLS +证书进行身份验证,所以我们一直在攻击LuaSec以支持API。

我们的工作尚未合并到上游,但希望很快就会完成。在此期间,你可以在这里找到:http://code.matthewwild.co.uk/luasec-hg

获取远程实体的证书是一样简单:

cert = conn:getpeercertificate() 

此方法返回的各种方法像X509证书对象:主题():发行人()和:extensions()。

在我们完成代码时,一些API可能会发生变化,但如果您有任何问题,请随时与我联系。