/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* _ _
* _ __ ___ ___ __| | ___ ___| | mod_ssl
* | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL
* | | | | | | (_) | (_| | \__ \__ \ |
* |_| |_| |_|\___/ \__,_|___|___/___/_|
* |_____|
* Apache API interface structures
*/
#include "ssl_private.h"
#include "mod_ssl.h"
#include "mod_ssl_openssl.h"
#include "util_md5.h"
#include "util_mutex.h"
#include "ap_provider.h"
#include <assert.h>
#if HAVE_VALGRIND
#include <valgrind.h>
int ssl_running_on_valgrind = 0;
#endif
/*
* the table of configuration directives we provide
*/
/*
* Global (main-server) context configuration directives
*/
"SSL dialog mechanism for the pass phrase query "
"('builtin', '|/path/to/pipe_program', "
"or 'exec:/path/to/cgi_program')")
"SSL Session Cache storage "
#if defined(HAVE_OPENSSL_ENGINE_H) && defined(HAVE_ENGINE_INIT)
"SSL external Crypto Device usage "
"('builtin', '...')")
#endif
"SSL Pseudo Random Number Generator (PRNG) seeding source "
"('startup|connect builtin|file:/path|exec:/path [bytes]')")
/*
* Per-server context configuration directives
*/
"SSL switch for the protocol engine "
"('on', 'off')")
"Enable FIPS-140 mode "
"(`on', `off')")
"Colon-delimited list of permitted SSL Ciphers "
"('XXX:...:XXX' - see manual)")
"SSL Server Certificate file "
"SSL Server Private Key file "
"SSL Server CA Certificate Chain file "
#ifdef HAVE_TLS_SESSION_TICKETS
"TLS session ticket encryption/decryption key file (RFC 5077) "
#endif
"SSL CA Certificate path "
"SSL CA Certificate file "
"SSL CA Distinguished Name path "
"SSL CA Distinguished Name file "
"SSL CA Certificate Revocation List (CRL) path "
"SSL CA Certificate Revocation List (CRL) file "
"SSL CA Certificate Revocation List (CRL) checking mode")
"SSL Client verify type "
"('none', 'optional', 'require', 'optional_no_ca')")
"SSL Client verify depth "
"('N' - number of intermediate certificates)")
"SSL Session Cache object lifetime "
"('N' - number of seconds)")
#ifdef HAVE_TLSV1_X
#else
#define SSL_PROTOCOLS "SSLv3|TLSv1"
#endif
"Enable or disable various SSL protocols "
"Use the server's cipher ordering preference")
"Enable SSL level compression "
"(`on', `off')")
"Enable or disable TLS session tickets"
"(`on', `off')")
"Enable support for insecure renegotiation")
"Set user name to SSL variable value")
"Strict SNI virtual host checking")
#ifdef HAVE_SRP
"SRP verifier file "
"SRP seed for unknown users (to avoid leaking a user's existence) "
"('some secret text')")
#endif
/*
* Proxy configuration for remote SSL connections
*/
"SSL switch for the proxy protocol engine "
"('on', 'off')")
"SSL Proxy: enable or disable SSL protocol flavors "
"SSL Proxy: colon-delimited list of permitted SSL ciphers "
"('XXX:...:XXX' - see manual)")
"SSL Proxy: whether to verify the remote certificate "
"('on' or 'off')")
"SSL Proxy: maximum certificate verification depth "
"('N' - number of intermediate certificates)")
"SSL Proxy: file containing server certificates "
"SSL Proxy: directory containing server certificates "
"SSL Proxy: CA Certificate Revocation List (CRL) path "
"SSL Proxy: CA Certificate Revocation List (CRL) file "
"SSL Proxy: CA Certificate Revocation List (CRL) checking mode")
"SSL Proxy: file containing client certificates "
"SSL Proxy: directory containing client certificates "
"SSL Proxy: file containing issuing certificates "
"of the client certificate "
"SSL Proxy: check the peer certificate's expiration date")
"SSL Proxy: check the peer certificate's CN")
"SSL Proxy: check the peer certificate's name "
"(must be present in subjectAltName extension or CN")
/*
* Per-directory context configuration directives
*/
"Set one or more options to configure the SSL engine"
"('[+-]option[=value] ...' - see manual)")
"Require the SSL protocol for the per-directory context "
"(no arguments)")
"Require a boolean expression to evaluate to true for granting access"
"(arbitrary complex boolean expression - see manual)")
"Configure the amount of memory that will be used for buffering the "
"request body if a per-location SSL renegotiation is required due to "
"changed access control requirements")
"Enable use of OCSP to verify certificate revocation ('on', 'off')")
"URL of the default OCSP Responder")
"Force use of the default responder URL ('on', 'off')")
"Maximum time difference in OCSP responses")
"Maximum age of OCSP responses")
"OCSP responder query timeout")
"Whether OCSP queries use a nonce or not ('on', 'off')")
#ifdef HAVE_OCSP_STAPLING
/*
* OCSP Stapling options
*/
"SSL Stapling Response Cache storage "
"SSL switch for the OCSP Stapling protocol " "(`on', `off')")
"SSL stapling option for maximum time difference in OCSP responses")
"SSL stapling option for OCSP responder timeout")
"SSL stapling option for maximum age of OCSP responses")
"SSL stapling option for normal OCSP Response Cache Lifetime")
"SSL stapling switch to return Status Errors Back to Client"
"(`on', `off')")
"SSL stapling switch to send tryLater response to client on error "
"(`on', `off')")
"SSL stapling option for OCSP Response Error Cache Lifetime")
"SSL stapling option to Force the OCSP Stapling URL")
#endif
#ifdef HAVE_SSL_CONF_CMD
"OpenSSL configuration command")
#endif
#if defined(HAVE_TLS_ALPN) || defined(HAVE_TLS_NPN)
"Preference in Application-Layer Protocol Negotiation (ALPN), "
"protocols are chosed in the specified order")
#endif
/* Deprecated directives. */
"SSLLog directive is no longer supported - use ErrorLog."),
"SSLLogLevel directive is no longer supported - use LogLevel."),
};
/*
* the various processing hooks
*/
{
/*
* Try to kill the internals of the SSL library.
*/
/* Corresponds to OPENSSL_load_builtin_modules():
* XXX: borrowed from apps.h, but why not CONF_modules_free()
* which also invokes CONF_modules_finish()?
*/
/* Corresponds to SSL_library_init: */
EVP_cleanup();
#endif
#if OPENSSL_VERSION_NUMBER >= 0x1000000fL
#else
ERR_remove_state(0);
#endif
/* Don't call ERR_free_strings in earlier versions, ERR_load_*_strings only
* actually loaded the error strings once per process due to static
* variable abuse in OpenSSL. */
#if (OPENSSL_VERSION_NUMBER >= 0x00090805f)
#endif
/* Also don't call CRYPTO_cleanup_all_ex_data here; any registered
* ex_data indices may have been cached in static variables in
* OpenSSL; removing them may cause havoc. Notably, with OpenSSL
* versions >= 0.9.8f, COMP_CTX cleanups would not be run, which
* could result in a per-connection memory leak (!). */
/*
* TODO: determine somewhere we can safely shove out diagnostics
* (when enabled) at this late stage in the game:
* CRYPTO_mem_leaks_fp(stderr);
*/
return APR_SUCCESS;
}
{
#if HAVE_VALGRIND
#endif
/* We must register the library in full, to ensure our configuration
* code can successfully test the SSL environment.
*/
#endif
/*
* Let us cleanup the ssl library when the module is unloaded
*/
/* Register us to handle mod_log_config %c/%x variables */
/* Register to handle mod_status status page generation */
/* Register mutex type names so they can be configured with Mutex */
#ifdef HAVE_OCSP_STAPLING
#endif
return OK;
}
{
if (sslconn) {
return sslconn;
}
myConnConfigSet(c, sslconn);
return sslconn;
}
{
if (!sc->proxy_enabled) {
"SSL Proxy requested for %s but not enabled "
return 0;
}
return 1;
}
{
if (sslconn) {
}
else {
}
return 0;
}
return 1;
}
{
#ifdef HAVE_TLS_NPN
if (!sslconn) {
return DECLINED;
}
if (!sslconn->npn_advertfns) {
}
if (advertisefn)
if (negotiatedfn)
return OK;
#else
return DECLINED;
#endif
}
{
#ifdef HAVE_TLS_ALPN
if (!sslconn) {
return DECLINED;
}
if (!sslconn->alpn_proposefns) {
}
if (advertisefn)
if (negotiatedfn)
return OK;
#else
return DECLINED;
#endif
}
{
char *vhost_md5;
int rc;
if (!sslconn) {
}
/*
* Seed the Pseudo Random Number Generator (PRNG)
*/
/*
* Create a new SSL connection with the configured server SSL context and
* attach this to the socket. Additionally we register this attachment
* so we can detach later.
*/
"Unable to create a new SSL connection from the SSL "
"context");
c->aborted = 1;
return DECLINED; /* XXX */
}
return rc;
}
sc->vhost_id_len);
{
"Unable to set session id context to '%s'", vhost_md5);
c->aborted = 1;
return DECLINED; /* XXX */
}
SSL_set_app_data(ssl, c);
ssl_io_filter_init(c, r, ssl);
return APR_SUCCESS;
}
{
return NULL;
}
return "https";
}
{
return 0;
}
return 443;
}
{
if (sslconn) {
}
else {
}
/*
* Immediately stop processing if SSL is disabled for this connection
*/
{
return DECLINED;
}
/*
* Create SSL context
*/
if (!sslconn) {
}
return DECLINED;
}
/*
* Remember the connection information for
* later access inside callback functions
*/
"Connection to child %ld established "
return ssl_init_ssl_connection(c, NULL);
}
/*
* the module registration phase
*/
{
/* ssl_hook_ReadReq needs to use the BrowserMatch settings so must
* run after mod_setenvif's post_read_request hook. */
ssl_var_register(p);
}
ssl_config_perdir_create, /* create per-dir config structures */
ssl_config_perdir_merge, /* merge per-dir config structures */
ssl_config_server_create, /* create per-server config structures */
ssl_config_server_merge, /* merge per-server config structures */
ssl_config_cmds, /* table of configuration directives */
ssl_register_hooks /* register hooks */
};