【发布时间】:2020-10-31 10:54:21
【问题描述】:
我需要 libcurl 来接受自签名证书,但我不希望它们被盲目接受。在允许连接继续之前,我需要能够验证证书是预期的自签名证书。
在 .NET 中,这是通过使用 SslStream 或 HttpWebRequest 设置 RemoteCertificateValidationCallback 来完成的。回调提供证书,并且可以进行检查以验证预期的详细信息。如果您想知道,我有一种将证书详细信息分发给需要它们的代理的安全方法。
对于 libcurl,最接近 SSL 回调的是 CURLOPT_SSL_CTX_FUNCTION 但是文档状态:
在处理完所有其他 SSL 相关选项后,libcurl 会在 SSL 连接初始化之前调用此回调函数,以便为应用程序提供修改 SSL 初始化行为的最后机会。
这意味着在建立实际 SSL 连接之前调用回调,这意味着尚未收到证书以进行验证。除非我误解了我可以在该回调中做什么,否则有没有办法使用 libcurl 进行自己的 SSL 验证?
【问题讨论】:
-
curl.haxx.se/libcurl/c/CURLOPT_SSL_CTX_FUNCTION.html 上写着:“您可以使用此函数调用特定于库的回调来为证书添加额外的验证代码,甚至更改 HTTPS 请求的实际 URI。”跨度>
-
@BrechtSanders 是的,但是这个回调仍然发生在连接之前(至少根据文档)所以你怎么能做额外的验证?
-
意思是:“在处理所有其他 SSL 相关选项后,libcurl 会在初始化 SSL 连接之前调用此回调函数,以便为应用程序提供最后机会修改SSL 初始化。”因此,正如我所见,证书已被交换,因为这是使用这些证书设置实际 SSL 连接之前的最后一步。
-
@BrechtSanders 我认为您的解释不正确。文档进一步说“如果回调返回错误,则不会尝试建立连接。”这意味着这是预证书交换。
-
@0xdeadbeef 你解决了这个问题吗?我也想知道这个回调是发生在连接前还是连接后?