Я пытаюсь использовать https, используя cURL 7.21.1 с OpenSSL 1.0.0d, используя встроенный в OpenSSL механизм capi для проверки сертификатов, но он возвращает CURLE_SSL_CACERT (60) в curl_easy_perform ().
#include <openssl/conf.h>
#include <openssl/engine.h>
#include <openssl/ssl.h>
#define CURL_NO_OLDIES
#define CURL_STATICLIB
#include <curl.h>
// Don't forget libeay32.lib, ssleay32.lib, curl.lib
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "wldap32.lib")
#pragma comment(lib, "crypt32.lib")
int main(int argc, char* argv[])
{
OPENSSL_no_config();
ENGINE_load_capi();
// Same effect, despite ok = 1 both times:
// ENGINE* capi = ENGINE_by_id("capi");
// int ok = ENGINE_init(capi);
// ok = ENGINE_register_complete(capi);
CURLcode e = curl_global_init(CURL_GLOBAL_DEFAULT);
CURL* curl = curl_easy_init();
e = curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.com/");
e = curl_easy_perform(curl); // returns CURLE_SSL_CACERT
return 0;
}
Если я тестирую "openssl s_client -connect www.google.com:443" со следующей конфигурацией:
openssl_conf = openssl_init
[openssl_init]
engines = engine_section
[engine_section]
capi = capi_config
[capi_config]
engine_id = capi
init=1
на основе http://www.mail-archive.com/openssl-users@openssl.org/msg62249.html, я получаю:
verify error:num=20:unable to get local issuer certificate
Меня смущает то, что когда я впервые написал реальную программу, в которой происходит сбой, у нее была такая же ошибка, пока я не добавил ENGINE_load_capi ().
Я хотел бы избежать использования пакета CA, поскольку сама программа может работать внутри случайных корпоративных сетей, и они могут использовать частные CA.