http: implement public key pinning
Add the http.pinnedpubkey configuration option for public key pinning. It allows any string supported by libcurl -- base64(sha256(pubkey)) or filename of the full public key. If cURL does not support pinning (is too old) output a warning to the user. Signed-off-by: Christoph Egger <christoph@christoph-egger.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
a08595f761
commit
aeff8a6121
15
http.c
15
http.c
@ -57,6 +57,9 @@ static const char *ssl_key;
|
||||
#if LIBCURL_VERSION_NUM >= 0x070908
|
||||
static const char *ssl_capath;
|
||||
#endif
|
||||
#if LIBCURL_VERSION_NUM >= 0x072c00
|
||||
static const char *ssl_pinnedkey;
|
||||
#endif
|
||||
static const char *ssl_cainfo;
|
||||
static long curl_low_speed_limit = -1;
|
||||
static long curl_low_speed_time = -1;
|
||||
@ -273,6 +276,14 @@ static int http_options(const char *var, const char *value, void *cb)
|
||||
if (!strcmp("http.useragent", var))
|
||||
return git_config_string(&user_agent, var, value);
|
||||
|
||||
if (!strcmp("http.pinnedpubkey", var)) {
|
||||
#if LIBCURL_VERSION_NUM >= 0x072c00
|
||||
return git_config_pathname(&ssl_pinnedkey, var, value);
|
||||
#else
|
||||
warning(_("Public key pinning not supported with cURL < 7.44.0"));
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
/* Fall back on the default ones */
|
||||
return git_default_config(var, value, cb);
|
||||
}
|
||||
@ -414,6 +425,10 @@ static CURL *get_curl_handle(void)
|
||||
#if LIBCURL_VERSION_NUM >= 0x070908
|
||||
if (ssl_capath != NULL)
|
||||
curl_easy_setopt(result, CURLOPT_CAPATH, ssl_capath);
|
||||
#endif
|
||||
#if LIBCURL_VERSION_NUM >= 0x072c00
|
||||
if (ssl_pinnedkey != NULL)
|
||||
curl_easy_setopt(result, CURLOPT_PINNEDPUBLICKEY, ssl_pinnedkey);
|
||||
#endif
|
||||
if (ssl_cainfo != NULL)
|
||||
curl_easy_setopt(result, CURLOPT_CAINFO, ssl_cainfo);
|
||||
|
Reference in New Issue
Block a user