summaryrefslogtreecommitdiffstats
path: root/usr.sbin/httpd
diff options
context:
space:
mode:
authorflorian <florian@openbsd.org>2019-01-08 18:35:27 +0000
committerflorian <florian@openbsd.org>2019-01-08 18:35:27 +0000
commit8f2f19698a0c65ee90a4c49a8521aec13a2ad8bd (patch)
tree53df9497adbed5610609372c4a7720656efbe1bd /usr.sbin/httpd
parentviocon: Remove obsolete handling of sc_intrhand (diff)
downloadwireguard-openbsd-8f2f19698a0c65ee90a4c49a8521aec13a2ad8bd.tar.xz
wireguard-openbsd-8f2f19698a0c65ee90a4c49a8521aec13a2ad8bd.zip
Allow httpd(8) to start when TLS is configured but a cert is not yet
available. Assuming a httpd.conf based on /etc/examples/httpd.conf, httpd(8) will only listen on port 80 and serve the acme-challenge directory for acme-client(1). The workflow to get a certificate then becomes acme-client -vAD example.com && rcctl reload httpd Without the need to edit the httpd.conf yet again. Once the cert is in place and httpd is reloaded it starts to serve on port 443. Idea, tweaks & OK deraadt, OK benno
Diffstat (limited to 'usr.sbin/httpd')
-rw-r--r--usr.sbin/httpd/parse.y26
-rw-r--r--usr.sbin/httpd/server.c13
2 files changed, 22 insertions, 17 deletions
diff --git a/usr.sbin/httpd/parse.y b/usr.sbin/httpd/parse.y
index 9f3b70526d9..a68bddc2486 100644
--- a/usr.sbin/httpd/parse.y
+++ b/usr.sbin/httpd/parse.y
@@ -1,4 +1,4 @@
-/* $OpenBSD: parse.y,v 1.107 2018/11/01 00:18:44 sashan Exp $ */
+/* $OpenBSD: parse.y,v 1.108 2019/01/08 18:35:27 florian Exp $ */
/*
* Copyright (c) 2007 - 2015 Reyk Floeter <reyk@openbsd.org>
@@ -344,13 +344,10 @@ server : SERVER optmatch STRING {
YYERROR;
}
- if (server_tls_load_keypair(srv) == -1) {
- yyerror("server \"%s\": failed to load "
- "public/private keys", srv->srv_conf.name);
- serverconfig_free(srv_conf);
- free(srv);
- YYERROR;
- }
+ if (server_tls_load_keypair(srv) == -1)
+ log_warnx("%s:%d: server \"%s\": failed to "
+ "load public/private keys", file->name,
+ yylval.lineno, srv->srv_conf.name);
if (server_tls_load_ca(srv) == -1) {
yyerror("server \"%s\": failed to load "
@@ -2133,16 +2130,13 @@ server_inherit(struct server *src, struct server_config *alias,
dst->srv_conf.flags &= ~SRVFLAG_SERVER_MATCH;
dst->srv_conf.flags |= (alias->flags & SRVFLAG_SERVER_MATCH);
- if (server_tls_load_keypair(dst) == -1) {
- yyerror("failed to load public/private keys "
- "for server %s", dst->srv_conf.name);
- serverconfig_free(&dst->srv_conf);
- free(dst);
- return (NULL);
- }
+ if (server_tls_load_keypair(dst) == -1)
+ log_warnx("%s:%d: server \"%s\": failed to "
+ "load public/private keys", file->name,
+ yylval.lineno, dst->srv_conf.name);
if (server_tls_load_ca(dst) == -1) {
- yyerror("falied to load ca cert(s) for server %s",
+ yyerror("failed to load ca cert(s) for server %s",
dst->srv_conf.name);
serverconfig_free(&dst->srv_conf);
return NULL;
diff --git a/usr.sbin/httpd/server.c b/usr.sbin/httpd/server.c
index 63536a060e2..82d2c44c8f0 100644
--- a/usr.sbin/httpd/server.c
+++ b/usr.sbin/httpd/server.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: server.c,v 1.116 2018/10/11 09:52:22 benno Exp $ */
+/* $OpenBSD: server.c,v 1.117 2019/01/08 18:35:27 florian Exp $ */
/*
* Copyright (c) 2006 - 2015 Reyk Floeter <reyk@openbsd.org>
@@ -119,6 +119,13 @@ server_privinit(struct server *srv)
}
/* Open listening socket in the privileged process */
+ if ((srv->srv_conf.flags & SRVFLAG_TLS) && srv->srv_conf.tls_cert ==
+ NULL) {
+ /* soft fail if cert is not there yet */
+ srv->srv_s = -1;
+ return (0);
+ }
+
if ((srv->srv_s = server_socket_listen(&srv->srv_conf.ss,
srv->srv_conf.port, &srv->srv_conf)) == -1)
return (-1);
@@ -250,6 +257,10 @@ server_tls_init(struct server *srv)
if ((srv->srv_conf.flags & SRVFLAG_TLS) == 0)
return (0);
+ if (srv->srv_conf.tls_cert == NULL)
+ /* soft fail if cert is not there yet */
+ return (0);
+
log_debug("%s: setting up tls for %s", __func__, srv->srv_conf.name);
if (tls_init() != 0) {