接受的答案并不完全提供信息,但足够接近以模糊相关..
首先,verify_cb
in的值set_verify
是一个错字,cert_check
似乎是适当的函数签名,因此问题修改是:
def cert_check(conn,cert,errnum,depth,ok):
print 'Got cert',cert.get_subject()
return ok
Server:
ctx = SSL.context(SSL.TLSv1_METHOD)
ctx.set_verify(SSL.VERIFY_PEER,cert_check)
ctx.use_private_key_file('server.key')
ctx.use_certificate_file('server.crt')
ctx.load_verify_locations('ca.crt')
Client:
ctx = SSL.context(SSL.TLSv1_METHOD)
ctx.set_verify(SSL.VERIFY_PEER,cert_check)
ctx.use_private_key_file('client.key')
ctx.use_certificate_file('client.crt')
ctx.load_verify_locations('ca.crt')
How is it that on both client and server side, I get two certificates. One with no CommonName and one with the correct CommonName= myownserver.com/myownclient.com
set_verify
可以在此处查看对正在发生的事情的解释;有人可以解释 SSL 证书的回调函数吗?
作为调试提示,您可以查看证书
print(dump_certificate(FILETYPE_TEXT, cert).decode())
回答直接问题:
a) 服务器收到客户端证书,因为它是客户端提供给服务器的
b) 服务器已经有一个根存储;受信任的根 CA 证书。您在连接的服务器上下文中看到的第二个证书将是与客户端证书颁发者 CA 匹配的根 CA 证书(如果 CA 在证书存储中)
c) 客户端上下文将拥有所有对等证书,而不仅仅是 2 个。通常一个服务器链是 3 个或更多;
- 根 CA - 在客户端设备根存储中)
- 唱 CA 证书 - 您为服务器购买证书时支付的公司,该 CA 在链中有一个证书,代表受信任的根 CA 授予他们的权限,因此他们可以为像您这样的客户签署证书
- 服务器证书 - 您购买并安装在您的网络服务器配置中的证书
d)在您的客户上下文中有 2 个证书的事实向我表明您很有可能是自签名的。这意味着中间机构不是 CA,也不太可能受到根 CA 的信任,但您还是为您的服务器签署了证书:
- 中间是用于签署服务器证书的自签名根证书。它没有受信任的根 CA,因此客户端上下文不会从您的信任存储中提取一个来完成典型的 3 链,从而导致您的链中只有 2 个证书
- 自签名的服务器证书
e)由于问题表明 tls 协商成功,并且服务器上下文中有 2 个证书,这表明自签名证书已添加到您的服务器受信任的根存储中。这可能发生在许多方法中,但使用问题特定库的运行时方法最有可能pyOpenSSL
将ctx.load_verify_locations(cafile)
自签名证书添加到服务器上的受信任根存储中