Hi Bruno, thanks for your efforts. I‘ve already written an OCSP patch which was being delayed in review.
I don’t have the patch at hand but you can see the branch at https://github.com/reyk/relayd/tree/ocsp Reyk > Am 20.06.2019 um 19:58 schrieb Bruno Flueckiger <inform...@gmx.net>: > > Hi, > > The patch below adds OCSP stapling to the TLS server in relayd(8). The > OCSP response is read from a binary encoded DER file that can be created > using ocspcheck(8). > > If a file with the same name as the certificate and private key files is > found, its content is loaded and OCSP stapling is active. If there is no > file or loading its content fails, OCSP stapling remains disabled. > > relayd(8) uses the same mechanism it uses to find the certificate file, > only the file name extension is different: .der instead of .pem > > Cheers, > Bruno > > Index: usr.sbin/relayd/config.c > =================================================================== > RCS file: /cvs/src/usr.sbin/relayd/config.c,v > retrieving revision 1.39 > diff -u -p -r1.39 config.c > --- usr.sbin/relayd/config.c 1 Jun 2019 09:54:19 -0000 1.39 > +++ usr.sbin/relayd/config.c 20 Jun 2019 17:37:09 -0000 > @@ -913,6 +913,14 @@ config_setrelay(struct relayd *env, stru > rlay->rl_conf.name); > return (-1); > } > + if (cert->cert_ocsp_fd != -1 && > + config_setrelayfd(ps, id, n, > + cert->cert_id, cert->cert_relayid, > + RELAY_FD_OCSP, cert->cert_ocsp_fd) == -1) { > + log_warn("%s: fd passing failed for " > + "`%s'", __func__, > + rlay->rl_conf.name); > + } > } > } > > @@ -992,6 +1000,10 @@ config_setrelay(struct relayd *env, stru > close(cert->cert_key_fd); > cert->cert_key_fd = -1; > } > + if (cert->cert_ocsp_fd != -1) { > + close(cert->cert_ocsp_fd); > + cert->cert_ocsp_fd = -1; > + } > } > > return (0); > @@ -1113,6 +1125,7 @@ config_getrelayfd(struct relayd *env, st > switch (crfd.type) { > case RELAY_FD_CERT: > case RELAY_FD_KEY: > + case RELAY_FD_OCSP: > if ((cert = cert_find(env, crfd.id)) == NULL) { > if ((cert = cert_add(env, crfd.id)) == NULL) > return (-1); > @@ -1139,6 +1152,9 @@ config_getrelayfd(struct relayd *env, st > break; > case RELAY_FD_CAFILE: > rlay->rl_tls_cacert_fd = imsg->fd; > + break; > + case RELAY_FD_OCSP: > + cert->cert_ocsp_fd = imsg->fd; > break; > } > > Index: usr.sbin/relayd/relay.c > =================================================================== > RCS file: /cvs/src/usr.sbin/relayd/relay.c,v > retrieving revision 1.247 > diff -u -p -r1.247 relay.c > --- usr.sbin/relayd/relay.c 31 May 2019 15:15:37 -0000 1.247 > +++ usr.sbin/relayd/relay.c 20 Jun 2019 17:37:09 -0000 > @@ -2130,8 +2130,8 @@ relay_tls_ctx_create(struct relay *rlay) > struct relay_cert *cert; > const char *fake_key; > int fake_keylen, keyfound = 0; > - char *buf = NULL, *cabuf = NULL; > - off_t len = 0, calen = 0; > + char *buf = NULL, *cabuf = NULL, *ocspbuf = NULL; > + off_t len = 0, calen = 0, ocsplen = 0; > > if ((tls_cfg = tls_config_new()) == NULL) { > log_warnx("unable to allocate TLS config"); > @@ -2209,9 +2209,19 @@ relay_tls_ctx_create(struct relay *rlay) > goto err; > } > > + if (cert->cert_ocsp_fd == -1) > + goto without; > + > + if ((ocspbuf = relay_load_fd(cert->cert_ocsp_fd, > + &ocsplen)) == NULL) { > + log_warn("failed to load ocsp staple"); > + ocsplen = 0; > + } > + > + without: > if (keyfound == 1 && > tls_config_set_keypair_ocsp_mem(tls_cfg, buf, len, > - fake_key, fake_keylen, NULL, 0) != 0) { > + fake_key, fake_keylen, ocspbuf, ocsplen) != 0) { > log_warnx("failed to set tls certificate: %s", > tls_config_error(tls_cfg)); > goto err; > @@ -2223,7 +2233,7 @@ relay_tls_ctx_create(struct relay *rlay) > goto err; > > if (tls_config_add_keypair_ocsp_mem(tls_cfg, buf, len, > - fake_key, fake_keylen, NULL, 0) != 0) { > + fake_key, fake_keylen, ocspbuf, ocsplen) != 0) { > log_warnx("failed to add tls certificate: %s", > tls_config_error(tls_cfg)); > goto err; > Index: usr.sbin/relayd/relayd.c > =================================================================== > RCS file: /cvs/src/usr.sbin/relayd/relayd.c,v > retrieving revision 1.179 > diff -u -p -r1.179 relayd.c > --- usr.sbin/relayd/relayd.c 31 May 2019 15:25:57 -0000 1.179 > +++ usr.sbin/relayd/relayd.c 20 Jun 2019 17:37:09 -0000 > @@ -1270,6 +1270,7 @@ cert_add(struct relayd *env, objid_t id) > cert->cert_id = id; > cert->cert_fd = -1; > cert->cert_key_fd = -1; > + cert->cert_ocsp_fd = -1; > > TAILQ_INSERT_TAIL(env->sc_certs, cert, cert_entry); > > @@ -1325,7 +1326,7 @@ relay_load_certfiles(struct relayd *env, > struct protocol *proto = rlay->rl_proto; > struct relay_cert *cert; > int useport = htons(rlay->rl_conf.port); > - int cert_fd = -1, key_fd = -1; > + int cert_fd = -1, key_fd = -1, ocsp_fd = -1; > > if (rlay->rl_conf.flags & F_TLSCLIENT) { > if (strlen(proto->tlsca) && rlay->rl_tls_ca_fd == -1) { > @@ -1389,12 +1390,32 @@ relay_load_certfiles(struct relayd *env, > goto fail; > log_debug("%s: using private key %s", __func__, certfile); > > + if (useport) { > + if (snprintf(certfile, sizeof(certfile), > + "/etc/ssl/%s:%u.der", hbuf, useport) == -1) > + goto add; > + } else { > + if (snprintf(certfile, sizeof(certfile), > + "/etc/ssl/%s.der", hbuf) == -1) > + goto add; > + } > + if (access(certfile, F_OK) == -1) > + goto add; > + if ((ocsp_fd = open(certfile, O_RDONLY)) == -1) { > + log_warn("%s: cannot open ocsp staple file %s", __func__, > + certfile); > + goto add; > + } > + log_debug("%s: using ocsp staple file %s", __func__, certfile); > + > + add: > if ((cert = cert_add(env, 0)) == NULL) > goto fail; > > cert->cert_relayid = rlay->rl_conf.id; > cert->cert_fd = cert_fd; > cert->cert_key_fd = key_fd; > + cert->cert_ocsp_fd = ocsp_fd; > > return (0); > > @@ -1403,6 +1424,8 @@ relay_load_certfiles(struct relayd *env, > close(cert_fd); > if (key_fd != -1) > close(key_fd); > + if (ocsp_fd != -1) > + close(ocsp_fd); > > return (-1); > } > Index: usr.sbin/relayd/relayd.conf.5 > =================================================================== > RCS file: /cvs/src/usr.sbin/relayd/relayd.conf.5,v > retrieving revision 1.190 > diff -u -p -r1.190 relayd.conf.5 > --- usr.sbin/relayd/relayd.conf.5 31 May 2019 15:25:57 -0000 1.190 > +++ usr.sbin/relayd/relayd.conf.5 20 Jun 2019 17:37:09 -0000 > @@ -948,20 +948,27 @@ The default is > .Ic no edh . > .It Ic keypair Ar name > The relay will attempt to look up a private key in > -.Pa /etc/ssl/private/name:port.key > -and a public certificate in > +.Pa /etc/ssl/private/name:port.key , > +a public certificate in > .Pa /etc/ssl/name:port.crt , > +and an OCSP reponse for stapling in > +.Pa /etc/ssl/name:port.der , > where > .Ar port > is the specified port that the relay listens on. > If these files are not present, the relay will continue to look in > -.Pa /etc/ssl/private/name.key > +.Pa /etc/ssl/private/name.key , > +.Pa /etc/ssl/name.crt , > and > -.Pa /etc/ssl/name.crt . > +.Pa /etc/ssl/name.der . > This option can be specified multiple times for TLS Server Name Indication. > If not specified, > a keypair will be loaded using the specified IP address of the relay as > .Ar name . > +The OCSP response file is only required if the relay should provide OCSP > +stapling. > +.Xr ocspcheck 8 > +can be used to create a staplefile. > See > .Xr ssl 8 > for details about SSL/TLS server certificates. > Index: usr.sbin/relayd/relayd.h > =================================================================== > RCS file: /cvs/src/usr.sbin/relayd/relayd.h,v > retrieving revision 1.258 > diff -u -p -r1.258 relayd.h > --- usr.sbin/relayd/relayd.h 31 May 2019 15:25:57 -0000 1.258 > +++ usr.sbin/relayd/relayd.h 20 Jun 2019 17:37:09 -0000 > @@ -141,7 +141,8 @@ enum fd_type { > RELAY_FD_CERT = 1, > RELAY_FD_CACERT = 2, > RELAY_FD_CAFILE = 3, > - RELAY_FD_KEY = 4 > + RELAY_FD_KEY = 4, > + RELAY_FD_OCSP = 5 > }; > > struct ctl_relayfd { > @@ -781,6 +782,7 @@ struct relay_cert { > objid_t cert_relayid; > int cert_fd; > int cert_key_fd; > + int cert_ocsp_fd; > EVP_PKEY *cert_pkey; > TAILQ_ENTRY(relay_cert) cert_entry; > }; >