使用libcurl进行自定义SSL证书验证

使用libcurl进行自定义SSL证书验证,c,ssl,curl,libcurl,C,Ssl,Curl,Libcurl,我需要libcurl来接受自签名证书,但我不希望它们被盲目接受。在允许连接继续之前,我需要能够验证证书是否为预期的自签名证书 在.NET中,这是通过使用SslStream或HttpWebRequest设置RemoteCertificateValidationCallback来完成的。回调提供证书,可以进行检查以验证预期的详细信息。如果您想知道,我有一个安全的方法将证书详细信息分发给需要它们的代理 对于libcurl,最接近SSL回调的是CURLOPT_SSL_CTX_函数,但文档中指出: lib

我需要libcurl来接受自签名证书,但我不希望它们被盲目接受。在允许连接继续之前,我需要能够验证证书是否为预期的自签名证书

在.NET中,这是通过使用SslStream或HttpWebRequest设置RemoteCertificateValidationCallback来完成的。回调提供证书,可以进行检查以验证预期的详细信息。如果您想知道,我有一个安全的方法将证书详细信息分发给需要它们的代理

对于libcurl,最接近SSL回调的是CURLOPT_SSL_CTX_函数,但文档中指出:

libcurl在处理了所有其他与SSL相关的选项之后,在SSL连接初始化之前调用此回调函数,以便为应用程序提供最后一次修改SSL初始化行为的机会


这意味着在进行实际SSL连接之前调用回调,这意味着尚未收到要验证的证书。除非我误解了我在回调中可以做什么,否则有没有办法用libcurl进行我自己的SSL验证?

@0xdeadbeef您可以使用SSL回调。这样,您将收到SSL_CTX*。使用此指针更改默认的“验证”函数,并将其指向您自己的“验证”方法。您需要使用SSL\u CTX\u set\u验证。['https://www.openssl.org/docs/man1.0.2/man3/SSL_CTX_set_verify.html']

@0xdeadbeef您可以使用SSL回调。这样,您将收到SSL_CTX*。使用此指针更改默认的“验证”函数,并将其指向您自己的“验证”方法。您需要使用SSL\u CTX\u set\u验证。['https://www.openssl.org/docs/man1.0.2/man3/SSL_CTX_set_verify.html“]

上面说:“您可以使用此函数调用特定于库的回调,为证书添加额外的验证代码,甚至更改HTTPS请求的实际URI。”@BrechtSanders对,但此回调仍然发生在连接之前(至少根据文档)那么如何进行额外的验证呢?上面说的是:“libcurl在处理完所有其他与SSL相关的选项后,会在SSL连接初始化之前调用此回调函数,以便为应用程序提供最后一次修改SSL初始化行为的机会。”因此,据我所见,证书已交换,因为这是使用这些证书设置实际SSL连接之前的最后一步。@Brechsanders我认为您的解释不正确。文档进一步说,“如果回调返回错误,则不会尝试建立连接。”这意味着这是预证书交换。@0xdeadbeef您解决了这个问题吗?我还想知道这个回调是在连接之前还是连接之后发生的?上面写着:“您可以使用此函数调用特定于库的回调来为证书添加额外的验证代码,甚至更改HTTPS请求的实际URI。”@BrechtSanders是的,但此回调仍然发生在连接之前(至少根据文档),因此您如何做额外的验证?所说的是:”libcurl在处理了所有其他与SSL相关的选项之后,在SSL连接初始化之前调用此回调函数,以便为应用程序提供最后一次修改SSL初始化行为的机会。“据我所见,证书已交换,因为这是使用这些证书建立实际SSL连接之前的最后一步。@BrechtSanders我认为您的解释不正确。文档进一步说,“如果回调返回错误,则不会尝试建立连接。”这意味着这是预证书交换。@0xdeadbeef您解决了这个问题吗?我还想知道这个回调是在连接之前还是连接之后发生的?