Apache HTTPD
ssl_engine_config.c
Go to the documentation of this file.
1/* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements. See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/* _ _
18 * _ __ ___ ___ __| | ___ ___| | mod_ssl
19 * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL
20 * | | | | | | (_) | (_| | \__ \__ \ |
21 * |_| |_| |_|\___/ \__,_|___|___/___/_|
22 * |_____|
23 * ssl_engine_config.c
24 * Apache Configuration Directives
25 */
26 /* ``Damned if you do,
27 damned if you don't.''
28 -- Unknown */
29#include "ssl_private.h"
30
31#include "util_mutex.h"
32#include "ap_provider.h"
33
34/* _________________________________________________________________
35**
36** Support for Global Configuration
37** _________________________________________________________________
38*/
39
40#define SSL_MOD_CONFIG_KEY "ssl_module"
41
43{
44 apr_pool_t *pool = s->process->pool;
46 void *vmc;
47
49 if (vmc) {
50 return vmc; /* reused for lifetime of the server */
51 }
52
53 /*
54 * allocate an own subpool which survives server restarts
55 */
56 mc = (SSLModConfigRec *)apr_palloc(pool, sizeof(*mc));
57 mc->pPool = pool;
58 mc->bFixed = FALSE;
59
60 /*
61 * initialize per-module configuration
62 */
63 mc->sesscache_mode = SSL_SESS_CACHE_OFF;
64 mc->sesscache = NULL;
65 mc->pMutex = NULL;
66 mc->aRandSeed = apr_array_make(pool, 4,
67 sizeof(ssl_randseed_t));
68 mc->tVHostKeys = apr_hash_make(pool);
69 mc->tPrivateKey = apr_hash_make(pool);
70#if defined(HAVE_OPENSSL_ENGINE_H) && defined(HAVE_ENGINE_INIT)
71 mc->szCryptoDevice = NULL;
72#endif
73#ifdef HAVE_OCSP_STAPLING
74 mc->stapling_cache = NULL;
75 mc->stapling_cache_mutex = NULL;
76 mc->stapling_refresh_mutex = NULL;
77#endif
78
79#ifdef HAVE_OPENSSL_KEYLOG
80 mc->keylog_file = NULL;
81#endif
82#ifdef HAVE_FIPS
83 mc->fips = UNSET;
84#endif
85
88 pool);
89
90 return mc;
91}
92
94{
95 mc->bFixed = TRUE;
96}
97
99{
100 return mc->bFixed;
101}
102
103/* _________________________________________________________________
104**
105** Configuration handling
106** _________________________________________________________________
107*/
108
109#ifdef HAVE_SSL_CONF_CMD
111{
113 return APR_SUCCESS;
114}
115#endif
116
118{
119 mctx->sc = NULL; /* set during module init */
120
121 mctx->ssl_ctx = NULL; /* set during module init */
122
123 mctx->pks = NULL;
124 mctx->pkp = NULL;
125
126#ifdef HAVE_TLS_SESSION_TICKETS
127 mctx->ticket_key = NULL;
128#endif
129
130 mctx->protocol = SSL_PROTOCOL_DEFAULT;
131 mctx->protocol_set = 0;
132
133 mctx->pphrase_dialog_type = SSL_PPTYPE_UNSET;
134 mctx->pphrase_dialog_path = NULL;
135
136 mctx->cert_chain = NULL;
137
138 mctx->crl_path = NULL;
139 mctx->crl_file = NULL;
140 mctx->crl_check_mask = UNSET;
141
142 mctx->auth.ca_cert_path = NULL;
143 mctx->auth.ca_cert_file = NULL;
144 mctx->auth.cipher_suite = NULL;
145 mctx->auth.verify_depth = UNSET;
146 mctx->auth.verify_mode = SSL_CVERIFY_UNSET;
147 mctx->auth.tls13_ciphers = NULL;
148
149 mctx->ocsp_mask = UNSET;
150 mctx->ocsp_force_default = UNSET;
151 mctx->ocsp_responder = NULL;
152 mctx->ocsp_resptime_skew = UNSET;
153 mctx->ocsp_resp_maxage = UNSET;
154 mctx->ocsp_responder_timeout = UNSET;
155 mctx->ocsp_use_request_nonce = UNSET;
156 mctx->proxy_uri = NULL;
157
158/* Set OCSP Responder Certificate Verification variable */
159 mctx->ocsp_noverify = UNSET;
160/* Set OCSP Responder File variables */
161 mctx->ocsp_verify_flags = 0;
162 mctx->ocsp_certs_file = NULL;
163 mctx->ocsp_certs = NULL;
164
165#ifdef HAVE_OCSP_STAPLING
166 mctx->stapling_enabled = UNSET;
167 mctx->stapling_resptime_skew = UNSET;
168 mctx->stapling_resp_maxage = UNSET;
169 mctx->stapling_cache_timeout = UNSET;
170 mctx->stapling_return_errors = UNSET;
171 mctx->stapling_fake_trylater = UNSET;
172 mctx->stapling_errcache_timeout = UNSET;
173 mctx->stapling_responder_timeout = UNSET;
174 mctx->stapling_force_url = NULL;
175#endif
176
177#ifdef HAVE_SRP
178 mctx->srp_vfile = NULL;
179 mctx->srp_unknown_user_seed = NULL;
180 mctx->srp_vbase = NULL;
181#endif
182#ifdef HAVE_SSL_CONF_CMD
183 mctx->ssl_ctx_config = SSL_CONF_CTX_new();
184 apr_pool_cleanup_register(p, mctx->ssl_ctx_config,
190 mctx->ssl_ctx_param = apr_array_make(p, 5, sizeof(ssl_ctx_param_t));
191#endif
192
193 mctx->ssl_check_peer_cn = UNSET;
194 mctx->ssl_check_peer_name = UNSET;
195 mctx->ssl_check_peer_expire = UNSET;
196}
197
199 apr_pool_t *p)
200{
202
203 mctx = sc->server = apr_palloc(p, sizeof(*sc->server));
204
206
207 mctx->pks = apr_pcalloc(p, sizeof(*mctx->pks));
208
209 mctx->pks->cert_files = apr_array_make(p, 3, sizeof(char *));
210 mctx->pks->key_files = apr_array_make(p, 3, sizeof(char *));
211
212#ifdef HAVE_TLS_SESSION_TICKETS
213 mctx->ticket_key = apr_pcalloc(p, sizeof(*mctx->ticket_key));
214#endif
215}
216
218{
219 SSLSrvConfigRec *sc = apr_palloc(p, sizeof(*sc));
220
221 sc->mc = NULL;
223 sc->vhost_id = NULL; /* set during module init */
224 sc->vhost_id_len = 0; /* set during module init */
227 sc->insecure_reneg = UNSET;
228#ifdef HAVE_TLSEXT
229 sc->strict_sni_vhost_check = SSL_ENABLED_UNSET;
230#endif
231#ifndef OPENSSL_NO_COMP
232 sc->compression = UNSET;
233#endif
235
237
238 return sc;
239}
240
241/*
242 * Create per-server SSL configuration
243 */
245{
247
249
250 return sc;
251}
252
253#define cfgMerge(el,unset) mrg->el = (add->el == (unset)) ? base->el : add->el
254#define cfgMergeArray(el) mrg->el = apr_array_append(p, base->el, add->el)
255#define cfgMergeString(el) cfgMerge(el, NULL)
256#define cfgMergeBool(el) cfgMerge(el, UNSET)
257#define cfgMergeInt(el) cfgMerge(el, UNSET)
258
259/*
260 * Merge per-server SSL configurations
261 */
262
265 modssl_ctx_t *add,
267{
268 if (add->protocol_set) {
269 mrg->protocol_set = 1;
270 mrg->protocol = add->protocol;
271 }
272 else {
273 mrg->protocol_set = base->protocol_set;
274 mrg->protocol = base->protocol;
275 }
276
277 cfgMerge(pphrase_dialog_type, SSL_PPTYPE_UNSET);
278 cfgMergeString(pphrase_dialog_path);
279
280 cfgMergeString(cert_chain);
281
282 cfgMerge(crl_path, NULL);
283 cfgMerge(crl_file, NULL);
284 cfgMergeInt(crl_check_mask);
285
286 cfgMergeString(auth.ca_cert_path);
287 cfgMergeString(auth.ca_cert_file);
288 cfgMergeString(auth.cipher_suite);
289 cfgMergeInt(auth.verify_depth);
290 cfgMerge(auth.verify_mode, SSL_CVERIFY_UNSET);
291 cfgMergeString(auth.tls13_ciphers);
292
293 cfgMergeInt(ocsp_mask);
294 cfgMergeBool(ocsp_force_default);
295 cfgMerge(ocsp_responder, NULL);
296 cfgMergeInt(ocsp_resptime_skew);
297 cfgMergeInt(ocsp_resp_maxage);
298 cfgMergeInt(ocsp_responder_timeout);
299 cfgMergeBool(ocsp_use_request_nonce);
300 cfgMerge(proxy_uri, NULL);
301
302/* Set OCSP Responder Certificate Verification directive */
303 cfgMergeBool(ocsp_noverify);
304/* Set OCSP Responder File directive for importing */
305 cfgMerge(ocsp_certs_file, NULL);
306
307#ifdef HAVE_OCSP_STAPLING
317#endif
318
319#ifdef HAVE_SRP
322#endif
323
324#ifdef HAVE_SSL_CONF_CMD
326#endif
327
328 cfgMergeBool(ssl_check_peer_cn);
329 cfgMergeBool(ssl_check_peer_name);
330 cfgMergeBool(ssl_check_peer_expire);
331}
332
337{
338 int i;
339
340 /*
341 * pick up to CERTKEYS_IDX_MAX+1 entries from "add" (in which case they
342 * they "knock out" their corresponding entries in "base", emulating
343 * the behavior with cfgMergeString in releases up to 2.4.7)
344 */
345 for (i = 0; i < add->nelts && i <= CERTKEYS_IDX_MAX; i++) {
346 APR_ARRAY_PUSH(mrg, const char *) = APR_ARRAY_IDX(add, i, const char *);
347 }
348
349 /* add remaining ones from "base" */
350 while (i < base->nelts) {
351 APR_ARRAY_PUSH(mrg, const char *) = APR_ARRAY_IDX(base, i, const char *);
352 i++;
353 }
354
355 /* and finally, append the rest of "add" (if there are any) */
356 for (i = CERTKEYS_IDX_MAX+1; i < add->nelts; i++) {
357 APR_ARRAY_PUSH(mrg, const char *) = APR_ARRAY_IDX(add, i, const char *);
358 }
359}
360
363 modssl_ctx_t *add,
365{
367
368 /*
369 * For better backwards compatibility with releases up to 2.4.7,
370 * merging global and vhost-level SSLCertificateFile and
371 * SSLCertificateKeyFile directives needs special treatment.
372 * See also PR 56306 and 56353.
373 */
375 add->pks->cert_files,
376 mrg->pks->cert_files);
378 add->pks->key_files,
379 mrg->pks->key_files);
380
381 cfgMergeString(pks->ca_name_path);
382 cfgMergeString(pks->ca_name_file);
383
384#ifdef HAVE_TLS_SESSION_TICKETS
385 cfgMergeString(ticket_key->file_path);
386#endif
387}
388
390{
394
395 cfgMerge(mc, NULL);
397 cfgMergeInt(session_cache_timeout);
398 cfgMergeBool(cipher_server_pref);
399 cfgMergeBool(insecure_reneg);
400#ifdef HAVE_TLSEXT
402#endif
403#ifndef OPENSSL_NO_COMP
404 cfgMergeBool(compression);
405#endif
406 cfgMergeBool(session_tickets);
407
408 modssl_ctx_cfg_merge_server(p, base->server, add->server, mrg->server);
409
410 return mrg;
411}
412
413/*
414 * Create per-directory SSL configuration
415 */
416
418 apr_pool_t *p)
419{
421
422 mctx = dc->proxy = apr_palloc(p, sizeof(*dc->proxy));
423
425
426 mctx->pkp = apr_palloc(p, sizeof(*mctx->pkp));
427
428 mctx->pkp->cert_file = NULL;
429 mctx->pkp->cert_path = NULL;
430 mctx->pkp->ca_cert_file = NULL;
431 mctx->pkp->certs = NULL;
432 mctx->pkp->ca_certs = NULL;
433}
434
436{
437 SSLDirConfigRec *dc = apr_palloc(p, sizeof(*dc));
438
439 dc->bSSLRequired = FALSE;
440 dc->aRequirement = apr_array_make(p, 4, sizeof(ssl_require_t));
444
445 dc->szCipherSuite = NULL;
447 dc->nVerifyDepth = UNSET;
448
449 dc->szUserName = NULL;
450
452
453 dc->proxy_enabled = UNSET;
456
457 return dc;
458}
459
460/*
461 * Merge per-directory SSL configurations
462 */
463
466 modssl_ctx_t *add,
468{
470
471 cfgMergeString(pkp->cert_file);
472 cfgMergeString(pkp->cert_path);
473 cfgMergeString(pkp->ca_cert_file);
474 cfgMergeString(pkp->certs);
475 cfgMergeString(pkp->ca_certs);
476}
477
479{
483
484 cfgMerge(bSSLRequired, FALSE);
485 cfgMergeArray(aRequirement);
486
487 if (add->nOptions & SSL_OPT_RELSET) {
488 mrg->nOptionsAdd =
489 (base->nOptionsAdd & ~(add->nOptionsDel)) | add->nOptionsAdd;
490 mrg->nOptionsDel =
491 (base->nOptionsDel & ~(add->nOptionsAdd)) | add->nOptionsDel;
492 mrg->nOptions =
493 (base->nOptions & ~(mrg->nOptionsDel)) | mrg->nOptionsAdd;
494 }
495 else {
496 mrg->nOptions = add->nOptions;
497 mrg->nOptionsAdd = add->nOptionsAdd;
498 mrg->nOptionsDel = add->nOptionsDel;
499 }
500
501 cfgMergeString(szCipherSuite);
502 cfgMerge(nVerifyClient, SSL_CVERIFY_UNSET);
503 cfgMergeInt(nVerifyDepth);
504
505 cfgMergeString(szUserName);
506
507 cfgMergeInt(nRenegBufferSize);
508
509 mrg->proxy_post_config = add->proxy_post_config;
510 if (!mrg->proxy_post_config) {
511 cfgMergeBool(proxy_enabled);
513 modssl_ctx_cfg_merge_proxy(p, base->proxy, add->proxy, mrg->proxy);
514
515 /* Since ssl_proxy_section_post_config() hook won't be called if there
516 * is no SSLProxy* in this dir config, the ssl_ctx may still be NULL
517 * here at runtime. Merging it is either a no-op (NULL => NULL) because
518 * we are still before post config, or we really want to reuse the one
519 * from the upper/server context (outside of <Proxy> sections).
520 */
521 cfgMerge(proxy->ssl_ctx, NULL);
522 }
523 else {
524 /* The post_config hook has already merged and initialized the
525 * proxy context, use it.
526 */
527 mrg->proxy_enabled = add->proxy_enabled;
528 mrg->proxy = add->proxy;
529 }
530
531 return mrg;
532}
533
534/* Simply merge conf with base into conf, no third party. */
537 SSLDirConfigRec *conf)
538{
539 if (conf->proxy_enabled == UNSET) {
540 conf->proxy_enabled = base->proxy_enabled;
541 }
542 modssl_ctx_cfg_merge_proxy(p, base->proxy, conf->proxy, conf->proxy);
543}
544
545/*
546 * Configuration functions for particular directives
547 */
548
550 void *dcfg,
551 const char *arg)
552{
553 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
554 const char *err;
555 int arglen = strlen(arg);
556
558 return err;
559 }
560
561 if (strcEQ(arg, "builtin")) {
564 }
565 else if ((arglen > 5) && strEQn(arg, "exec:", 5)) {
569 if (!sc->server->pphrase_dialog_path) {
570 return apr_pstrcat(cmd->pool,
571 "Invalid SSLPassPhraseDialog exec: path ",
572 arg+5, NULL);
573 }
576 cmd->pool))
577 {
578 return apr_pstrcat(cmd->pool,
579 "SSLPassPhraseDialog: file '",
581 "' does not exist", NULL);
582 }
583
584 }
585 else if ((arglen > 1) && (arg[0] == '|')) {
587 sc->server->pphrase_dialog_path = arg + 1;
588 }
589 else {
590 return "SSLPassPhraseDialog: Invalid argument";
591 }
592
593 return NULL;
594}
595
597 void *dcfg,
598 const char *arg)
599{
600 SSLModConfigRec *mc = myModConfig(cmd->server);
601 const char *err;
602#if MODSSL_HAVE_ENGINE_API
603 ENGINE *e;
604#endif
605
607 return err;
608 }
609
610 if (strcEQ(arg, "builtin")) {
611 mc->szCryptoDevice = NULL;
612 }
613#if MODSSL_HAVE_ENGINE_API
614 else if ((e = ENGINE_by_id(arg))) {
615 mc->szCryptoDevice = arg;
616 ENGINE_free(e);
617 }
618#endif
619 else {
620 err = "SSLCryptoDevice: Invalid argument; must be one of: "
621 "'builtin' (none)";
622#if MODSSL_HAVE_ENGINE_API
624 while (e) {
625 err = apr_pstrcat(cmd->pool, err, ", '", ENGINE_get_id(e),
626 "' (", ENGINE_get_name(e), ")", NULL);
627 /* Iterate; this call implicitly decrements the refcount
628 * on the 'old' e, per the docs in engine.h. */
630 }
631#endif
632 return err;
633 }
634
635 return NULL;
636}
637
639 void *dcfg,
640 const char *arg1,
641 const char *arg2,
642 const char *arg3)
643{
644 SSLModConfigRec *mc = myModConfig(cmd->server);
645 const char *err;
646 ssl_randseed_t *seed;
647 int arg2len = strlen(arg2);
648
650 return err;
651 }
652
654 return NULL;
655 }
656
657 seed = apr_array_push(mc->aRandSeed);
658
659 if (strcEQ(arg1, "startup")) {
660 seed->nCtx = SSL_RSCTX_STARTUP;
661 }
662 else if (strcEQ(arg1, "connect")) {
663 seed->nCtx = SSL_RSCTX_CONNECT;
664 }
665 else {
666 return apr_pstrcat(cmd->pool, "SSLRandomSeed: "
667 "invalid context: `", arg1, "'",
668 NULL);
669 }
670
671 if ((arg2len > 5) && strEQn(arg2, "file:", 5)) {
672 seed->nSrc = SSL_RSSRC_FILE;
673 seed->cpPath = ap_server_root_relative(mc->pPool, arg2+5);
674 }
675 else if ((arg2len > 5) && strEQn(arg2, "exec:", 5)) {
676 seed->nSrc = SSL_RSSRC_EXEC;
677 seed->cpPath = ap_server_root_relative(mc->pPool, arg2+5);
678 }
679 else if ((arg2len > 4) && strEQn(arg2, "egd:", 4)) {
680#ifdef HAVE_RAND_EGD
681 seed->nSrc = SSL_RSSRC_EGD;
682 seed->cpPath = ap_server_root_relative(mc->pPool, arg2+4);
683#else
684 return apr_pstrcat(cmd->pool, "Invalid SSLRandomSeed entropy source `",
685 arg2, "': This version of " MODSSL_LIBRARY_NAME
686 " does not support the Entropy Gathering Daemon "
687 "(EGD).", NULL);
688#endif
689 }
690 else if (strcEQ(arg2, "builtin")) {
691 seed->nSrc = SSL_RSSRC_BUILTIN;
692 seed->cpPath = NULL;
693 }
694 else {
695 seed->nSrc = SSL_RSSRC_FILE;
696 seed->cpPath = ap_server_root_relative(mc->pPool, arg2);
697 }
698
699 if (seed->nSrc != SSL_RSSRC_BUILTIN) {
700 if (!seed->cpPath) {
701 return apr_pstrcat(cmd->pool,
702 "Invalid SSLRandomSeed path ",
703 arg2, NULL);
704 }
705 if (!ssl_util_path_check(SSL_PCM_EXISTS, seed->cpPath, cmd->pool)) {
706 return apr_pstrcat(cmd->pool,
707 "SSLRandomSeed: source path '",
708 seed->cpPath, "' does not exist", NULL);
709 }
710 }
711
712 if (!arg3) {
713 seed->nBytes = 0; /* read whole file */
714 }
715 else {
716 if (seed->nSrc == SSL_RSSRC_BUILTIN) {
717 return "SSLRandomSeed: byte specification not "
718 "allowed for builtin seed source";
719 }
720
721 seed->nBytes = atoi(arg3);
722
723 if (seed->nBytes < 0) {
724 return "SSLRandomSeed: invalid number of bytes specified";
725 }
726 }
727
728 return NULL;
729}
730
731const char *ssl_cmd_SSLEngine(cmd_parms *cmd, void *dcfg, const char *arg)
732{
733 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
734
735 if (!strcasecmp(arg, "On")) {
737 return NULL;
738 }
739 else if (!strcasecmp(arg, "Off")) {
741 return NULL;
742 }
743 else if (!strcasecmp(arg, "Optional")) {
745 return NULL;
746 }
747
748 return "Argument must be On, Off, or Optional";
749}
750
751const char *ssl_cmd_SSLFIPS(cmd_parms *cmd, void *dcfg, int flag)
752{
753#ifdef HAVE_FIPS
754 SSLModConfigRec *mc = myModConfig(cmd->server);
755#endif
756 const char *err;
757
759 return err;
760 }
761
762#ifdef HAVE_FIPS
763 if ((mc->fips != UNSET) && (mc->fips != (BOOL)(flag ? TRUE : FALSE)))
764 return "Conflicting SSLFIPS options, cannot be both On and Off";
765 mc->fips = flag ? TRUE : FALSE;
766#else
767 if (flag)
768 return "SSLFIPS invalid, rebuild httpd and openssl compiled for FIPS";
769#endif
770
771 return NULL;
772}
773
775 void *dcfg,
776 const char *arg1, const char *arg2)
777{
778 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
780
781 if (arg2 == NULL) {
782 arg2 = arg1;
783 arg1 = "SSL";
784 }
785
786 if (!strcmp("SSL", arg1)) {
787 /* always disable null and export ciphers */
788 arg2 = apr_pstrcat(cmd->pool, arg2, ":!aNULL:!eNULL:!EXP", NULL);
789 if (cmd->path) {
790 dc->szCipherSuite = arg2;
791 }
792 else {
794 }
795 return NULL;
796 }
797#if SSL_HAVE_PROTOCOL_TLSV1_3
798 else if (!strcmp("TLSv1.3", arg1)) {
799 if (cmd->path) {
800 return "TLSv1.3 ciphers cannot be set inside a directory context";
801 }
803 return NULL;
804 }
805#endif
806 return apr_pstrcat(cmd->pool, "protocol '", arg1, "' not supported", NULL);
807}
808
809#define SSL_FLAGS_CHECK_FILE \
810 (SSL_PCM_EXISTS|SSL_PCM_ISREG|SSL_PCM_ISNONZERO)
811
812#define SSL_FLAGS_CHECK_DIR \
813 (SSL_PCM_EXISTS|SSL_PCM_ISDIR)
814
816 const char **file)
817{
818 const char *filepath;
819
820 /* If only dumping the config, don't verify the paths */
822 return NULL;
823 }
824
826 if (!filepath) {
827 return apr_pstrcat(parms->pool, parms->cmd->name,
828 ": Invalid file path ", *file, NULL);
829 }
830 *file = filepath;
831
833 return NULL;
834 }
835
836 return apr_pstrcat(parms->pool, parms->cmd->name,
837 ": file '", *file,
838 "' does not exist or is empty", NULL);
839
840}
841
843{
844#if !defined(OPENSSL_NO_COMP)
845 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
846#ifndef SSL_OP_NO_COMPRESSION
847 const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
848 if (err)
849 return "This version of OpenSSL does not support enabling "
850 "SSLCompression within <VirtualHost> sections.";
851#endif
852 if (flag) {
853 /* Some (packaged) versions of OpenSSL do not support
854 * compression by default. Enabling this directive would not
855 * have the desired effect, so fail with an error. */
857
858 if (sk_SSL_COMP_num(meths) == 0) {
859 return "This version of OpenSSL does not have any compression methods "
860 "available, cannot enable SSLCompression.";
861 }
862 }
863 sc->compression = flag ? TRUE : FALSE;
864#else
865 if (flag) {
866 return "Setting Compression mode unsupported; not implemented by the SSL library";
867 }
868#endif
869 return NULL;
870}
871
873{
874#ifdef SSL_OP_CIPHER_SERVER_PREFERENCE
875 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
877 return NULL;
878#else
879 return "SSLHonorCipherOrder unsupported; not implemented by the SSL library";
880#endif
881}
882
884{
885 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
886#ifndef SSL_OP_NO_TICKET
887 return "This version of OpenSSL does not support using "
888 "SSLSessionTickets.";
889#endif
890 sc->session_tickets = flag ? TRUE : FALSE;
891 return NULL;
892}
893
895{
896#ifdef SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION
897 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
899 return NULL;
900#else
901 return "The SSLInsecureRenegotiation directive is not available "
902 "with this SSL library";
903#endif
904}
905
906
908 const char **dir)
909{
910 const char *dirpath = ap_server_root_relative(parms->pool, *dir);
911
912 if (!dirpath) {
913 return apr_pstrcat(parms->pool, parms->cmd->name,
914 ": Invalid dir path ", *dir, NULL);
915 }
916 *dir = dirpath;
917
919 return NULL;
920 }
921
922 return apr_pstrcat(parms->pool, parms->cmd->name,
923 ": directory '", *dir,
924 "' does not exist", NULL);
925
926}
927
929 void *dcfg,
930 const char *arg)
931{
932 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
933 const char *err;
934
935 /* Only check for non-ENGINE based certs. */
937 && (err = ssl_cmd_check_file(cmd, &arg))) {
938 return err;
939 }
940
941 *(const char **)apr_array_push(sc->server->pks->cert_files) = arg;
942
943 return NULL;
944}
945
947 void *dcfg,
948 const char *arg)
949{
950 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
951 const char *err;
952
953 /* Check keyfile exists for non-ENGINE keys. */
955 && (err = ssl_cmd_check_file(cmd, &arg))) {
956 return err;
957 }
958
959 *(const char **)apr_array_push(sc->server->pks->key_files) = arg;
960
961 return NULL;
962}
963
965 void *dcfg,
966 const char *arg)
967{
968 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
969 const char *err;
970
971 if ((err = ssl_cmd_check_file(cmd, &arg))) {
972 return err;
973 }
974
975 sc->server->cert_chain = arg;
976
977 return NULL;
978}
979
980#ifdef HAVE_TLS_SESSION_TICKETS
982 void *dcfg,
983 const char *arg)
984{
985 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
986 const char *err;
987
988 if ((err = ssl_cmd_check_file(cmd, &arg))) {
989 return err;
990 }
991
992 sc->server->ticket_key->file_path = arg;
993
994 return NULL;
995}
996#endif
997
998#define NO_PER_DIR_SSL_CA \
999 "Your SSL library does not have support for per-directory CA"
1000
1002 void *dcfg,
1003 const char *arg)
1004{
1005 /*SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg;*/
1006 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1007 const char *err;
1008
1009 if ((err = ssl_cmd_check_dir(cmd, &arg))) {
1010 return err;
1011 }
1012
1013 if (cmd->path) {
1014 return NO_PER_DIR_SSL_CA;
1015 }
1016
1017 /* XXX: bring back per-dir */
1018 sc->server->auth.ca_cert_path = arg;
1019
1020 return NULL;
1021}
1022
1024 void *dcfg,
1025 const char *arg)
1026{
1027 /*SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg;*/
1028 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1029 const char *err;
1030
1031 if ((err = ssl_cmd_check_file(cmd, &arg))) {
1032 return err;
1033 }
1034
1035 if (cmd->path) {
1036 return NO_PER_DIR_SSL_CA;
1037 }
1038
1039 /* XXX: bring back per-dir */
1040 sc->server->auth.ca_cert_file = arg;
1041
1042 return NULL;
1043}
1044
1046 const char *arg)
1047{
1048 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1049 const char *err;
1050
1051 if ((err = ssl_cmd_check_dir(cmd, &arg))) {
1052 return err;
1053 }
1054
1055 sc->server->pks->ca_name_path = arg;
1056
1057 return NULL;
1058}
1059
1061 const char *arg)
1062{
1063 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1064 const char *err;
1065
1066 if ((err = ssl_cmd_check_file(cmd, &arg))) {
1067 return err;
1068 }
1069
1070 sc->server->pks->ca_name_file = arg;
1071
1072 return NULL;
1073}
1074
1076 void *dcfg,
1077 const char *arg)
1078{
1079 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1080 const char *err;
1081
1082 if ((err = ssl_cmd_check_dir(cmd, &arg))) {
1083 return err;
1084 }
1085
1086 sc->server->crl_path = arg;
1087
1088 return NULL;
1089}
1090
1092 void *dcfg,
1093 const char *arg)
1094{
1095 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1096 const char *err;
1097
1098 if ((err = ssl_cmd_check_file(cmd, &arg))) {
1099 return err;
1100 }
1101
1102 sc->server->crl_file = arg;
1103
1104 return NULL;
1105}
1106
1108 const char *arg,
1109 int *mask)
1110{
1111 const char *w;
1112
1113 w = ap_getword_conf(parms->temp_pool, &arg);
1114 if (strcEQ(w, "none")) {
1116 }
1117 else if (strcEQ(w, "leaf")) {
1119 }
1120 else if (strcEQ(w, "chain")) {
1122 }
1123 else {
1124 return apr_pstrcat(parms->temp_pool, parms->cmd->name,
1125 ": Invalid argument '", w, "'",
1126 NULL);
1127 }
1128
1129 while (*arg) {
1130 w = ap_getword_conf(parms->temp_pool, &arg);
1131 if (strcEQ(w, "no_crl_for_cert_ok")) {
1133 }
1134 else {
1135 return apr_pstrcat(parms->temp_pool, parms->cmd->name,
1136 ": Invalid argument '", w, "'",
1137 NULL);
1138 }
1139 }
1140
1141 return NULL;
1142}
1143
1145 void *dcfg,
1146 const char *arg)
1147{
1148 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1149
1151}
1152
1154 const char *arg,
1155 ssl_verify_t *id)
1156{
1157 if (strcEQ(arg, "none") || strcEQ(arg, "off")) {
1158 *id = SSL_CVERIFY_NONE;
1159 }
1160 else if (strcEQ(arg, "optional")) {
1162 }
1163 else if (strcEQ(arg, "require") || strcEQ(arg, "on")) {
1164 *id = SSL_CVERIFY_REQUIRE;
1165 }
1166 else if (strcEQ(arg, "optional_no_ca")) {
1168 }
1169 else {
1170 return apr_pstrcat(parms->temp_pool, parms->cmd->name,
1171 ": Invalid argument '", arg, "'",
1172 NULL);
1173 }
1174
1175 return NULL;
1176}
1177
1179 void *dcfg,
1180 const char *arg)
1181{
1183 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1185 const char *err;
1186
1187 if ((err = ssl_cmd_verify_parse(cmd, arg, &mode))) {
1188 return err;
1189 }
1190
1191 if (cmd->path) {
1192 dc->nVerifyClient = mode;
1193 }
1194 else {
1195 sc->server->auth.verify_mode = mode;
1196 }
1197
1198 return NULL;
1199}
1200
1202 const char *arg,
1203 int *depth)
1204{
1205 if ((*depth = atoi(arg)) >= 0) {
1206 return NULL;
1207 }
1208
1209 return apr_pstrcat(parms->temp_pool, parms->cmd->name,
1210 ": Invalid argument '", arg, "'",
1211 NULL);
1212}
1213
1215 void *dcfg,
1216 const char *arg)
1217{
1219 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1220 int depth;
1221 const char *err;
1222
1223 if ((err = ssl_cmd_verify_depth_parse(cmd, arg, &depth))) {
1224 return err;
1225 }
1226
1227 if (cmd->path) {
1228 dc->nVerifyDepth = depth;
1229 }
1230 else {
1231 sc->server->auth.verify_depth = depth;
1232 }
1233
1234 return NULL;
1235}
1236
1238 void *dcfg,
1239 const char *arg)
1240{
1241 SSLModConfigRec *mc = myModConfig(cmd->server);
1242 const char *err, *sep, *name;
1243 long enabled_flags;
1244
1246 return err;
1247 }
1248
1249 /* The OpenSSL session cache mode must have both the flags
1250 * SSL_SESS_CACHE_SERVER and SSL_SESS_CACHE_NO_INTERNAL set if a
1251 * session cache is configured; NO_INTERNAL prevents the
1252 * OpenSSL-internal session cache being used in addition to the
1253 * "external" (mod_ssl-provided) cache, which otherwise causes
1254 * additional memory consumption. */
1256
1257 if (strcEQ(arg, "none")) {
1258 /* Nothing to do; session cache will be off. */
1259 }
1260 else if (strcEQ(arg, "nonenotnull")) {
1261 /* ### Having a separate mode for this seems logically
1262 * unnecessary; the stated purpose of sending non-empty
1263 * session IDs would be better fixed in OpenSSL or simply
1264 * doing it by default if "none" is used. */
1265 mc->sesscache_mode = enabled_flags;
1266 }
1267 else {
1268 /* Argument is of form 'name:args' or just 'name'. */
1269 sep = ap_strchr_c(arg, ':');
1270 if (sep) {
1271 name = apr_pstrmemdup(cmd->pool, arg, sep - arg);
1272 sep++;
1273 }
1274 else {
1275 name = arg;
1276 }
1277
1278 /* Find the provider of given name. */
1280 name,
1282 if (mc->sesscache) {
1283 /* Cache found; create it, passing anything beyond the colon. */
1284 mc->sesscache_mode = enabled_flags;
1285 err = mc->sesscache->create(&mc->sesscache_context, sep,
1286 cmd->temp_pool, cmd->pool);
1287 }
1288 else {
1290 const char *all_names;
1291
1292 /* Build a comma-separated list of all registered provider
1293 * names: */
1298
1299 err = apr_psprintf(cmd->pool, "'%s' session cache not supported "
1300 "(known names: %s). Maybe you need to load the "
1301 "appropriate socache module (mod_socache_%s?).",
1302 name, all_names, name);
1303 }
1304 }
1305
1306 if (err) {
1307 return apr_psprintf(cmd->pool, "SSLSessionCache: %s", err);
1308 }
1309
1310 return NULL;
1311}
1312
1314 void *dcfg,
1315 const char *arg)
1316{
1317 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1318
1320
1321 if (sc->session_cache_timeout < 0) {
1322 return "SSLSessionCacheTimeout: Invalid argument";
1323 }
1324
1325 return NULL;
1326}
1327
1329 void *dcfg,
1330 const char *arg)
1331{
1333 ssl_opt_t opt;
1334 int first = TRUE;
1335 char action, *w;
1336
1337 while (*arg) {
1338 w = ap_getword_conf(cmd->temp_pool, &arg);
1339 action = NUL;
1340
1341 if ((*w == '+') || (*w == '-')) {
1342 action = *(w++);
1343 }
1344 else if (first) {
1345 dc->nOptions = SSL_OPT_NONE;
1346 first = FALSE;
1347 }
1348
1349 if (strcEQ(w, "StdEnvVars")) {
1351 }
1352 else if (strcEQ(w, "ExportCertData")) {
1354 }
1355 else if (strcEQ(w, "FakeBasicAuth")) {
1357 }
1358 else if (strcEQ(w, "StrictRequire")) {
1360 }
1361 else if (strcEQ(w, "OptRenegotiate")) {
1363 }
1364 else if (strcEQ(w, "LegacyDNStringFormat")) {
1366 }
1367 else {
1368 return apr_pstrcat(cmd->pool,
1369 "SSLOptions: Illegal option '", w, "'",
1370 NULL);
1371 }
1372
1373 if (action == '-') {
1374 dc->nOptionsAdd &= ~opt;
1375 dc->nOptionsDel |= opt;
1376 dc->nOptions &= ~opt;
1377 }
1378 else if (action == '+') {
1379 dc->nOptionsAdd |= opt;
1380 dc->nOptionsDel &= ~opt;
1381 dc->nOptions |= opt;
1382 }
1383 else {
1384 dc->nOptions = opt;
1385 dc->nOptionsAdd = opt;
1387 }
1388 }
1389
1390 return NULL;
1391}
1392
1394{
1396
1397 dc->bSSLRequired = TRUE;
1398
1399 return NULL;
1400}
1401
1403 void *dcfg,
1404 const char *arg)
1405{
1409 const char *errstring;
1410
1412 info->filename = cmd->directive->filename;
1413 info->line_number = cmd->directive->line_num;
1414 info->module_index = APLOG_MODULE_INDEX;
1415 errstring = ap_expr_parse(cmd->pool, cmd->temp_pool, info, arg, NULL);
1416 if (errstring) {
1417 return apr_pstrcat(cmd->pool, "SSLRequire: ", errstring, NULL);
1418 }
1419
1421 require->cpExpr = arg;
1422 require->mpExpr = info;
1423
1424 return NULL;
1425}
1426
1427const char *ssl_cmd_SSLRenegBufferSize(cmd_parms *cmd, void *dcfg, const char *arg)
1428{
1429 SSLDirConfigRec *dc = dcfg;
1430 int val;
1431
1432 val = atoi(arg);
1433 if (val < 0) {
1434 return apr_pstrcat(cmd->pool, "Invalid size for SSLRenegBufferSize: ",
1435 arg, NULL);
1436 }
1437 dc->nRenegBufferSize = val;
1438
1439 return NULL;
1440}
1441
1443 const char *arg,
1444 ssl_proto_t *options)
1445{
1447
1448 *options = SSL_PROTOCOL_NONE;
1449
1450 while (*arg) {
1451 char *w = ap_getword_conf(parms->temp_pool, &arg);
1452 char action = '\0';
1453
1454 if ((*w == '+') || (*w == '-')) {
1455 action = *(w++);
1456 }
1457
1458 if (strcEQ(w, "SSLv2")) {
1459 if (action == '-') {
1460 continue;
1461 }
1462 else {
1463 return "SSLProtocol: SSLv2 is no longer supported";
1464 }
1465 }
1466 else if (strcEQ(w, "SSLv3")) {
1467#ifdef OPENSSL_NO_SSL3
1468 if (action != '-') {
1469 return "SSLv3 not supported by this version of OpenSSL";
1470 }
1471 /* Nothing to do, the flag is not present to be toggled */
1472 continue;
1473#else
1475#endif
1476 }
1477 else if (strcEQ(w, "TLSv1")) {
1479 }
1480#ifdef HAVE_TLSV1_X
1481 else if (strcEQ(w, "TLSv1.1")) {
1483 }
1484 else if (strcEQ(w, "TLSv1.2")) {
1486 }
1487 else if (SSL_HAVE_PROTOCOL_TLSV1_3 && strcEQ(w, "TLSv1.3")) {
1489 }
1490#endif
1491 else if (strcEQ(w, "all")) {
1493 }
1494 else {
1495 return apr_pstrcat(parms->temp_pool,
1496 parms->cmd->name,
1497 ": Illegal protocol '", w, "'", NULL);
1498 }
1499
1500 if (action == '-') {
1501 *options &= ~thisopt;
1502 }
1503 else if (action == '+') {
1504 *options |= thisopt;
1505 }
1506 else {
1507 if (*options != SSL_PROTOCOL_NONE) {
1509 "%s: Protocol '%s' overrides already set parameter(s). "
1510 "Check if a +/- prefix is missing.",
1511 parms->cmd->name, w);
1512 }
1513 *options = thisopt;
1514 }
1515 }
1516
1517 return NULL;
1518}
1519
1521 void *dcfg,
1522 const char *arg)
1523{
1524 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1525
1526 sc->server->protocol_set = 1;
1528}
1529
1531{
1533
1534 dc->proxy_enabled = flag ? TRUE : FALSE;
1535
1536 return NULL;
1537}
1538
1540 void *dcfg,
1541 const char *arg)
1542{
1544
1545 dc->proxy->protocol_set = 1;
1547}
1548
1550 void *dcfg,
1551 const char *arg1, const char *arg2)
1552{
1554
1555 if (arg2 == NULL) {
1556 arg2 = arg1;
1557 arg1 = "SSL";
1558 }
1559
1560 if (!strcmp("SSL", arg1)) {
1561 /* always disable null and export ciphers */
1562 arg2 = apr_pstrcat(cmd->pool, arg2, ":!aNULL:!eNULL:!EXP", NULL);
1563 dc->proxy->auth.cipher_suite = arg2;
1564 return NULL;
1565 }
1566#if SSL_HAVE_PROTOCOL_TLSV1_3
1567 else if (!strcmp("TLSv1.3", arg1)) {
1569 return NULL;
1570 }
1571#endif
1572 return apr_pstrcat(cmd->pool, "protocol '", arg1, "' not supported", NULL);
1573}
1574
1576 void *dcfg,
1577 const char *arg)
1578{
1581 const char *err;
1582
1583 if ((err = ssl_cmd_verify_parse(cmd, arg, &mode))) {
1584 return err;
1585 }
1586
1587 dc->proxy->auth.verify_mode = mode;
1588
1589 return NULL;
1590}
1591
1593 void *dcfg,
1594 const char *arg)
1595{
1597 int depth;
1598 const char *err;
1599
1600 if ((err = ssl_cmd_verify_depth_parse(cmd, arg, &depth))) {
1601 return err;
1602 }
1603
1604 dc->proxy->auth.verify_depth = depth;
1605
1606 return NULL;
1607}
1608
1610 void *dcfg,
1611 const char *arg)
1612{
1614 const char *err;
1615
1616 if ((err = ssl_cmd_check_file(cmd, &arg))) {
1617 return err;
1618 }
1619
1620 dc->proxy->auth.ca_cert_file = arg;
1621
1622 return NULL;
1623}
1624
1626 void *dcfg,
1627 const char *arg)
1628{
1630 const char *err;
1631
1632 if ((err = ssl_cmd_check_dir(cmd, &arg))) {
1633 return err;
1634 }
1635
1636 dc->proxy->auth.ca_cert_path = arg;
1637
1638 return NULL;
1639}
1640
1642 void *dcfg,
1643 const char *arg)
1644{
1646 const char *err;
1647
1648 if ((err = ssl_cmd_check_dir(cmd, &arg))) {
1649 return err;
1650 }
1651
1652 dc->proxy->crl_path = arg;
1653
1654 return NULL;
1655}
1656
1658 void *dcfg,
1659 const char *arg)
1660{
1662 const char *err;
1663
1664 if ((err = ssl_cmd_check_file(cmd, &arg))) {
1665 return err;
1666 }
1667
1668 dc->proxy->crl_file = arg;
1669
1670 return NULL;
1671}
1672
1674 void *dcfg,
1675 const char *arg)
1676{
1678
1680}
1681
1683 void *dcfg,
1684 const char *arg)
1685{
1687 const char *err;
1688
1689 if ((err = ssl_cmd_check_file(cmd, &arg))) {
1690 return err;
1691 }
1692
1693 dc->proxy->pkp->cert_file = arg;
1694
1695 return NULL;
1696}
1697
1699 void *dcfg,
1700 const char *arg)
1701{
1703 const char *err;
1704
1705 if ((err = ssl_cmd_check_dir(cmd, &arg))) {
1706 return err;
1707 }
1708
1709 dc->proxy->pkp->cert_path = arg;
1710
1711 return NULL;
1712}
1713
1715 void *dcfg,
1716 const char *arg)
1717{
1719 const char *err;
1720
1721 if ((err = ssl_cmd_check_file(cmd, &arg))) {
1722 return err;
1723 }
1724
1725 dc->proxy->pkp->ca_cert_file = arg;
1726
1727 return NULL;
1728}
1729
1731 const char *arg)
1732{
1734 dc->szUserName = arg;
1735 return NULL;
1736}
1737
1739 const char *arg,
1740 int *mask)
1741{
1742 const char *w;
1743
1744 w = ap_getword_conf(parms->temp_pool, &arg);
1745 if (strcEQ(w, "off")) {
1747 }
1748 else if (strcEQ(w, "leaf")) {
1750 }
1751 else if (strcEQ(w, "on")) {
1753 }
1754 else {
1755 return apr_pstrcat(parms->temp_pool, parms->cmd->name,
1756 ": Invalid argument '", w, "'",
1757 NULL);
1758 }
1759
1760 while (*arg) {
1761 w = ap_getword_conf(parms->temp_pool, &arg);
1762 if (strcEQ(w, "no_ocsp_for_cert_ok")) {
1764 }
1765 else {
1766 return apr_pstrcat(parms->temp_pool, parms->cmd->name,
1767 ": Invalid argument '", w, "'",
1768 NULL);
1769 }
1770 }
1771
1772 return NULL;
1773}
1774
1775const char *ssl_cmd_SSLOCSPEnable(cmd_parms *cmd, void *dcfg, const char *arg)
1776{
1777 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1778
1779#ifdef OPENSSL_NO_OCSP
1780 if (flag) {
1781 return "OCSP support disabled in SSL library; cannot enable "
1782 "OCSP validation";
1783 }
1784#endif
1785
1787}
1788
1790{
1791 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1792
1794
1795 return NULL;
1796}
1797
1798const char *ssl_cmd_SSLOCSPDefaultResponder(cmd_parms *cmd, void *dcfg, const char *arg)
1799{
1800 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1801
1802 sc->server->ocsp_responder = arg;
1803
1804 return NULL;
1805}
1806
1807const char *ssl_cmd_SSLOCSPResponseTimeSkew(cmd_parms *cmd, void *dcfg, const char *arg)
1808{
1809 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1811 if (sc->server->ocsp_resptime_skew < 0) {
1812 return "SSLOCSPResponseTimeSkew: invalid argument";
1813 }
1814 return NULL;
1815}
1816
1817const char *ssl_cmd_SSLOCSPResponseMaxAge(cmd_parms *cmd, void *dcfg, const char *arg)
1818{
1819 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1821 if (sc->server->ocsp_resp_maxage < 0) {
1822 return "SSLOCSPResponseMaxAge: invalid argument";
1823 }
1824 return NULL;
1825}
1826
1827const char *ssl_cmd_SSLOCSPResponderTimeout(cmd_parms *cmd, void *dcfg, const char *arg)
1828{
1829 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1831 if (sc->server->ocsp_responder_timeout < 0) {
1832 return "SSLOCSPResponderTimeout: invalid argument";
1833 }
1834 return NULL;
1835}
1836
1838{
1839 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1840
1842
1843 return NULL;
1844}
1845
1847 const char *arg)
1848{
1849 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1850 sc->server->proxy_uri = apr_palloc(cmd->pool, sizeof(apr_uri_t));
1851 if (apr_uri_parse(cmd->pool, arg, sc->server->proxy_uri) != APR_SUCCESS) {
1852 return apr_psprintf(cmd->pool,
1853 "SSLOCSPProxyURL: Cannot parse URL %s", arg);
1854 }
1855 return NULL;
1856}
1857
1858/* Set OCSP responder certificate verification directive */
1860{
1861 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1862
1863 sc->server->ocsp_noverify = flag ? TRUE : FALSE;
1864
1865 return NULL;
1866}
1867
1869{
1871
1873
1874 return NULL;
1875}
1876
1878{
1880
1882
1883 return NULL;
1884}
1885
1887{
1889
1891
1892 return NULL;
1893}
1894
1896{
1897#ifdef HAVE_TLSEXT
1898 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1899
1900 sc->strict_sni_vhost_check = flag ? SSL_ENABLED_TRUE : SSL_ENABLED_FALSE;
1901
1902 return NULL;
1903#else
1904 return "SSLStrictSNIVHostCheck failed; OpenSSL is not built with support "
1905 "for TLS extensions and SNI indication. Refer to the "
1906 "documentation, and build a compatible version of OpenSSL.";
1907#endif
1908}
1909
1910#ifdef HAVE_OCSP_STAPLING
1911
1913 void *dcfg,
1914 const char *arg)
1915{
1916 SSLModConfigRec *mc = myModConfig(cmd->server);
1917 const char *err, *sep, *name;
1918
1920 return err;
1921 }
1922
1923 /* Argument is of form 'name:args' or just 'name'. */
1924 sep = ap_strchr_c(arg, ':');
1925 if (sep) {
1926 name = apr_pstrmemdup(cmd->pool, arg, sep - arg);
1927 sep++;
1928 }
1929 else {
1930 name = arg;
1931 }
1932
1933 /* Find the provider of given name. */
1935 name,
1937 if (mc->stapling_cache) {
1938 /* Cache found; create it, passing anything beyond the colon. */
1939 err = mc->stapling_cache->create(&mc->stapling_cache_context,
1940 sep, cmd->temp_pool,
1941 cmd->pool);
1942 }
1943 else {
1945 const char *all_names;
1946
1947 /* Build a comma-separated list of all registered provider
1948 * names: */
1953
1954 err = apr_psprintf(cmd->pool, "'%s' stapling cache not supported "
1955 "(known names: %s) Maybe you need to load the "
1956 "appropriate socache module (mod_socache_%s?)",
1957 name, all_names, name);
1958 }
1959
1960 if (err) {
1961 return apr_psprintf(cmd->pool, "SSLStaplingCache: %s", err);
1962 }
1963
1964 return NULL;
1965}
1966
1967const char *ssl_cmd_SSLUseStapling(cmd_parms *cmd, void *dcfg, int flag)
1968{
1969 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1970 sc->server->stapling_enabled = flag ? TRUE : FALSE;
1971 return NULL;
1972}
1973
1975 const char *arg)
1976{
1977 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1978 sc->server->stapling_resptime_skew = atoi(arg);
1979 if (sc->server->stapling_resptime_skew < 0) {
1980 return "SSLStaplingResponseTimeSkew: invalid argument";
1981 }
1982 return NULL;
1983}
1984
1986 const char *arg)
1987{
1988 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
1989 sc->server->stapling_resp_maxage = atoi(arg);
1990 if (sc->server->stapling_resp_maxage < 0) {
1991 return "SSLStaplingResponseMaxAge: invalid argument";
1992 }
1993 return NULL;
1994}
1995
1997 const char *arg)
1998{
1999 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
2000 sc->server->stapling_cache_timeout = atoi(arg);
2001 if (sc->server->stapling_cache_timeout < 0) {
2002 return "SSLStaplingStandardCacheTimeout: invalid argument";
2003 }
2004 return NULL;
2005}
2006
2008 const char *arg)
2009{
2010 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
2011 sc->server->stapling_errcache_timeout = atoi(arg);
2012 if (sc->server->stapling_errcache_timeout < 0) {
2013 return "SSLStaplingErrorCacheTimeout: invalid argument";
2014 }
2015 return NULL;
2016}
2017
2019 void *dcfg, int flag)
2020{
2021 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
2022 sc->server->stapling_return_errors = flag ? TRUE : FALSE;
2023 return NULL;
2024}
2025
2027 void *dcfg, int flag)
2028{
2029 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
2030 sc->server->stapling_fake_trylater = flag ? TRUE : FALSE;
2031 return NULL;
2032}
2033
2035 const char *arg)
2036{
2037 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
2038 sc->server->stapling_responder_timeout = atoi(arg);
2039 sc->server->stapling_responder_timeout *= APR_USEC_PER_SEC;
2040 if (sc->server->stapling_responder_timeout < 0) {
2041 return "SSLStaplingResponderTimeout: invalid argument";
2042 }
2043 return NULL;
2044}
2045
2046const char *ssl_cmd_SSLStaplingForceURL(cmd_parms *cmd, void *dcfg,
2047 const char *arg)
2048{
2049 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
2050 sc->server->stapling_force_url = arg;
2051 return NULL;
2052}
2053
2054#endif /* HAVE_OCSP_STAPLING */
2055
2056#ifdef HAVE_SSL_CONF_CMD
2057const char *ssl_cmd_SSLOpenSSLConfCmd(cmd_parms *cmd, void *dcfg,
2058 const char *arg1, const char *arg2)
2059{
2060 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
2061 SSL_CONF_CTX *cctx = sc->server->ssl_ctx_config;
2063 const char *err;
2065
2067 return apr_psprintf(cmd->pool,
2068 "'%s': invalid OpenSSL configuration command",
2069 arg1);
2070 }
2071
2073 if ((err = ssl_cmd_check_file(cmd, &arg2)))
2074 return err;
2075 }
2076 else if (value_type == SSL_CONF_TYPE_DIR) {
2077 if ((err = ssl_cmd_check_dir(cmd, &arg2)))
2078 return err;
2079 }
2080
2081 if (strcEQ(arg1, "CipherString")) {
2082 /* always disable null and export ciphers */
2083 arg2 = apr_pstrcat(cmd->pool, arg2, ":!aNULL:!eNULL:!EXP", NULL);
2084 }
2085
2086 param = apr_array_push(sc->server->ssl_ctx_param);
2087 param->name = arg1;
2088 param->value = arg2;
2089 return NULL;
2090}
2091#endif
2092
2093#ifdef HAVE_SRP
2094
2095const char *ssl_cmd_SSLSRPVerifierFile(cmd_parms *cmd, void *dcfg,
2096 const char *arg)
2097{
2098 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
2099 const char *err;
2100
2101 if ((err = ssl_cmd_check_file(cmd, &arg)))
2102 return err;
2103 /* SRP_VBASE_init takes char*, not const char* */
2104 sc->server->srp_vfile = apr_pstrdup(cmd->pool, arg);
2105 return NULL;
2106}
2107
2109 const char *arg)
2110{
2111 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
2112 /* SRP_VBASE_new takes char*, not const char* */
2113 sc->server->srp_unknown_user_seed = apr_pstrdup(cmd->pool, arg);
2114 return NULL;
2115}
2116
2117#endif /* HAVE_SRP */
2118
2119/* OCSP Responder File Function to read in value */
2121 const char *arg)
2122{
2123 SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
2124 const char *err;
2125
2126 if ((err = ssl_cmd_check_file(cmd, &arg))) {
2127 return err;
2128 }
2129
2130 sc->server->ocsp_certs_file = arg;
2131 return NULL;
2132}
2133
2135{
2136 apr_file_t *out = NULL;
2137 if (!ap_exists_config_define("DUMP_CERTS")) {
2138 return;
2139 }
2141 apr_file_printf(out, "Server certificates:\n");
2142
2143 /* Dump the filenames of all configured server certificates to
2144 * stdout. */
2145 while (s) {
2147
2148 if (sc && sc->server && sc->server->pks) {
2149 modssl_pk_server_t *const pks = sc->server->pks;
2150 int i;
2151
2152 for (i = 0; (i < pks->cert_files->nelts) &&
2153 APR_ARRAY_IDX(pks->cert_files, i, const char *);
2154 i++) {
2155 apr_file_printf(out, " %s\n",
2157 i, const char *));
2158 }
2159 }
2160
2161 s = s->next;
2162 }
2163
2164}
2165
Apache Provider API.
#define TRUE
Definition abts.h:38
#define FALSE
Definition abts.h:35
static apr_pool_t * pconf
Definition event.c:441
ap_conf_vector_t * base
char * ap_server_root_relative(apr_pool_t *p, const char *fname)
Definition config.c:1594
#define AP_SQ_RM_CONFIG_DUMP
Definition http_core.h:1065
int ap_exists_config_define(const char *name)
Definition core.c:2896
int ap_state_query(int query_code)
Definition core.c:5378
#define AP_SQ_RUN_MODE
Definition http_core.h:1032
#define APLOGNO(n)
Definition http_log.h:117
#define ap_log_error
Definition http_log.h:370
#define APLOG_MARK
Definition http_log.h:283
#define APLOG_WARNING
Definition http_log.h:68
#define APLOG_MODULE_INDEX
Definition http_log.h:168
apr_array_header_t * ap_list_provider_names(apr_pool_t *pool, const char *provider_group, const char *provider_version)
Definition provider.c:127
void * ap_lookup_provider(const char *provider_group, const char *provider_name, const char *provider_version)
Definition provider.c:99
void const char * arg
Definition http_vhost.h:63
int enabled
apr_bucket * e
apr_brigade_flush void * ctx
apr_dbd_transaction_t int mode
Definition apr_dbd.h:261
const char * mask
Definition apr_date.h:60
apr_memcache_t * mc
#define AP_EXPR_FLAG_SSL_EXPR_COMPAT
Definition ap_expr.h:59
const char * ap_expr_parse(apr_pool_t *pool, apr_pool_t *ptemp, ap_expr_info_t *info, const char *expr, ap_expr_lookup_fn_t *lookup_fn)
#define AP_SOCACHE_PROVIDER_GROUP
Definition ap_socache.h:218
#define AP_SOCACHE_PROVIDER_VERSION
Definition ap_socache.h:220
const char * ssl_cmd_SSLCADNRequestFile(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLProxyVerify(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLCACertificateFile(cmd_parms *cmd, void *dcfg, const char *arg)
int modssl_is_engine_id(const char *name)
Definition ssl_util.c:477
const char * ssl_cmd_SSLOCSPResponseMaxAge(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLCertificateFile(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLOCSPUseRequestNonce(cmd_parms *cmd, void *dcfg, int flag)
const char * ssl_cmd_SSLVerifyDepth(cmd_parms *cmd, void *dcfg, const char *arg)
#define SSL_OPT_OPTRENEGOTIATE
unsigned int ssl_util_path_check(ssl_pathcheck_t, const char *, apr_pool_t *)
Definition ssl_util.c:175
const char * ssl_cmd_SSLProxyCARevocationPath(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLInsecureRenegotiation(cmd_parms *cmd, void *dcfg, int flag)
SSLModConfigRec * ssl_config_global_create(server_rec *s)
void * ssl_config_perdir_merge(apr_pool_t *p, void *basev, void *addv)
const char * ssl_cmd_SSLProxyCipherSuite(cmd_parms *cmd, void *dcfg, const char *arg1, const char *arg2)
const char * ssl_cmd_SSLSessionCache(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLVerifyClient(cmd_parms *cmd, void *dcfg, const char *arg)
#define SSL_PROTOCOL_DEFAULT
#define SSL_OPT_STRICTREQUIRE
const char * ssl_cmd_SSLRandomSeed(cmd_parms *cmd, void *dcfg, const char *arg1, const char *arg2, const char *arg3)
const char * ssl_cmd_SSLCARevocationFile(cmd_parms *cmd, void *dcfg, const char *arg)
#define mySrvConfig(srv)
const char * ssl_cmd_SSLOCSPResponseTimeSkew(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLProxyMachineCertificateFile(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLCARevocationCheck(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLCertificateChainFile(cmd_parms *cmd, void *dcfg, const char *arg)
#define SSL_PROTOCOL_TLSV1
int ssl_proto_t
const char * ssl_cmd_SSLRequire(cmd_parms *cmd, void *dcfg, const char *arg)
ssl_verify_t
const char * ssl_cmd_SSLOCSPOverrideResponder(cmd_parms *cmd, void *dcfg, int flag)
void * ssl_config_server_create(apr_pool_t *p, server_rec *s)
const char * ssl_cmd_SSLProxyMachineCertificateChainFile(cmd_parms *cmd, void *dcfg, const char *arg)
#define SSL_OPT_RELSET
const char * ssl_cmd_SSLProxyCheckPeerCN(cmd_parms *cmd, void *dcfg, int flag)
const char * ssl_cmd_SSLProxyCACertificateFile(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLProxyMachineCertificatePath(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLProxyCheckPeerExpire(cmd_parms *cmd, void *dcfg, int flag)
const char * ssl_cmd_SSLSessionCacheTimeout(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLOCSPResponderTimeout(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLProxyCACertificatePath(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLSessionTickets(cmd_parms *cmd, void *dcfg, int flag)
const char * ssl_cmd_SSLProxyCARevocationCheck(cmd_parms *cmd, void *dcfg, const char *arg)
void ssl_config_proxy_merge(apr_pool_t *p, SSLDirConfigRec *base, SSLDirConfigRec *conf)
const char * ssl_cmd_SSLRenegBufferSize(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLProxyEngine(cmd_parms *cmd, void *dcfg, int flag)
const char * ssl_cmd_SSLOCSPNoVerify(cmd_parms *cmd, void *dcfg, int flag)
int ssl_opt_t
#define myModConfig(srv)
const char * ssl_cmd_SSLHonorCipherOrder(cmd_parms *cmd, void *dcfg, int flag)
const char * ssl_cmd_SSLOCSPDefaultResponder(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLCertificateKeyFile(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLRequireSSL(cmd_parms *cmd, void *dcfg)
const char * ssl_cmd_SSLCompression(cmd_parms *cmd, void *dcfg, int flag)
void * ssl_config_perdir_create(apr_pool_t *p, char *dir)
const char * ssl_cmd_SSLCARevocationPath(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLPassPhraseDialog(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLProxyVerifyDepth(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLProxyProtocol(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLOCSPEnable(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLProtocol(cmd_parms *cmd, void *dcfg, const char *arg)
#define SSL_OPT_NONE
const char * ssl_cmd_SSLCACertificatePath(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLProxyCheckPeerName(cmd_parms *cmd, void *dcfg, int flag)
const char * ssl_cmd_SSLFIPS(cmd_parms *cmd, void *dcfg, int flag)
#define SSL_OPT_LEGACYDNFORMAT
#define SSL_OPT_STDENVVARS
const char * ssl_cmd_SSLUserName(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLEngine(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLCADNRequestPath(cmd_parms *cmd, void *dcfg, const char *arg)
#define SSL_OPT_EXPORTCERTDATA
const char * ssl_cmd_SSLCryptoDevice(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLOptions(cmd_parms *cmd, void *dcfg, const char *arg)
#define SSL_PCM_EXISTS
const char * ssl_cmd_SSLOCSPProxyURL(cmd_parms *cmd, void *dcfg, const char *arg)
#define SSL_PROTOCOL_ALL
const char * ssl_cmd_SSLCipherSuite(cmd_parms *cmd, void *dcfg, const char *arg1, const char *arg2)
const char * ssl_cmd_SSLOCSPResponderCertificateFile(cmd_parms *cmd, void *dcfg, const char *arg)
const char * ssl_cmd_SSLStrictSNIVHostCheck(cmd_parms *cmd, void *dcfg, int flag)
const char * ssl_cmd_SSLProxyCARevocationFile(cmd_parms *cmd, void *dcfg, const char *arg)
#define BOOL
Definition ssl_private.h:81
#define SSL_PROTOCOL_NONE
void * ssl_config_server_merge(apr_pool_t *p, void *basev, void *addv)
#define NUL
unsigned int ssl_config_global_isfixed(SSLModConfigRec *mc)
#define CERTKEYS_IDX_MAX
#define SSL_PROTOCOL_SSLV3
#define SSL_OPT_FAKEBASICAUTH
void ssl_hook_ConfigTest(apr_pool_t *pconf, server_rec *s)
void ssl_config_global_fix(SSLModConfigRec *mc)
@ SSL_OCSPCHECK_CHAIN
@ SSL_OCSPCHECK_LEAF
@ SSL_OCSPCHECK_NONE
@ SSL_OCSPCHECK_NO_OCSP_FOR_CERT_OK
@ SSL_ENABLED_TRUE
@ SSL_ENABLED_UNSET
@ SSL_ENABLED_FALSE
@ SSL_ENABLED_OPTIONAL
@ SSL_RSCTX_CONNECT
@ SSL_RSCTX_STARTUP
@ SSL_CVERIFY_OPTIONAL
@ SSL_CVERIFY_OPTIONAL_NO_CA
@ SSL_CVERIFY_UNSET
@ SSL_CVERIFY_NONE
@ SSL_CVERIFY_REQUIRE
@ SSL_CRLCHECK_NO_CRL_FOR_CERT_OK
@ SSL_CRLCHECK_LEAF
@ SSL_CRLCHECK_NONE
@ SSL_CRLCHECK_CHAIN
@ SSL_RSSRC_EGD
@ SSL_RSSRC_BUILTIN
@ SSL_RSSRC_FILE
@ SSL_RSSRC_EXEC
@ SSL_PPTYPE_PIPE
@ SSL_PPTYPE_BUILTIN
@ SSL_PPTYPE_FILTER
@ SSL_PPTYPE_UNSET
#define MODSSL_LIBRARY_NAME
#define ap_strchr_c(s, c)
Definition httpd.h:2353
char * ap_getword_conf(apr_pool_t *p, const char **line)
Definition util.c:833
#define GLOBAL_ONLY
const char * ap_check_cmd_context(cmd_parms *cmd, unsigned forbidden)
Definition core.c:1301
apr_size_t size
apr_uint32_t val
Definition apr_atomic.h:66
const char int apr_pool_t * pool
Definition apr_cstr.h:84
#define APR_SUCCESS
Definition apr_errno.h:225
int apr_status_t
Definition apr_errno.h:44
const char apr_int32_t flag
const char apr_file_t * file
const char ** filepath
int strcasecmp(const char *a, const char *b)
apr_int32_t opt
#define apr_pcalloc(p, size)
Definition apr_pools.h:465
apr_dir_t * dir
const char * sep
const char * s
Definition apr_strings.h:95
#define APR_ARRAY_PUSH(ary, type)
Definition apr_tables.h:150
int nelts
Definition apr_tables.h:122
#define APR_ARRAY_IDX(ary, i, type)
Definition apr_tables.h:141
const apr_array_header_t * first
Definition apr_tables.h:207
apr_int32_t apr_int32_t apr_int32_t err
apr_cmdtype_e cmd
#define APR_USEC_PER_SEC
Definition apr_time.h:60
#define apr_time_from_sec(sec)
Definition apr_time.h:78
apr_pool_t * p
Definition md_event.c:32
#define UNSET
static apr_file_t * out
Definition mod_info.c:85
struct param_s param
#define strEQn(s1, s2, n)
Definition mod_nw_ssl.c:90
#define strcEQ(s1, s2)
Definition mod_nw_ssl.c:93
return NULL
Definition mod_so.c:359
int i
Definition mod_so.c:347
static const char * ssl_cmd_verify_depth_parse(cmd_parms *parms, const char *arg, int *depth)
#define SSL_MOD_CONFIG_KEY
#define cfgMergeInt(el)
#define SSL_FLAGS_CHECK_FILE
static SSLSrvConfigRec * ssl_config_server_new(apr_pool_t *p)
#define cfgMergeString(el)
#define cfgMerge(el, unset)
#define cfgMergeArray(el)
static void modssl_ctx_cfg_merge_proxy(apr_pool_t *p, modssl_ctx_t *base, modssl_ctx_t *add, modssl_ctx_t *mrg)
static void modssl_ctx_init_proxy(SSLDirConfigRec *dc, apr_pool_t *p)
static const char * ssl_cmd_verify_parse(cmd_parms *parms, const char *arg, ssl_verify_t *id)
static void modssl_ctx_init(modssl_ctx_t *mctx, apr_pool_t *p)
static void modssl_ctx_cfg_merge_server(apr_pool_t *p, modssl_ctx_t *base, modssl_ctx_t *add, modssl_ctx_t *mrg)
static void modssl_ctx_cfg_merge_certkeys_array(apr_pool_t *p, apr_array_header_t *base, apr_array_header_t *add, apr_array_header_t *mrg)
static const char * ssl_cmd_crlcheck_parse(cmd_parms *parms, const char *arg, int *mask)
static const char * ssl_cmd_protocol_parse(cmd_parms *parms, const char *arg, ssl_proto_t *options)
static const char * ssl_cmd_check_dir(cmd_parms *parms, const char **dir)
#define NO_PER_DIR_SSL_CA
#define cfgMergeBool(el)
static void modssl_ctx_init_server(SSLSrvConfigRec *sc, apr_pool_t *p)
static const char * ssl_cmd_check_file(cmd_parms *parms, const char **file)
static const char * ssl_cmd_ocspcheck_parse(cmd_parms *parms, const char *arg, int *mask)
#define SSL_FLAGS_CHECK_DIR
static void modssl_ctx_cfg_merge(apr_pool_t *p, modssl_ctx_t *base, modssl_ctx_t *add, modssl_ctx_t *mrg)
STACK_OF(X509_NAME)
char * name
Internal interfaces private to mod_ssl.
unsigned int proxy_enabled
unsigned int bSSLRequired
ssl_verify_t nVerifyClient
ssl_opt_t nOptionsAdd
unsigned int proxy_post_config
const char * szCipherSuite
ssl_opt_t nOptions
apr_size_t nRenegBufferSize
apr_array_header_t * aRequirement
ssl_opt_t nOptionsDel
modssl_ctx_t * proxy
const char * szUserName
unsigned int cipher_server_pref
const char * vhost_id
SSLModConfigRec * mc
unsigned int session_tickets
modssl_ctx_t * server
ssl_enabled_t enabled
unsigned int compression
unsigned int insecure_reneg
apr_pool_t * pool
apr_pool_t * pool
ssl_verify_t verify_mode
const char * cipher_suite
const char * ca_cert_file
const char * ca_cert_path
const char * tls13_ciphers
long ocsp_resp_maxage
ssl_pphrase_t pphrase_dialog_type
const char * ocsp_responder
ssl_proto_t protocol
modssl_auth_ctx_t auth
long ocsp_resptime_skew
unsigned int ocsp_noverify
const char * crl_path
unsigned int ocsp_use_request_nonce
unsigned int ssl_check_peer_cn
const char * pphrase_dialog_path
unsigned int ssl_check_peer_expire
const char * ocsp_certs_file
unsigned int ocsp_force_default
modssl_pk_proxy_t * pkp
modssl_pk_server_t * pks
const char * crl_file
unsigned int ssl_check_peer_name
const char * cert_chain
apr_interval_time_t ocsp_responder_timeout
apr_uri_t * proxy_uri
const char * cert_file
const char * ca_cert_file
const char * cert_path
apr_array_header_t * key_files
apr_array_header_t * cert_files
const char * ca_name_path
const char * ca_name_file
A structure to store information for each virtual server.
Definition httpd.h:1322
ssl_rssrc_t nSrc
ssl_rsctx_t nCtx
Apache Mutex support library.
INT info