mirror of
https://github.com/apache/httpd.git
synced 2025-08-08 15:02:10 +03:00
Streamline TLS session ticket key handling (added in r1200040):
- drop the SSLTicketKeyDefault directive, and only support a single ticket key per server/vhost - rename the SSLTicketKeyFile directive to SSLSessionTicketKeyFile, remove the keyname parameter - move ticket key parameters from SSLSrvConfigRec to modssl_ctx_t - configure the tlsext_ticket_key_cb only when in server mode - add documentation for SSLSessionTicketKeyFile git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1213380 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
@@ -1134,45 +1134,65 @@ static void ssl_init_server_certs(server_rec *s,
|
||||
#endif
|
||||
ssl_die();
|
||||
}
|
||||
|
||||
#ifdef HAVE_TLSEXT_TICKETS
|
||||
if (mctx->sc->tickets->nelts > 0) {
|
||||
|
||||
if (mctx->sc->default_ticket_name != NULL) {
|
||||
int i;
|
||||
modssl_ticket_t* ticket = NULL;
|
||||
mctx->sc->default_ticket = NULL;
|
||||
|
||||
for (i = 0; i < mctx->sc->tickets->nelts; i++) {
|
||||
ticket = APR_ARRAY_IDX(mctx->sc->tickets, i, modssl_ticket_t*);
|
||||
if (strcmp(ticket->conf_name, mctx->sc->default_ticket_name) == 0) {
|
||||
mctx->sc->default_ticket = ticket;
|
||||
}
|
||||
}
|
||||
|
||||
if (mctx->sc->default_ticket == NULL) {
|
||||
ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(01912)
|
||||
"Misconfigured TLS Tickets. Couldn't find key named '%s'",
|
||||
mctx->sc->default_ticket_name);
|
||||
ssl_die();
|
||||
}
|
||||
}
|
||||
else {
|
||||
mctx->sc->default_ticket = APR_ARRAY_IDX(mctx->sc->tickets, 0, modssl_ticket_t*);
|
||||
}
|
||||
|
||||
if (!SSL_CTX_set_tlsext_ticket_key_cb(mctx->ssl_ctx, ssl_callback_tlsext_tickets)) {
|
||||
ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(01913)
|
||||
"Unable to initialize TLS session ticket extension "
|
||||
"(incompatible OpenSSL version?)");
|
||||
ssl_log_ssl_error(SSLLOG_MARK, APLOG_EMERG, s);
|
||||
ssl_die();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
#ifdef HAVE_TLS_SESSION_TICKETS
|
||||
static void ssl_init_ticket_key(server_rec *s,
|
||||
apr_pool_t *p,
|
||||
apr_pool_t *ptemp,
|
||||
modssl_ctx_t *mctx)
|
||||
{
|
||||
apr_status_t rv;
|
||||
apr_file_t *fp;
|
||||
apr_size_t len;
|
||||
char buf[TLSEXT_TICKET_KEY_LEN];
|
||||
char *path;
|
||||
modssl_ticket_key_t *ticket_key = mctx->ticket_key;
|
||||
|
||||
if (!ticket_key->file_path) {
|
||||
return;
|
||||
}
|
||||
|
||||
path = ap_server_root_relative(p, ticket_key->file_path);
|
||||
|
||||
rv = apr_file_open(&fp, path, APR_READ|APR_BINARY,
|
||||
APR_OS_DEFAULT, ptemp);
|
||||
|
||||
if (rv != APR_SUCCESS) {
|
||||
ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(02286)
|
||||
"Failed to open ticket key file %s: (%d) %pm",
|
||||
path, rv, &rv);
|
||||
ssl_die();
|
||||
}
|
||||
|
||||
rv = apr_file_read_full(fp, &buf[0], TLSEXT_TICKET_KEY_LEN, &len);
|
||||
|
||||
if (rv != APR_SUCCESS) {
|
||||
ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(02287)
|
||||
"Failed to read %d bytes from %s: (%d) %pm",
|
||||
TLSEXT_TICKET_KEY_LEN, path, rv, &rv);
|
||||
ssl_die();
|
||||
}
|
||||
|
||||
memcpy(ticket_key->key_name, buf, 16);
|
||||
memcpy(ticket_key->hmac_secret, buf + 16, 16);
|
||||
memcpy(ticket_key->aes_key, buf + 32, 16);
|
||||
|
||||
if (!SSL_CTX_set_tlsext_ticket_key_cb(mctx->ssl_ctx,
|
||||
ssl_callback_SessionTicket)) {
|
||||
ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(01913)
|
||||
"Unable to initialize TLS session ticket key callback "
|
||||
"(incompatible OpenSSL version?)");
|
||||
ssl_log_ssl_error(SSLLOG_MARK, APLOG_EMERG, s);
|
||||
ssl_die();
|
||||
}
|
||||
|
||||
ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, APLOGNO(02288)
|
||||
"TLS session ticket key for %s successfully loaded from %s",
|
||||
(mySrvConfig(s))->vhost_id, path);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void ssl_init_proxy_certs(server_rec *s,
|
||||
apr_pool_t *p,
|
||||
apr_pool_t *ptemp,
|
||||
@@ -1322,6 +1342,10 @@ static void ssl_init_server_ctx(server_rec *s,
|
||||
ssl_init_ctx(s, p, ptemp, sc->server);
|
||||
|
||||
ssl_init_server_certs(s, p, ptemp, sc->server);
|
||||
|
||||
#ifdef HAVE_TLS_SESSION_TICKETS
|
||||
ssl_init_ticket_key(s, p, ptemp, sc->server);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user