Практически любая, сколь-нибудь не стандартная задача выливается в часы малопродуктивного гугления, что печалит. Сегодня я искал ответ на вопрос, как в OSX получить сертификаты сайта, с которым ты планируешь общаться по HTTPS. До кучи дело осложняется тем, что все должно работать не только напрямую, но и через прокси.
Если говорить о Windows, данная задача решается довольно просто, благодаря библиотеке WinHTTP (кажется, ее так звать) и функции
Изначально я присматривался к функции обратного вызова, регистрируемой посредствам
Второй вариант оказался куда как более удачным: комбинация
curl_easy_setopt(curl, CURLOPT_CERTINFO, 1L);
// ...
union {
struct curl_slist *to_info;
struct curl_certinfo *to_certinfo;
} ptr;
ptr.to_info = NULL;
res = curl_easy_getinfo(curl, CURLINFO_CERTINFO, &ptr.to_info);
if(!res && ptr.to_info) {
for(int i = 0; i < ptr.to_certinfo->num_of_certs; i++) {
for(struct curl_slist *slist = ptr.to_certinfo->certinfo[i]; slist; slist = slist->next)
{
if(strstr(slist->data, "Cert:"))
printf("%s\n", slist->data+strlen("Cert:"));
}
}
}
Остается самая малость – слегка изменить конфигурацию cURL. Во-первых, так как нужно гарантировано получать сертификат вне зависимости от того, был ли он корректно проверен про цепочке, необходимо отключить проверки хоста и канала:
Сертификат возвращается в формате X.509 и может быть легко открыт любой стандартной читалкой сертификатов или OpenSSL-подобной библиотекой.