@@ -200,6 +200,12 @@ static SSLSrvConfigRec *ssl_config_server_new(apr_pool_t *p)
200200 sc -> fips = UNSET ;
201201#endif
202202
203+ #ifdef HAVE_TLSEXT_TICKETS
204+ sc -> default_ticket_name = NULL ;
205+ sc -> default_ticket = NULL ;
206+ sc -> tickets = apr_array_make (p , 4 , sizeof (modssl_ticket_t * ));
207+ #endif
208+
203209 modssl_ctx_init_proxy (sc , p );
204210
205211 modssl_ctx_init_server (sc , p );
@@ -304,6 +310,11 @@ void *ssl_config_server_merge(apr_pool_t *p, void *basev, void *addv)
304310
305311 cfgMerge (mc , NULL );
306312 cfgMerge (enabled , SSL_ENABLED_UNSET );
313+ #ifdef HAVE_TLSEXT_TICKETS
314+ cfgMergeString (default_ticket_name );
315+ apr_array_cat (mrg -> tickets , base -> tickets );
316+ apr_array_cat (mrg -> tickets , add -> tickets );
317+ #endif
307318 cfgMergeBool (proxy_enabled );
308319 cfgMergeInt (session_cache_timeout );
309320 cfgMergeBool (cipher_server_pref );
@@ -584,6 +595,62 @@ const char *ssl_cmd_SSLEngine(cmd_parms *cmd, void *dcfg, const char *arg)
584595 return "Argument must be On, Off, or Optional" ;
585596}
586597
598+ const char * ssl_cmd_SSLTicketKeyDefault (cmd_parms * cmd , void * dcfg , const char * name )
599+ {
600+ #ifdef HAVE_TLSEXT_TICKETS
601+ SSLSrvConfigRec * sc = mySrvConfig (cmd -> server );
602+
603+ sc -> default_ticket_name = name ;
604+
605+ return NULL ;
606+ #else
607+ return "TLS Ticket keys are not supported." ;
608+ #endif
609+ }
610+
611+ const char * ssl_cmd_SSLTicketKeyFile (cmd_parms * cmd , void * dcfg , const char * name , const char * path )
612+ {
613+ #ifdef HAVE_TLSEXT_TICKETS
614+ apr_status_t rv ;
615+ apr_file_t * fp ;
616+ apr_size_t len ;
617+ char buf [TLSEXT_TICKET_KEYLEN ];
618+ modssl_ticket_t * ticket = NULL ;
619+ SSLSrvConfigRec * sc = mySrvConfig (cmd -> server );
620+
621+ rv = apr_file_open (& fp , path , APR_READ |APR_BINARY ,
622+ APR_OS_DEFAULT , cmd -> temp_pool );
623+
624+ if (rv != APR_SUCCESS ) {
625+ return apr_psprintf (cmd -> pool ,
626+ "Failed to open %s: (%d) %pm" ,
627+ path , rv , & rv );
628+ }
629+
630+ rv = apr_file_read_full (fp , & buf [0 ], TLSEXT_TICKET_KEYLEN , & len );
631+
632+ if (rv != APR_SUCCESS ) {
633+ return apr_psprintf (cmd -> pool ,
634+ "Failed to read at least 48 bytes from %s: (%d) %pm" ,
635+ path , rv , & rv );
636+ }
637+
638+ ticket = apr_palloc (cmd -> pool , sizeof (modssl_ticket_t ));
639+
640+ ticket -> conf_name = name ;
641+
642+ memcpy (ticket -> key_name , buf , 16 );
643+ memcpy (ticket -> hmac_secret , buf + 16 , 16 );
644+ memcpy (ticket -> aes_key , buf + 32 , 16 );
645+
646+ APR_ARRAY_PUSH (sc -> tickets , modssl_ticket_t * ) = ticket ;
647+
648+ return NULL ;
649+ #else
650+ return "TLS Ticket keys are not supported." ;
651+ #endif
652+ }
653+
587654const char * ssl_cmd_SSLFIPS (cmd_parms * cmd , void * dcfg , int flag )
588655{
589656#ifdef HAVE_FIPS
0 commit comments