1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317
|
/* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.
*/
/**
* @file http_ssl.h
* @brief SSL protocol handling
*
* @defgroup APACHE_CORE_PROTO SSL Protocol Handling
* @ingroup APACHE_CORE
* @{
*/
#ifndef APACHE_HTTP_SSL_H
#define APACHE_HTTP_SSL_H
#include "httpd.h"
#include "apr_portable.h"
#include "apr_mmap.h"
#ifdef __cplusplus
extern "C" {
#endif
struct ap_conf_vector_t;
/**
* This hook allows modules that manage SSL connection to register their
* inquiry function for checking if a connection is using SSL from them.
* @param c The current connection
* @return OK if the connection is using SSL, DECLINED if not.
* @ingroup hooks
*/
AP_DECLARE_HOOK(int,ssl_conn_is_ssl,(conn_rec *c))
/**
* Return != 0 iff the connection is encrypted with SSL.
* @param c the connection
*/
AP_DECLARE(int) ap_ssl_conn_is_ssl(conn_rec *c);
/**
* This hook declares a connection to be outgoing and the configuration that applies to it.
* This hook can be called several times in the lifetime of an outgoing connection, e.g.
* when it is re-used in different request contexts. It will at least be called after the
* connection was created and before the pre-connection hooks is invoked.
* All outgoing-connection hooks are run until one returns something other than DECLINE.
* if enable_ssl != 0, a hook that sets up SSL for the connection needs to return OK
* to prevent subsequent hooks from doing the same.
*
* @param c The connection on which requests/data are to be sent.
* @param dir_conf The directory configuration in which this connection is being used.
* @param enable_ssl If != 0, the SSL protocol should be enabled for this connection.
* @return DECLINED, OK when ssl was enabled
*/
AP_DECLARE_HOOK(int, ssl_bind_outgoing,
(conn_rec *c, struct ap_conf_vector_t *dir_conf, int enable_ssl))
/**
* Assures the connection is marked as outgoing and invokes the ssl_bind_outgoing hook.
* This may be called several times on an outgoing connection with varying dir_conf
* values. require_ssl is not allowed to change on the same connection.
*
* @param c The connection on which requests/data are to be sent.
* @param dir_conf The directory configuration in which this connection is being used.
* @param require_ssl != 0 iff this connection needs to be secured by SSL/TLS protocol.
* @return OK iff ssl was required and is enabled, DECLINED otherwise
*/
AP_DECLARE(int) ap_ssl_bind_outgoing(conn_rec *c, struct ap_conf_vector_t *dir_conf,
int require_ssl);
/**
* Return != 0 iff handlers/hooks for outgoing connections are registered.
*/
AP_DECLARE(int) ap_ssl_has_outgoing_handlers(void);
/**
* This hook allows modules to look up SSL related variables for a
* server/connection/request, depending on what they inquire. Some
* variables will only be available for a connection/request, for example.
* @param p The pool to allocate a returned value in, MUST be provided
* @param s The server to inquire a value for, maybe NULL
* @param c The current connection, maybe NULL
* @param r The current request, maybe NULL
* @param name The name of the variable to retrieve, MUST be provided
* @return value or the variable or NULL if not provided/available
* @ingroup hooks
*/
AP_DECLARE_HOOK(const char *,ssl_var_lookup,
(apr_pool_t *p, server_rec *s, conn_rec *c, request_rec *r, const char *name))
/**
* Lookup an SSL related variable for the server/connection/request or a global
* value when all those parameters are set to NULL. Pool and name must always be
* provided and the returned value (if not NULL) will be allocated from the pool.
* @param p The pool to allocate a returned value in, MUST be provided
* @param s The server to inquire a value for, maybe NULL
* @param c The current connection, maybe NULL
* @param r The current request, maybe NULL
* @param name The name of the variable to retrieve, MUST be provided
* @return value or the variable or NULL if not provided/available
*/
AP_DECLARE(const char *) ap_ssl_var_lookup(apr_pool_t *p, server_rec *s,
conn_rec *c, request_rec *r,
const char *name);
/**
* Register to provide certificate/key files for servers. Certificate files are
* expected to contain the certificate chain, beginning with the server's certificate,
* excluding the trust anchor, in PEM format.
* They must be accompanied by a private key file, also in PEM format.
*
* @param s the server certificates are collected for
* @param p the pool to use for allocations
* @param cert_files an array of const char* with the path to the certificate chain
* @param key_files an array of const char* with the path to the private key file
* @return OK if files were added, DECLINED if not, or other for error.
*/
AP_DECLARE_HOOK(int, ssl_add_cert_files, (server_rec *s, apr_pool_t *p,
apr_array_header_t *cert_files,
apr_array_header_t *key_files))
/**
* Collect certificate/key files from all providers registered. This includes
* providers registered at the global 'ssl_add_cert_files', as well as those
* installed in the OPTIONAL 'ssl_add_cert_files' hook as may be provided by
* ssl modules.
*
* @param s the server certificates are collected for
* @param p the pool to use for allocations
* @param cert_files an array of const char* with the path to the certificate chain
* @param key_files an array of const char* with the path to the private key file
*/
AP_DECLARE(apr_status_t) ap_ssl_add_cert_files(server_rec *s, apr_pool_t *p,
apr_array_header_t *cert_files,
apr_array_header_t *key_files);
/**
* Register to provide 'fallback' certificates in case no 'real' certificates
* have been configured/added by other providers. Modules using these certificates
* are encouraged to answer requests to this server with a 503 response code.
*
* @param s the server certificates are collected for
* @param p the pool to use for allocations
* @param cert_files an array of const char* with the path to the certificate chain
* @param key_files an array of const char* with the path to the private key file
* @return OK if files were added, DECLINED if not, or other for error.
*/
AP_DECLARE_HOOK(int, ssl_add_fallback_cert_files, (server_rec *s, apr_pool_t *p,
apr_array_header_t *cert_files,
apr_array_header_t *key_files))
/**
* Collect 'fallback' certificate/key files from all registered providers, either
* in the global 'ssl_add_fallback_cert_files' hook or the optional one of similar
* name as provided by mod_ssl and sorts.
* Certificates obtained this way are commonly self signed, temporary crutches.
* To be used to the time it takes to retrieve a 'read', trusted certificate.
* A module using fallbacks is encouraged to answer all requests with a 503.
*
* @param s the server certificates are collected for
* @param p the pool to use for allocations
* @param cert_files an array of const char* with the path to the certificate chain
* @param key_files an array of const char* with the path to the private key file
*/
AP_DECLARE(apr_status_t) ap_ssl_add_fallback_cert_files(server_rec *s, apr_pool_t *p,
apr_array_header_t *cert_files,
apr_array_header_t *key_files);
/**
* On TLS connections that do not relate to a configured virtual host
* allow modules to provide a certificate and key to be used on the connection.
*
* A Certificate PEM added must be accompanied by a private key PEM. The private
* key PEM may be given by a NULL pointer, in which case it is expected to be found in
* the certificate PEM string.
*/
AP_DECLARE_HOOK(int, ssl_answer_challenge, (conn_rec *c, const char *server_name,
const char **pcert_pem, const char **pkey_pem))
/**
* Returns != 0 iff the connection is a challenge to the server, for example
* as defined in RFC 8555 for the 'tls-alpn-01' domain verification, and needs
* a specific certificate as answer in the handshake.
*
* ALPN protocol negotiation via the hooks 'protocol_propose' and 'protocol_switch'
* need to have run before this call is made.
*
* Certificate PEMs added must be accompanied by a private key PEM. The private
* key PEM may be given by a NULL pointer, in which case it is expected to be found in
* the certificate PEM string.
*
* A certificate provided this way needs to replace any other certificates selected
* by configuration or 'ssl_add_cert_pems` on this connection.
*/
AP_DECLARE(int) ap_ssl_answer_challenge(conn_rec *c, const char *server_name,
const char **pcert_pem, const char **pkey_pem);
/**
* Setup optional functions for ssl related queries so that functions
* registered by old-style SSL module functions are interrogated by the
* the new ap_is_ssl() and friends. Installs own optional functions, so that
* old modules looking for these find one and get the correct results (shadowing).
*
* Needs to run in core's very early POST_CONFIG hook.
* Modules providing such functions register their own optionals during
* register_hooks(). Modules using such functions retrieve them often
* in their own post-config or in the even later retrieval hook. When shadowing
* other modules functions, core's early post-config is a good time.
* @param pool The pool to use for allocations
*/
AP_DECLARE(void) ap_setup_ssl_optional_fns(apr_pool_t *pool);
/**
* Providers of OCSP status responses register at this hook. Installed hooks returning OK
* are expected to provide later OCSP responses via a 'ap_ssl_ocsp_get_resp_hook'.
* @param s the server being configured
* @params p a memory pool to use
* @param id opaque data uniquely identifying the certificate, provided by caller
* @param pem PEM data of certificate first, followed by PEM of issuer cert
* @return OK iff stapling is being provided
*/
AP_DECLARE_HOOK(int, ssl_ocsp_prime_hook, (server_rec *s, apr_pool_t *p,
const char *id, apr_size_t id_len,
const char *pem))
/**
* Registering a certificate for Provisioning of OCSP responses. It is the caller's
* responsibility to provide a global (apache instance) unique id for the certificate
* that is then used later in retrieving the OCSP response.
* A certificate can be primed this way more than once, however the same identifier
* has to be provided each time (byte-wise same, not pointer same).
* The memory pointed to by `id` and `pem` is only valid for the duration of the call.
*
* @param s the server being configured
* @params p a memory pool to use
* @param id opaque data uniquely identifying the certificate, provided by caller
* @param pem PEM data of certificate first, followed by chain certs, at least the issuer
* @return APR_SUCCESS iff OCSP responses will be provided.
* APR_ENOENT when no provided was found or took responsibility.
*/
AP_DECLARE(apr_status_t) ap_ssl_ocsp_prime(server_rec *s, apr_pool_t *p,
const char *id, apr_size_t id_len,
const char *pem);
/**
* Callback to copy over the OCSP response data. If OCSP response data is not
* available, this will be called with NULL, 0 parameters!
*
* Memory allocation methods and lifetime of data will vary per module and
* SSL library used. The caller requesting OCSP data will need to make a copy
* for his own use.
* Any passed data may only be valid for the duration of the call.
*/
typedef void ap_ssl_ocsp_copy_resp(const unsigned char *der, apr_size_t der_len, void *userdata);
/**
* Asking for OCSP response DER data for a certificate formerly primed.
* @param s the (SNI selected) server of the connection
* @param c the connection
* @param id identifier for the certifate, as used in ocsp_stapling_prime()
* @param cb callback to invoke when response data is available
* @param userdata caller supplied data passed to callback
* @return OK iff response data has been provided, DECLINED otherwise
*/
AP_DECLARE_HOOK(int, ssl_ocsp_get_resp_hook,
(server_rec *s, conn_rec *c, const char *id, apr_size_t id_len,
ap_ssl_ocsp_copy_resp *cb, void *userdata))
/**
* Retrieve the OCSP response data for a previously primed certificate. The id needs
* to be byte-wise identical to the one used on priming. If the call return ARP_SUCCESS,
* the callback has been invoked with the OCSP response DER data.
* Otherwise, a different status code must be returned. Callers in SSL connection
* handshakes are encouraged to continue the handshake without OCSP data for
* server reliability. The decision to accept or reject a handshake with missing
* OCSP stapling data needs to be done by the client.
* For similar reasons, providers of responses might return seemingly expired ones
* if they were unable to refresh a response in time.
*
* The memory pointed to by `id` is only valid for the duration of the call.
* Also, the DER data passed to the callback is only valid for the duration
* of the call.
*
* @param s the (SNI selected) server of the connection
* @param c the connection
* @param id identifier for the certifate, as used in ocsp_stapling_prime()
* @param cb callback to invoke when response data is available
* @param userdata caller supplied data passed to callback
* @return APR_SUCCESS iff data has been provided
*/
AP_DECLARE(apr_status_t) ap_ssl_ocsp_get_resp(server_rec *s, conn_rec *c,
const char *id, apr_size_t id_len,
ap_ssl_ocsp_copy_resp *cb, void *userdata);
#ifdef __cplusplus
}
#endif
#endif /* !APACHE_HTTP_SSL_H */
/** @} */
|