我的目的是验证对等证书中的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)。你能分享一下自己的想法吗?
答案 0 :(得分:2)
如何从SSL_CTX获得Peer证书(服务器证书)?
您是从SSL*
而不是SSL_CTX*
对象获得的。那是因为它特定于连接或会话。
使用SSL_get_peer_certificate
检索连接或会话的对等证书。
请注意,如果对等方未使用证书(如服务器和匿名协议),则返回的X509*
可以为NULL 。
如果您确实收到了X509*
,请务必致电X509_free
。 X509
对象是引用计数,否则会泄漏内存(多年来我已经发现了很多这些泄漏,因为人们不知道它的引用计数了。)
我的目的是验证对等证书中的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。它讨论了这些事情。