mirror of
https://github.com/curl/curl.git
synced 2026-08-24 10:53:32 +03:00
rustls: make all tests pass
- supports IP addresses in certs since 0.21 - Remove workaround, and re-enable tests Closes #14317
This commit is contained in:
parent
ec41cfb809
commit
dd95a49d49
3 changed files with 42 additions and 41 deletions
|
|
@ -14,6 +14,7 @@ TLS-backend:
|
||||||
- GnuTLS
|
- GnuTLS
|
||||||
- mbedTLS
|
- mbedTLS
|
||||||
- OpenSSL
|
- OpenSSL
|
||||||
|
- rustls
|
||||||
Added-in: 7.19.0
|
Added-in: 7.19.0
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -403,20 +403,26 @@ cr_verify_none(void *userdata UNUSED_PARAM,
|
||||||
return RUSTLS_RESULT_OK;
|
return RUSTLS_RESULT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static int
|
||||||
cr_hostname_is_ip(const char *hostname)
|
read_file_into(const char *filename,
|
||||||
|
struct dynbuf *out)
|
||||||
{
|
{
|
||||||
struct in_addr in;
|
FILE *f = fopen(filename, FOPEN_READTEXT);
|
||||||
#ifdef USE_IPV6
|
if(!f) {
|
||||||
struct in6_addr in6;
|
return 0;
|
||||||
if(Curl_inet_pton(AF_INET6, hostname, &in6) > 0) {
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
#endif /* USE_IPV6 */
|
|
||||||
if(Curl_inet_pton(AF_INET, hostname, &in) > 0) {
|
while(!feof(f)) {
|
||||||
return true;
|
uint8_t buf[256];
|
||||||
|
size_t rr = fread(buf, 1, sizeof(buf), f);
|
||||||
|
if(rr == 0 ||
|
||||||
|
CURLE_OK != Curl_dyn_addn(out, buf, rr)) {
|
||||||
|
fclose(f);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
|
return fclose(f) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static CURLcode
|
static CURLcode
|
||||||
|
|
@ -436,7 +442,6 @@ cr_init_backend(struct Curl_cfilter *cf, struct Curl_easy *data,
|
||||||
/* CURLOPT_CAINFO_BLOB overrides CURLOPT_CAINFO */
|
/* CURLOPT_CAINFO_BLOB overrides CURLOPT_CAINFO */
|
||||||
(ca_info_blob ? NULL : conn_config->CAfile);
|
(ca_info_blob ? NULL : conn_config->CAfile);
|
||||||
const bool verifypeer = conn_config->verifypeer;
|
const bool verifypeer = conn_config->verifypeer;
|
||||||
const char *hostname = connssl->peer.hostname;
|
|
||||||
char errorbuf[256];
|
char errorbuf[256];
|
||||||
size_t errorlen;
|
size_t errorlen;
|
||||||
rustls_result result;
|
rustls_result result;
|
||||||
|
|
@ -462,14 +467,6 @@ cr_init_backend(struct Curl_cfilter *cf, struct Curl_easy *data,
|
||||||
if(!verifypeer) {
|
if(!verifypeer) {
|
||||||
rustls_client_config_builder_dangerous_set_certificate_verifier(
|
rustls_client_config_builder_dangerous_set_certificate_verifier(
|
||||||
config_builder, cr_verify_none);
|
config_builder, cr_verify_none);
|
||||||
/* rustls does not support IP addresses (as of 0.19.0), and will reject
|
|
||||||
* connections created with an IP address, even when certificate
|
|
||||||
* verification is turned off. Set a placeholder hostname and disable
|
|
||||||
* SNI. */
|
|
||||||
if(cr_hostname_is_ip(hostname)) {
|
|
||||||
rustls_client_config_builder_set_enable_sni(config_builder, false);
|
|
||||||
hostname = "example.invalid";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if(ca_info_blob || ssl_cafile) {
|
else if(ca_info_blob || ssl_cafile) {
|
||||||
roots_builder = rustls_root_cert_store_builder_new();
|
roots_builder = rustls_root_cert_store_builder_new();
|
||||||
|
|
@ -511,6 +508,29 @@ cr_init_backend(struct Curl_cfilter *cf, struct Curl_easy *data,
|
||||||
}
|
}
|
||||||
|
|
||||||
verifier_builder = rustls_web_pki_server_cert_verifier_builder_new(roots);
|
verifier_builder = rustls_web_pki_server_cert_verifier_builder_new(roots);
|
||||||
|
rustls_root_cert_store_free(roots);
|
||||||
|
|
||||||
|
if(conn_config->CRLfile) {
|
||||||
|
struct dynbuf crl_contents;
|
||||||
|
Curl_dyn_init(&crl_contents, SIZE_MAX);
|
||||||
|
if(!read_file_into(conn_config->CRLfile, &crl_contents)) {
|
||||||
|
failf(data, "rustls: failed to read revocation list file");
|
||||||
|
Curl_dyn_free(&crl_contents);
|
||||||
|
rustls_web_pki_server_cert_verifier_builder_free(verifier_builder);
|
||||||
|
return CURLE_SSL_CRL_BADFILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = rustls_web_pki_server_cert_verifier_builder_add_crl(
|
||||||
|
verifier_builder,
|
||||||
|
Curl_dyn_uptr(&crl_contents),
|
||||||
|
Curl_dyn_len(&crl_contents));
|
||||||
|
Curl_dyn_free(&crl_contents);
|
||||||
|
if(result != RUSTLS_RESULT_OK) {
|
||||||
|
failf(data, "rustls: failed to parse revocation list");
|
||||||
|
rustls_web_pki_server_cert_verifier_builder_free(verifier_builder);
|
||||||
|
return CURLE_SSL_CRL_BADFILE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
result = rustls_web_pki_server_cert_verifier_builder_build(
|
result = rustls_web_pki_server_cert_verifier_builder_build(
|
||||||
verifier_builder, &server_cert_verifier);
|
verifier_builder, &server_cert_verifier);
|
||||||
|
|
@ -525,6 +545,7 @@ cr_init_backend(struct Curl_cfilter *cf, struct Curl_easy *data,
|
||||||
|
|
||||||
rustls_client_config_builder_set_server_verifier(config_builder,
|
rustls_client_config_builder_set_server_verifier(config_builder,
|
||||||
server_cert_verifier);
|
server_cert_verifier);
|
||||||
|
rustls_server_cert_verifier_free(server_cert_verifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
backend->config = rustls_client_config_builder_build(config_builder);
|
backend->config = rustls_client_config_builder_build(config_builder);
|
||||||
|
|
|
||||||
|
|
@ -85,27 +85,6 @@
|
||||||
2307
|
2307
|
||||||
%endif
|
%endif
|
||||||
2043
|
2043
|
||||||
# The CRL test (313) doesn't work with rustls because rustls doesn't support
|
|
||||||
# CRLs.
|
|
||||||
# Tests that rely on connecting to an IP address over TLS don't work because
|
|
||||||
# rustls doesn't support IP address certificates yet. That's the 400 series of
|
|
||||||
# tests listed here, plus 1112 and 1272
|
|
||||||
%if rustls
|
|
||||||
313
|
|
||||||
400
|
|
||||||
401
|
|
||||||
403
|
|
||||||
404
|
|
||||||
406
|
|
||||||
407
|
|
||||||
408
|
|
||||||
409
|
|
||||||
987
|
|
||||||
988
|
|
||||||
989
|
|
||||||
1112
|
|
||||||
1272
|
|
||||||
%endif
|
|
||||||
# The CRL test doesn't work with wolfSSL
|
# The CRL test doesn't work with wolfSSL
|
||||||
%if wolfssl
|
%if wolfssl
|
||||||
313
|
313
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue