如何使用SSL_CTX对象获取对等证书

时间:2015-04-08 07:43:43

标签: openssl libcurl

我的目的是验证对等证书中的OU("组织单位")。 将libCurl用于HTTPs客户端。

我在HTTPs客户端会话期间有我的SSL_CTX对象,它是从注册到" CURLOPT_SSL_CTX_FUNCTION"的回调函数接收的。 如何从SSL_CTX获得Peer证书(服务器的证书)?

这是我试图在C中实现的C#代码:

Easy.SSLContextFunction sf = new Easy.SSLContextFunction(SSLContextFunctionCallback);
curlCode = easy.SetOpt(CURLoption.CURLOPT_SSL_CTX_FUNCTION, sf); 
...

CURLcode SSLContextFunctionCallback(SSLContext ctx, object extraData) 
{
    CURLcode retCode = CURLcode.CURLE_OK;
    IntPtr context = ctx.Context;
    retCode = ApsVerifyPeer(context); return retCode; 
}

我需要在C / C ++中实现ApsVerifyPeer函数来读取对等证书并验证证书中的OU字段,其中我有SSL上下文(SSL_CTX)。你能分享一下自己的想法吗?

1 个答案:

答案 0 :(得分:2)

  

如何从SSL_CTX获得Peer证书(服务器证书)?

您是从SSL*而不是SSL_CTX*对象获得的。那是因为它特定于连接或会话。

使用SSL_get_peer_certificate检索连接或会话的对等证书。

请注意,如果对等方未使用证书(如服务器和匿名协议),则返回的X509*可以为NULL

如果您确实收到了X509*,请务必致电X509_freeX509对象是引用计数,否则会泄漏内存(多年来我已经发现了很多这些泄漏,因为人们不知道它的引用计数了。)


  

我的目的是验证对等证书中的OU(“组织单位”)

我认为你必须要小心。 OU不保证是唯一的。我认为唯一的保证是它在DIT树中的一个组织中是独一无二的。也就是说,在一个组织内,它保证你会在第1级为“技术”找到不超过一个OU(你可以在第2级找到另一个)。但是,两个不同的组织,每个组织都具有“技术”OU,将至少产生一个您无法检测到的错误结果。

我认为你需要使用{Issuer DN, Cert SerialNumber}对,因为它的独特性。您可能可以使用KEYID - 即{Issuer Key Id, Subject Key Id},但您必须小心,因为可以在多个证书中使用相同的主题公钥。

您也可以使用Subject DN,但它可能只在一个特定的PKI中是唯一的。因此,您可能可以使用{Issuer DN, Subject DN}对。

所有这一切都取决于一条链条回到你信任的东西。

您可能需要阅读RFC 4158, Internet X.509 Public Key Infrastructure: Certification Path Building。它讨论了这些事情。