summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2022-12-20 23:16:12 +0200
committerTimo Teräs <timo.teras@iki.fi>2022-12-21 00:26:53 +0200
commit8ad1884f1f42c6ba3d21832d57287028eedd6f03 (patch)
treee0c31f75b5207b1ab7c595eede95c38be87d00c7
parentc1370f9f50708c8777eac3131cab337c16968175 (diff)
downloadapk-tools-8ad1884f1f42c6ba3d21832d57287028eedd6f03.tar.gz
apk-tools-8ad1884f1f42c6ba3d21832d57287028eedd6f03.tar.bz2
apk-tools-8ad1884f1f42c6ba3d21832d57287028eedd6f03.tar.xz
apk-tools-8ad1884f1f42c6ba3d21832d57287028eedd6f03.zip
apk, fetch: implement --no-check-certificate
fixes #10650
-rw-r--r--doc/apk.8.scd3
-rw-r--r--libfetch/common.c13
-rw-r--r--libfetch/fetch.h2
-rw-r--r--src/apk.c4
4 files changed, 20 insertions, 2 deletions
diff --git a/doc/apk.8.scd b/doc/apk.8.scd
index dcabf45..3b5797e 100644
--- a/doc/apk.8.scd
+++ b/doc/apk.8.scd
@@ -139,6 +139,9 @@ The following options are available for all commands.
*--no-cache*
Do not use any local cache path.
+*--no-check-certificate*
+ Do not validate the HTTPS server certificates.
+
*--no-interactive*
Disable interactive mode.
diff --git a/libfetch/common.c b/libfetch/common.c
index 4a6b867..f867373 100644
--- a/libfetch/common.c
+++ b/libfetch/common.c
@@ -55,6 +55,8 @@
/*** Local data **************************************************************/
+static int ssl_verify_mode = SSL_VERIFY_PEER;
+
/*
* Error messages for resolver errors
*/
@@ -79,6 +81,12 @@ fetch_finderr(struct fetcherr *p, int e)
return (p);
}
+void
+fetch_no_check_certificate(void)
+{
+ ssl_verify_mode = SSL_VERIFY_NONE;
+}
+
/*
* Set error code
*/
@@ -466,7 +474,7 @@ static int fetch_ssl_setup_peer_verification(SSL_CTX *ctx, int verbose)
else
SSL_CTX_set_default_verify_paths(ctx);
- SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, 0);
+ SSL_CTX_set_verify(ctx, ssl_verify_mode, 0);
return 1;
}
@@ -573,7 +581,8 @@ fetch_ssl(conn_t *conn, const struct url *URL, int verbose)
NULL) != 1) {
fprintf(stderr, "SSL certificate subject doesn't match host %s\n",
URL->host);
- return -1;
+ if (ssl_verify_mode != SSL_VERIFY_NONE)
+ return -1;
}
}
diff --git a/libfetch/fetch.h b/libfetch/fetch.h
index 66b77f4..0c07c05 100644
--- a/libfetch/fetch.h
+++ b/libfetch/fetch.h
@@ -101,6 +101,8 @@ struct url_list {
extern "C" {
#endif
+void fetch_no_check_certificate(void);
+
void fetchIO_close(fetchIO *);
ssize_t fetchIO_read(fetchIO *, void *, size_t);
ssize_t fetchIO_write(fetchIO *, const void *, size_t);
diff --git a/src/apk.c b/src/apk.c
index ce937cf..448e388 100644
--- a/src/apk.c
+++ b/src/apk.c
@@ -86,6 +86,7 @@ static struct apk_repository_list *apk_repository_new(const char *url)
OPT(OPT_GLOBAL_interactive, APK_OPT_SH("i") "interactive") \
OPT(OPT_GLOBAL_keys_dir, APK_OPT_ARG "keys-dir") \
OPT(OPT_GLOBAL_no_cache, "no-cache") \
+ OPT(OPT_GLOBAL_no_check_certificate, "no-check-certificate") \
OPT(OPT_GLOBAL_no_interactive, "no-interactive") \
OPT(OPT_GLOBAL_no_network, "no-network") \
OPT(OPT_GLOBAL_no_progress, "no-progress") \
@@ -196,6 +197,9 @@ static int option_parse_global(void *ctx, struct apk_db_options *dbopts, int opt
case OPT_GLOBAL_no_cache:
apk_flags |= APK_NO_CACHE;
break;
+ case OPT_GLOBAL_no_check_certificate:
+ fetch_no_check_certificate();
+ break;
case OPT_GLOBAL_cache_dir:
dbopts->cache_dir = optarg;
break;